私は、Barendregtのラムダキューブの純粋な型システム、特に最も強力なものである構築の計算を実験しています。このシステムにはソート*とがありBOXます。記録のために、以下では、古典的なラムダ計算に近いMorteツールhttps://github.com/Gabriel439/Haskell-Morte-Libraryの具体的な構文を使用しています。
ある種の教会のようなエンコーディング(別名、代数的データ型のBoehm-Berarducci同型)によって帰納型をエミュレートできると思います。簡単な例としてBool = ∀(t : *) -> t -> t -> t、コンストラクタTrue = λ(t : *) -> λ(x : t) -> λ(y : t) -> xとでtypeを使用します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ような引数に種類を渡すことができないため、この関数を元のように単純に書くことはできません。question(1)を解決するために、2つのコンストラクターを持つ一種の帰納的タイプを使用します。高レベルの説明(Agdaスタイル)は次のタイプです(type-levelの代わりに使用されます
if)data BoolDep (T : *) (F : *) : Bool -> * where DepTrue : T -> BoolDep T F True DepFalse : F -> BoolDep T F FalsePTS / 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か?