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 MorteTools 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 -> tmit den Konstruktoren True = λ(t : *) -> λ(x : t) -> λ(y : t) -> xund False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y.
Ich sehe, dass der Typ der Funktionen auf Bool -> TTermebene zu Typpaaren Product T Tmit klassischer Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> tModulo-Parametrizität mittels einer Funktion, if : Bool -> λ(t : *) -> t -> t -> tdie 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 Trueund aufteilenD False. Gibt es den kanonischen Weg,Dwieder zu schaffen ? Ich möchte den IsomosphismusBool -> T = Product T Tdurch ein Analogon der Funktionifauf Typebene reproduzieren, aber ich kann diese Funktion nicht so einfach wie das Original schreiben,ifda 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 Falsemit der folgenden Codierung in PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P boolIst meine obige Kodierung korrekt?
Ich kann die Konstruktoren für
BoolDepdiesen 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?