Gibt es einen allgemeinen Algorithmus zum Füllen von Löchern im Hinblick auf die Konstruktionsrechnung?

9

Angenommen, Sie erweitern die Konstruktionsrechnung um "Löcher", dh um unvollständige Codeteile, die Sie noch nicht ausgefüllt haben. Ich frage mich, ob es einen Algorithmus gibt, mit dem diese Rollen automatisch besetzt werden können. Zum Beispiel (unter Verwendung der Morte -Syntax):

Fall A:

λ (pred : ?) 
-> λ (Nat : *) 
-> λ (Succ : Nat -> Nat) 
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))

Auf dieser Situation kann ein Typ Inferenzalgorithmus erkennen , dass ?offensichtlich nur sein kann ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Nat, weil predempfängt Nat : *, Succ : Nat -> Nat, Zero : Nat, und zurückgeben muss Nat, weil es das erste Argument ist Succ.

Fall B:

(Id ? 4)

Wobei 4 λ-codiert ist und Iddie Identitätsfunktion (dh ∀ (t:*) -> λ (x:t) -> x) ist. In dieser Situation ist ´? ´ wieder klar ∀ (N:*) -> (N -> N) -> N -> N, denn das ist die Art von 4.

Fall C:

(Id (Equals Nat 7 (add 3 ?)) (Refl 7))

Hier Equalsund Reflsind in ähnlicher Weise wie Idris definiert. ?kann natürlich nur sein 4, aber wie findest du das heraus? Ein Weg wäre, die Tatsache zu nutzen, dass ? : Natund Natist ein Typ, den wir aufzählen können, so dass wir einfach alles versuchen können, Natsbis es typechecks. Dies kann für jeden aufzählbaren Typ durchgeführt werden.

Fall D:

(Id (Equal Nat 10 (MulPair ?)) 10)

Hier ?kann nur vom Typ sein Pair Nat; es hat nur mehr als eine gültige Antwort, aber: es sein kann (Pair 10 1), (Pair 2 5), (Pair 5 2)und (Pair 1 10).

Fall E:

(Id (Equal Nat 7 (Mul 2 ?)) 7)

Hier gibt es keine gültige Antwort, da 7es sich nicht um ein Vielfaches von handelt 2.


All diese Beispiele haben mich darauf aufmerksam gemacht, dass wir einen allgemeinen Algorithmus erstellen können, der einige bekannte Muster identifiziert und eine Antwort gibt, indem wir einen bestimmten Algorithmus (Typinferenz, Brute-Force usw.) von Hand auswählen, ähnlich wie Wolfram Alpha die richtige Strategie herausfindet ein Integral lösen. Aber das klingt nach einem Engineering / Hardcoded-Ansatz. Gibt es einen prinzipiellen Weg, um dieses Problem zu lösen? Gibt es eine Forschungsstudie / einen Forschungsbereich?

MaiaVictor
quelle

Antworten:

9

Es gibt sicherlich viel Forschung zu diesem Problem! Es wird oft als Ausarbeitung bezeichnet . Es ist im Allgemeinen ein unentscheidbares Problem, wie Sie vielleicht vermutet haben. Die "Löcher" werden oft als Metavariablen oder Vereinigungsvariablen bezeichnet .

Wie ich in dieser Antwort ein wenig erläutere , reduziert sich das Problem auf eine Vereinigung höherer Ordnung , über die mehrere Personen ganze Dissertationen geschrieben haben.

Wie Sie in Ihren Beispielen bemerken, sind einige Fälle etwas einfach und können durch die Anwendung einfacher Regeln gelöst werden, während andere wesentlich schwieriger erscheinen und eher ein "Theorembeweis" -Gefühl haben.

Ein dritter möglicher Fall ist ein Problem vom Typ "Typklasse", bei dem ?eine Art Struktur wie eine Gruppen- oder Feldstruktur wie in dargestellt wird

mul ? 2 3

mit mul : forall G:Group, G.carrier -> G.carrier -> G.carrieroder einer Variante. Hier müssen wir eine Gsolche finden G.carrier == nat.

Im Allgemeinen möchten Sie 3 verschiedene "Regime" für jede Art von Problem haben, die Probleme der einfachen Vereinheitlichung, des Theorembeweises und der Typklassenauflösung.

Wir erklären dies ein wenig im folgenden Artikel:

Ausarbeitung in der Theorie abhängiger Typen , de Moura, Avigad, Kong & Roux.

Weitere Informationen finden Sie in den Referenzen dieses Dokuments.


Ich habe einen starken Magen, hier ist die Open-Source für die Ausarbeitung in Lean.

Hier ist ein Wiki-Beitrag, der die Schnittstelle zum Entwickler in Idris beschreibt.

Cody
quelle
Das sind die Worte, die ich hören wollte! Vielen Dank für all diese Links, Referenzen und Schlüsselwörter. Sie haben mir jetzt viel zu tun gegeben. Gibt es Tools, mit denen ich heute Morte-Programme abschließen kann? Natürlich nicht unbedingt Morte, aber etwas, das nah genug ist, um Morte-Programme zu extrahieren.
MaiaVictor
1
Jeder Theorembeweiser und Typprüfer für ein abhängig typisiertes System (Idris, Agda, Coq, Lean) hat einen solchen Löser tief im Bauch. Sie sind jedoch in der Regel sehr programmspezifisch, daher bin ich nicht optimistisch, dass Sie sie ohne große Änderungen für Ihre eigenen Zwecke verwenden können.
Cody