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 dataWrapper 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:
IsNatist ein Prädikat: einen Satz aus einem Begriff machen.nist eine Variable.Sist eine Funktion, die aus einer Variablen einen Term macht.Zist 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 KindSystem 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 modPonsFunktion 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 (?)
IsNatist nur ein Typ, also muss es ein Vorschlag sein. OK, ebenso IsNat nist es nur ein Typ, also muss es ein Satz sein. Ich muss 'auf meiner Ehre' sein, um nicht nin 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 nsagt / bezeugt: Außerdem ist der Einwohner von neiner bestimmten Art, auch bekannt als "Art" in der Logik. Dann gehe ich über einfach eingegebene λ-calc (?)
IsNatdass Sie keinen Satz aus einem Begriff machen, sondern einen Satz aus einem Satz .