Я експериментую з системами чистого типу в лямбда-кубі Барендрегта, конкретно з найбільш потужним, «Калькуляцією конструкцій». Ця система має різновиди *та BOX. Тільки для запису, я нижче використовую конкретний синтаксис Morteінструменту https://github.com/Gabriel439/Haskell-Morte-Library, який близький до класичного обчислення лямбда.
Я бачу, що ми можемо імітувати індуктивні типи за допомогою якогось кодовського кодування (так само ізоморфізм Боема-Берардуччі для алгебраїчних типів даних). Для простого прикладу я використовую type 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) я використовую індуктивний тип з двома конвекторами. Опис високого рівня (стиль Агда) є наступним типом (використовується замість рівня типу
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?