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:
Ein Typprüfungssystem kann in ein Typinferenzsystem umgewandelt werden, indem die Regeln linear gemacht und Einschränkungen hinzugefügt werden .
Ich werde die Anwendungsregel als Beispiel verwenden. Die Überprüfungsregel für abhängige Typen lautet:
& Ggr; ⊢ t : Π x : A . B.Γ Γ u : A.Γ Γ t u : B [ u / x ]
Um diese Regel zu linearisieren, müssen die beiden Vorkommen von , sodass wir Folgendes erhalten:EIN
Γ Γ t : Π x :EIN1. B.Γ Γ u :EIN2ΓΓ t u : B [ u / x ]
Das stimmt aber nicht mehr! Wir müssen die Einschränkung hinzufügen :EIN1≃EIN2
Γ Γ t : Π x :EIN1. B.Γ Γ u :EIN2Γ Γ t u : B [ u / x ] 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
Γ Γ t : C.Γ Γ u :EIN2Γ Γ t u : B [ u / x ] C.≃ Π x :EIN1. B , EIN1≃EIN2
Alternativ können Sie die vorherige Regel beibehalten und die Regel hinzufügen
Γ1, x : C.,Γ2⊢ x : A.C.≃ A.
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.