J'expérimente des systèmes de type pur dans le cube lambda de Barendregt, en particulier avec le plus puissant, le Calcul des constructions. Ce système a des sortes *et BOX. Pour mémoire, j'utilise ci-dessous la syntaxe concrète de l' Morteoutil https://github.com/Gabriel439/Haskell-Morte-Library qui est proche du calcul lambda classique.
Je vois que nous pouvons émuler des types inductifs par une sorte de codage de type Church (alias isomorphisme Boehm-Berarducci pour les types de données algébriques). Pour un exemple simple, j'utilise type Bool = ∀(t : *) -> t -> t -> tavec les constructeurs True = λ(t : *) -> λ(x : t) -> λ(y : t) -> xet False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y.
Je vois que le type de fonctions au niveau du terme Bool -> Test isomorphe à des paires de type Product T Tavec une Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> tparamétricité modulo classique au moyen d'une fonction if : Bool -> λ(t : *) -> t -> t -> tqui est en fait l'identité.
Toutes les questions ci-dessous porteront sur les représentations des types dépendants Bool -> *.
Je peux diviser
D : Bool -> *en paire deD TrueetD False. Existe-t-il la manière canonique de créer àDnouveau? Je veux reproduire l'isomosphismeBool -> T = Product T Tpar un analogue de fonctionifau niveau du type mais je ne peux pas écrire cette fonction aussi simple qu'originalifcar nous ne pouvons pas passer des types dans des arguments comme des types.J'utilise une sorte de type inductif avec deux constucteurs pour résoudre la question (1). La description de haut niveau (style Agda) est le type suivant (utilisé à la place du niveau de type
if)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F Falseavec l'encodage suivant dans PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P boolMon encodage ci-dessus est-il correct?
Je peux écrire les constructeurs pour
BoolDepcomme ce code pourDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
mais je ne peux pas écrire la fonction inverse (ou toute fonction dans le sens inverse). C'est possible? Ou devrais-je utiliser une autre représentation pour BoolDepproduire un isomorphisme BoolDep T F True = T?