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 pred
empfä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 Id
die 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 Equals
und Refl
sind 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 ? : Nat
und Nat
ist ein Typ, den wir aufzählen können, so dass wir einfach alles versuchen können, Nats
bis 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 7
es 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?