私は、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 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
か?