Barendregt'in lambda küpündeki saf tip sistemleri, özellikle en güçlü olanı olan İnşaat Analizini deniyorum. Bu sistemin çeşitleri *
ve BOX
. Sadece kayıt için, aşağıda klasik lambda hesabına yakın olan https://github.com/Gabriel439/Haskell-Morte-LibraryMorte
aracının somut sözdizimini kullanıyorum .
Endüktif türleri bir çeşit Kilise benzeri kodlamayla (cebirsel veri türleri için Boehm-Berarducci izomorfizmi olarak) taklit edebileceğimizi görüyorum. Basit bir örnek için tür Bool = ∀(t : *) -> t -> t -> t
yapıcıları True = λ(t : *) -> λ(x : t) -> λ(y : t) -> x
ile yazın False = λ(t : *) -> λ(x : t) -> λ(y : t) -> y
.
Terim düzeyindeki işlevlerin Bool -> T
türünün , aslında özdeş olan işlev aracılığıyla Product T T
klasik Product = λ(A : *) -> λ(B : *) -> ∀(t : *) -> (A -> B -> t) -> t
modulo parametrikliği olan tip çiftlerine izomorfik olduğunu görüyorum if : Bool -> λ(t : *) -> t -> t -> t
.
Aşağıdaki tüm sorular bağımlı türlerin temsili ile ilgili olacaktır Bool -> *
.
Ben ayırabilir
D : Bool -> *
çifti içineD True
veD False
.D
Tekrar yaratmanın kanonik yolu var mı? İzomosfizmi tür düzeyinde birBool -> T = Product T T
işlev analogu ile çoğaltmak istiyorumif
ancak bu işlevi orijinal kadar basit yazamıyorumif
çünkü türler gibi argümanlarda tür iletemiyoruz .Soruyu çözmek için iki türden bir tür endüktif tip kullanıyorum (1). Üst düzey açıklama (Agda stili) aşağıdaki türdür (tür düzeyi yerine kullanılır
if
)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F False
PTS / CoC'de aşağıdaki kodlamayla:
λ(T : *) -> λ(F : *) -> λ(bool : Bool ) -> ∀(P : Bool -> *) -> ∀(DepTrue : T -> P True ) -> ∀(DepFalse : F -> P False ) -> P bool
Yukarıdaki kodlamam doğru mu?
Ben
BoolDep
bu kod gibi için yapıcılar yazabilirsinizDepTrue : ∀(T : *) -> ∀(F : *) -> T -> BoolDep T F True
:λ(T : *) -> λ(F : *) -> λ(arg : T ) -> λ(P : Bool -> *) -> λ(DepTrue : T -> P True ) -> λ(DepFalse : F -> P False ) -> DepTrue arg
ancak ters fonksiyonu (veya ters yönde herhangi bir fonksiyonu) yazamıyorum. Mümkün mü? Yoksa BoolDep
bir izomorfizm üretmek için başka bir gösterim BoolDep T F True = T
mi kullanmalıyım?