Ich bin in einer Situation, in der ich zeigen muss, dass Typchecking für einen abhängig typisierten Kalkül, an dem ich arbeite, entscheidend ist. Bisher konnte ich beweisen, dass sich das System stark normalisiert und somit die definitive Gleichheit entscheidbar ist.
In vielen Referenzen, die ich lese, wird die Entscheidbarkeit der Typüberprüfung als Folge einer starken Normalisierung aufgeführt, und ich glaube es in diesen Fällen, aber ich frage mich, wie man dies tatsächlich zeigt.
Insbesondere bin ich auf Folgendes fixiert:
- Nur weil sich gut typisierte Begriffe stark normalisieren, bedeutet dies nicht, dass der Algorithmus bei nicht gut typisierten Eingaben nicht für immer wiederholt wird
- Da logische Beziehungen normalerweise verwendet werden, um eine starke Normalisierung anzuzeigen, gibt es keine bequeme abnehmende Metrik, wenn wir die Typüberprüfungsbegriffe weiterentwickeln. Selbst wenn meine Typregeln syntaxgesteuert sind, gibt es keine Garantie dafür, dass die Anwendung der Regeln irgendwann beendet wird.
Ich frage mich, hat jemand einen guten Hinweis auf einen Beweis für die Entscheidbarkeit der Typprüfung für eine abhängig getippte Sprache? Wenn es sich um einen kleinen Kernkalkül handelt, ist das in Ordnung. Alles, was über Beweistechniken zum Nachweis der Entscheidbarkeit spricht, wäre großartig.
quelle
Antworten:
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:A D′ Γ⊢A:s s u≤t B Δ 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:
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.
quelle
infer(t u):
; Um es zu finden, suchen Sie nach "tCheck r (App f a) =
". Für eine vollständigere, aber dennoch einfache Implementierung können Sie Morte'stypeWith
überprüfen .