Bei abhängigen Typen wird die Miller-Mustervereinigung verwendet, um ein entscheidbares Fragment einer Vereinigung höherer Ordnung zu lösen. Dadurch können abhängig typisierte Sprachen Metavariablen oder implizite Argumente enthalten.
Es gibt viele Artikel, die beschreiben, wie man angesichts eines Vereinigungsproblems im Musterfragment eine Lösung findet, wenn es eine gibt. Beispiele sind (Gundry-McBride) , (Abel-Pientka) und das Originalpapier von Miller .
Ich frage mich, wie man bei einem abhängig typisierten Programm, das Metavariablen (oder implizite Argumente) enthält, die Probleme generiert, die an den Unification Solver übergeben werden.
Antworten:
Es gibt eine nette Redewendung, die in Kapitel 22 von Typen und Programmiersprachen näher erläutert wird (sie wird eher für Polymorphismus als für abhängige Typen verwendet, aber die Idee ist dieselbe). Die Redewendung lautet wie folgt:
Ich werde die Anwendungsregel als Beispiel verwenden. Die Überprüfungsregel für abhängige Typen lautet:
Um diese Regel zu linearisieren, müssen die beiden Vorkommen von , sodass wir Folgendes erhalten:EIN
Das stimmt aber nicht mehr! Wir müssen die Einschränkung hinzufügen :EIN1≃EIN2
Beachten Sie, dass wie bei der Konvertierungsregel das Äquivalenzmodul für Ihre Konvertierungsbeziehung ( normalerweise ) bezeichnet, es sich jedoch jetzt um eine Vereinigungsbeschränkung handelt , da Ihre Begriffe möglicherweise Metavariablen enthalten.≃ βη
Bei der Typprüfung werden solche Einschränkungen akkumuliert, um sie möglicherweise alle am Ende (oder aus Effizienzgründen früher) auf einmal zu lösen.
Jetzt kann es schwieriger werden, weil der Typ von selbst im Kontext eine Metavariable sein kann! Eine allgemeinere Regel wäre dahert
Alternativ können Sie die vorherige Regel beibehalten und die Regel hinzufügen
zur variablen Suchzeit.
Eine weitere nützliche Bemerkung ist, dass im Überprüfungssystem die Konvertierungsregel nur unmittelbar vor den Anwendungen und möglicherweise einmal ganz am Ende der Ableitung angewendet werden muss. Da diese Regeln einer Vereinigungsbeschränkung im Inferenzsystem entsprechen, erfahren Sie hier, wo die Einschränkungen platziert werden sollen.
quelle
Wenn Sie die Lambda-Terme über deBruijn-Indizes und die Metavariablen über Prolog-Variablen modellieren, können Sie einen Prolog-Constraint-Solver erstellen. Hier ist ein Beispiel, das bereits recht gut funktioniert. Folgende grundlegende Einschränkungen wurden verwendet:
% shift (+ Indiziert, + Nat, + Nat, -Indexiert)
% subst (+ Indiziert, + Nat, + Indiziert, -Indexiert)
% reduzieren (+ Indiziert, + Indiziert, -Indexiert)
https: //gist.github. com / jburse / 0ccd12698bfa24ce5c36 # file-implicit2-p
Die gesamte Maschinerie geht auch davon aus, dass wir nach normalen Formen streben, indem wir das Beta in einer bestimmten Reihenfolge reduzieren. Es gibt eine Interaktion zwischen dem Normalisierer und der Art und Weise, wie die oben genannten neuen Einschränkungen generiert werden. Da die Reduzierung eines Redex möglicherweise eine Neubewertung der Normalisierung erforderlich macht.
Der Constraint-Solver implementiert bereits einige vereinfachungsübergreifende Vereinfachungen. Ohne diese Vereinfachungen und nur die Constraint-Verzögerung wäre der Constraint-Solver zu dumm und praktisch nicht verwendbar. Wir planen noch ein oder zwei weitere Vereinfachungen. Eine Fundgrube für Vereinfachungen ist das folgende Papier:
Resttheorie im λ-Kalkül
Eine formale Entwicklung, Gerard Huet, 1998
http://pauillac.inria.fr/~huet/PUBLIC/residuals.pdf
In der Arbeit findet man auch die ursprünglichen induktiven Definitionen der von uns verwendeten Einschränkungen. Siehe folgende Abschnitte:
2.2 Heben
2.3 Substitution
3.1 Einstufige β-Reduktion
Warnung: Die deBruijn-Begriffe helfen uns bei der Gleichheit der normalen Begriffe. Wir benötigen keinen Schritt für die Alfa-Konvertierung. Wir verwenden jedoch einen nicht abgestuften abhängigen Typ, sodass beispielsweise unter der Haube kein Unterschied zwischen Typen und Arten besteht. Dies macht das ganze Unternehmen besonders einfach, andererseits ist dies nicht Standard.
Tschüss
quelle