Hier gibt es tatsächlich eine Subtilität, obwohl die Dinge bei der Typprüfung gut laufen. Ich werde das Problem hier aufschreiben, da es in vielen verwandten Threads auftaucht, und versuchen zu erklären, warum die Dinge gut funktionieren, wenn die Typprüfung in einer "standard" abhängigen Typentheorie durchgeführt wird (ich werde absichtlich vage sein, da diese Probleme ungeachtet dessen häufig auftreten):
Fakt 1: Wenn ist eine Ableitung von , dann gibt es eine Ableitung von für eine Art , und für jeden Subterm , dass eine Typ , ein Kontext und eine Ableitung von .DΓ⊢t:AD′Γ⊢A:ssu≤tBΔD′′Δ⊢u:B
Diese nette Tatsache ist etwas schwer zu beweisen und wird durch eine ziemlich böse Gegen-Tatsache ausgeglichen:
Fakt 2: Im Allgemeinen sind und keine Unterableitungen von !D′D′′ D
Dies hängt ein wenig von der genauen Formulierung Ihres Typsystems ab, aber die meisten in der Praxis implementierten "betrieblichen" Systeme erfüllen Fakt 2.
Dies bedeutet, dass Sie nicht "zu Unterbegriffen übergehen" können, wenn Sie durch Induktion über Ableitungen argumentieren, oder daraus schließen können, dass die induktive Aussage über die Art des Begriffs, über den Sie etwas beweisen möchten, wahr ist.
Diese Tatsache beißt Sie ziemlich hart, wenn Sie versuchen, scheinbar unschuldige Aussagen zu beweisen, z. B. dass Systeme mit typisierter Konvertierung denen mit untypisierter Konvertierung entsprechen.
Im Fall der Typinferenz können Sie jedoch einen simultanen Inferenzalgorithmus für Typ und Sortierung (den Typ des Typs) durch Induktion der Struktur des Begriffs angeben, der einen typgerichteten Algorithmus beinhalten kann, wie Andrej vorschlägt. Für einen gegebenen Term (und Kontext , Sie scheitern entweder oder finden so, dass und . Sie müssen die induktive Hypothese nicht verwenden, um letzteres zu finden Ableitung, und so vermeiden Sie insbesondere das oben erläuterte Problem.tΓA,sΓ⊢t:AΓ⊢A:s
Der entscheidende Fall (und der einzige Fall, der wirklich eine Konvertierung erfordert) ist die Anwendung:
infer(t u):
type_t, sort_t <- infer(t)
type_t' <- normalize(type_t)
type_u, sort_u <- infer(u)
type_u' <- normalize(type_u)
if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
return B, sort_t (or the appropriate sort)
else fail
Jeder Aufruf zur Normalisierung wurde zu gut typisierten Bedingungen durchgeführt, da dies die Invariante für infer
den Erfolg ist.
Übrigens hat Coq bei seiner Implementierung keine entscheidbare Typprüfung, da es den fix
Anweisungskörper normalisiert, bevor versucht wird, sie zu überprüfen.
Auf jeden Fall sind die Grenzen der normalen Formen gut typisierter Begriffe so astronomisch, dass der Entscheidbarkeitssatz an dieser Stelle sowieso meistens akademisch ist. In der Praxis führen Sie den Typprüfungsalgorithmus so lange aus, wie Sie Geduld haben, und versuchen eine andere Route, wenn diese bis dahin noch nicht abgeschlossen ist.