Я экспериментирую с системами чистого типа в лямбда-кубе Барендрегта, особенно с наиболее мощным, исчислением конструкций. Эта система имеет сорта *и BOX. Для справки ниже я использую конкретный синтаксис Morteинструмента https://github.com/Gabriel439/Haskell-Morte-Library, который близок к классическому лямбда-исчислению.
Я вижу, что мы можем эмулировать индуктивные типы с помощью некоторого церковно-подобного кодирования (так называемый изоморфизм Бёма-Берардуччи для алгебраических типов данных). Для простого примера я использую тип Bool = ∀(t : *) -> t -> t -> tс конструкторами True = λ(t : *) -> λ(x : t) -> λ(y : t) -> xи False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y.
Я вижу, что тип функций уровня членов Bool -> Tизоморфен парам типа Product T Tс классической Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> tпо модулю параметричности посредством функции, if : Bool -> λ(t : *) -> t -> t -> tкоторая фактически тождественна.
Все вопросы ниже будут о представлениях зависимых типов Bool -> *.
Я могу разделить
D : Bool -> *на паруD TrueиD False. Есть ли канонический способ создатьDзаново? Я хочу воспроизвести изоморфизмBool -> T = Product T Tс помощью аналога функцииifна уровне типа, но я не могу написать эту функцию так же просто, как оригинал,ifпотому что мы не можем передавать виды в аргументах, таких как типы.Я использую своего рода индуктивный тип с двумя конструкторами для решения вопроса (1). Описание высокого уровня (стиль Agda) - это следующий тип (используется вместо уровня типа
if)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F Falseсо следующей кодировкой в PTS / CoC:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P boolПравильна ли моя кодировка выше?
Я могу записать конструкторы для
BoolDepэтого кода дляDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
но я не могу записать обратную функцию (или любую функцию в обратном направлении). Является ли это возможным? Или я должен использовать другое представление для BoolDepсоздания изоморфизма BoolDep T F True = T?