Also versuche ich, mich um Curry-Howard zu kümmern. (Ich habe es mehrmals versucht, es ist einfach nicht gelierend / scheint zu abstrakt). Um etwas Konkretes anzugehen, arbeite ich an einigen Haskell-Tutorials, die von Wikipedia verlinkt sind, insbesondere von Tim Newsham . Es gibt auch eine nützliche Diskussion, wenn Newsham das Tutorial veröffentlicht.
(Aber ich werde die data
Wrapper von Newsham und Piponi ignorieren und über die zugrunde liegenden Typen sprechen.) Wir haben Hilberts Axiomschema (ausgedrückt als S , K- Kombinatoren); wir haben Sätze als Typen; Implikation als Funktionspfeil; und Modus Ponens als Funktionsanwendung:
axK :: p -> q -> p
axK = const
axS :: (p -> q -> r) -> (p -> q) -> p -> r
axS f g x = f x (g x)
modPons = ($); infixl 0 `modPons` -- infix Left, cp ($) is Right
Dann kann ich das Identitätsgesetz ableiten:
ident = axS `modPons` axK `modPons` axK -- (S K K)
-- ident :: p -> p -- inferred
Diese Typen als bloße Typevars zu haben, die lediglich Aussagen entsprechen, scheint eher einfallslos. Kann ich mehr vom Typsystem verwenden, um die Sätze tatsächlich zu konstruieren? Ich denke:
data IsNat n = IsNat !n -- [Note **]
data Z = Z
axNatZ :: IsNat Z
axNatZ = IsNat Z
data S n = S !n
axNatS :: IsNat n -> IsNat (S n)
axNatS (IsNat n) = IsNat (S n)
twoIsNat = axNatS `modPons` (axNatS `modPons` axNatZ)
-- ===> IsNat (S (S Z))
[Anmerkung **] Ich verwende strenge Konstruktoren gemäß dem Diskussionsthread, um die Einführung von _ | _ zu vermeiden .
Wo:
IsNat
ist ein Prädikat: einen Satz aus einem Begriff machen.n
ist eine Variable.S
ist eine Funktion, die aus einer Variablen einen Term macht.Z
ist eine Konstante (niladische Funktion).
Ich habe also eine eingebettete Prädikatenlogik (erster Ordnung) (?)
Ich schätze, dass meine Typen nicht sehr hygienisch sind; Ich könnte leicht einen Typevar-als-Satz mit einem Typevar-als-Begriff verwechseln. Vielleicht sollte ich das Kind
System verwenden, um sie zu trennen. OTOH, meine Axiome müssten spektakulär falsch sein, um zu einer Schlussfolgerung zu gelangen.
Ich habe nicht ausgedrückt:
- universeller Quantifizierer: Es ist implizit für die freien Vars;
- existentielle Quantität: In der Tat könnten Konstanten als skolemisierte Existentiale wirken;
- Gleichheit der Begriffe: Ich habe wiederholte Typevars in Implikationen verwendet;
- Beziehungen: Das scheint zu funktionieren, oder ist es Verwirrung? ...
data PlusNat n m l = PlusNat !n !m !l
axPlusNatZ :: IsNat m -> PlusNat Z m m
axPlusNatZ (IsNat m) = PlusNat Z m m
axPlusNatS :: PlusNat n m l -> PlusNat (S n) m (S l)
axPlusNatS (PlusNat n m l) = PlusNat (S n) m (S l)
plus123 = axPlusNatS `modPons`
(axPlusNatZ `modPons`
(axNatS `modPons` (axNatS `modPons` axNatZ)) )
-- ===> PlusNat (S Z) (S (S Z)) (S (S (S Z)))
Das Schreiben der Axiome ist einfach, mit freundlicher Genehmigung von Wadlers Theorems for Free! . Die Beweise zu schreiben ist harte Arbeit. (Ich werde die modPons
Funktion fallen lassen und nur die Funktionsanwendung verwenden.)
Erreicht dies tatsächlich eine Logik? Oder ist es verrücktes Zeug? Soll ich aufhören, bevor ich meinem Gehirn mehr Schaden zufüge?
Sie sollten abhängige Typen benötigen, um FOPL in Curry-Howard auszudrücken. Aber ich scheine das nicht zu tun (?)
IsNat
ist nur ein Typ, also muss es ein Vorschlag sein. OK, ebenso IsNat n
ist es nur ein Typ, also muss es ein Satz sein. Ich muss 'auf meiner Ehre' sein, um nicht n
in das Proposition-Land entkommen zu lassen / als Argument für einen logischen Zusammenhang erscheinen zu lassen (weshalb ich über Typhygiene gesprochen habe). Wären Sie glücklicher, wenn ich die Kirchencodierung für Nats verwenden würde? Ich glaube, ich erweitere λ-calc nur mit Konstruktoren auf
n
ist ein Satz : es sagt : ‚Ich bin bewohnt‘. Was nicht mehr ist, als jeder Typevar unter CH sagt. IsNat n
sagt / bezeugt: Außerdem ist der Einwohner von n
einer bestimmten Art, auch bekannt als "Art" in der Logik. Dann gehe ich über einfach eingegebene λ-calc (?)
IsNat
dass Sie keinen Satz aus einem Begriff machen, sondern einen Satz aus einem Satz .