Die folgende Frage bezieht sich auf Recursive algebraic data types via polymorphism in Haskell.Was sind die Werte eines polymorph codierten rekursiven algebraischen Datentyps?
Rekursive algebraische Datentypen können in jeder Sprache mit den Fähigkeiten von System F unter Verwendung des universellen parametrischen Polymorphismus realisiert werden. Beispielsweise kann die Art der natürlichen Zahlen eingeführt werden (in Haskell) als
newtype Nat = Nat { runNat :: forall t. (t -> (t -> t) -> t) }
mit der ‚üblichen‘ natürlichen Zahl ist, wie n
\ x0 f -> f(f(...(f x0)...))
mit n
Iterationen f
verwendet.
In ähnlicher Weise kann die Art der Boolesche Werte als
newtype Bool = Bool { runBool :: forall t. t -> t -> t }
mit den erwarteten Werten eingeführt werden, wahr 'und ‚falsch‘ realisiert als
true = \ t f -> t
false = \ t f -> f
Q: Sind alle Bedingungen von Geben Sie Bool
oder Nat
oder einen anderen potenziell rekursiven algebraischen Datentyp (auf diese Weise codiert) des obigen Formulars ein, bis hin zu einigen Reduktionsregeln der operativen Semantik?
Beispiel 1 (natürliche Zahlen): Ist eine Bedingung vom Typ forall t. t -> (t -> t) -> t
'gleichwertig' in gewissem Sinne mit einem Term der Form \ x0 f -> f (f (... (f x0) ...))
?
Beispiel 2 (Boolesche): Ist eine Bedingung vom Typ forall t. t -> t -> t
'gleichwertig' in gewissem Sinne entweder \ t f -> t
oder \ t f -> f
?
Addendum (interne Version): Falls die Sprache unter Berücksichtigung auch propositionaler Gleichheit auszudrücken fähig ist, diese Meta-mathematische Frage internalisiert werden könnte wie folgt, und ich wäre sehr glücklich, wenn jemand mit kommen würde, eine Lösung dafür: wie folgt
für Funktors m
können wir das Universalmodul und eine Dekodierungs-Codierungsfunktion auf sie definieren:
type ModStr m t = m t -> t
UnivMod m = UnivMod { univProp :: forall t. (ModStr m t) -> t }
classifyingMap :: forall m. forall t. (ModStr m t) -> (UnivMod m -> t)
classifyingMap f = \ x -> (univProp x) f
univModStr :: (Functor m) => ModStr m (UnivMod m)
univModStr = \ f -> UnivMod $ \ g -> g (fmap (classifyingMap g) f)
dec_enc :: (Functor m) => UnivMod m -> UnivMod m
dec_enc x = (univProp x) univModStr
Q : Falls die Sprache dies ausdrücken kann: ist der Gleichheitstyp dec_enc = id
bewohnt?
Lieber Peter, vielen Dank für Ihre Antwort und Entschuldigung für die lange Zeit, die ich brauchte, um zu antworten! Haben Sie polymorphe Abstraktion und Anwendung aus Ihren Begriffen weggelassen? Es scheint mir, dass man normale Formen mit den führenden Abstraktionen in Betracht ziehen muss, die möglicherweise zwischen Terme und Typabstraktion wechseln, sowie Anwendungsterme wie "(y P1 ... Pk) [T]" innerhalb dieser Abstraktionen. Dies scheint jedoch keine ernsthaften Komplikationen in Ihrer Argumentation zu verursachen. – Hanno
@Hanno Meine Antwort wird für die Curry-Version von System-F gegeben, die keine Typ Anmerkungen oder Λ in Begriffen hat. Aber ich glaube, dass das gleiche Argument auch für den Kirchenstil verwendet werden kann. Ich würde auch [diese Antwort] empfehlen (http://math.stackexchange.com/a/856347/37490), die völlig anderen Beweis gibt - es zeigt nicht, dass es nur 2 Begriffe in normaler Form gibt, aber es zeigt dass alle Terme des booleschen Typs [extensional gleich] (https://en.wikipedia.org/wiki/Extensional_equality) zu "K" und "K *" sind. –
Okay, danke! Ich stolperte jedoch über einen Satz im CoQ'Art-Buch (S. XII im Vorwort), der mich verwirrt: Bezüglich der polymorphen Kodierung rekursiver Typen heißt es: "... sie [Christine Mohring] erkannte, dass die Impredicative 'Kodierungen, die sie verwendete, respektierten nicht die Tradition, wo die Begriffe eines induktiven Typs auf Zusammensetzungen der Typkonstrukteure beschränkt sind. Kodierungen in der polymorphen Lambda-Kalkül eingeführt parasitrische Ausdrücke und machte es unmöglich, die entsprechenden Induktionsprinzipien auszudrücken. Weißt du, wie das zu deiner Antwort passt? – Hanno