Я експериментую з системами чистого типу в лямбда-кубі Барендрегта, конкретно з найбільш потужним, «Калькуляцією конструкцій». Ця система має різновиди *
та 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
?