Ich experimentiere mit reinen Typsystemen in Barendregts Lambda-Würfel, speziell mit dem mächtigsten, dem Calculus of Constructions. Dieses System hat Sorten *
und BOX
. Nur zur Veranschaulichung: Im Folgenden verwende ich die konkrete Syntax des Morte
Tools https://github.com/Gabriel439/Haskell-Morte-Library, das dem klassischen Lambda-Kalkül nahe kommt.
Ich sehe, wir können induktive Typen durch eine Art kirchenähnliche Codierung emulieren (auch bekannt als Boehm-Berarducci-Isomorphismus für algebraische Datentypen). Für ein einfaches Beispiel verwende ich type Bool = ∀(t : *) -> t -> t -> t
mit den Konstruktoren True = λ(t : *) -> λ(x : t) -> λ(y : t) -> x
und False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y
.
Ich sehe, dass der Typ der Funktionen auf Bool -> T
Termebene zu Typpaaren Product T T
mit klassischer Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> t
Modulo-Parametrizität mittels einer Funktion, if : Bool -> λ(t : *) -> t -> t -> t
die tatsächlich Identität ist, isomorph ist.
Alle folgenden Fragen beziehen sich auf Darstellungen abhängiger Typen Bool -> *
.
Ich kann mich
D : Bool -> *
in ein Paar vonD True
und aufteilenD False
. Gibt es den kanonischen Weg,D
wieder zu schaffen ? Ich möchte den IsomosphismusBool -> T = Product T T
durch ein Analogon der Funktionif
auf Typebene reproduzieren, aber ich kann diese Funktion nicht so einfach wie das Original schreiben,if
da wir keine Arten in Argumenten wie Typen übergeben können.Ich benutze eine Art induktiven Typ mit zwei Konstruktoren, um Frage (1) zu lösen. Die Beschreibung auf hoher Ebene (Agda-Stil) ist der folgende Typ (anstelle von Typ-Ebene verwendet
if
)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F False
mit der folgenden Codierung in PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P bool
Ist meine obige Kodierung korrekt?
Ich kann die Konstruktoren für
BoolDep
diesen Code aufschreiben fürDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True
:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
aber ich kann die Umkehrfunktion (oder irgendeine Funktion in der Umkehrrichtung) nicht aufschreiben. Ist es möglich? Oder sollte ich eine andere Darstellung verwenden BoolDep
, um einen Isomorphismus zu erzeugen BoolDep T F True = T
?