補足2016-10-03:帰納-帰納と帰納-再帰を混同しました(初めてではありませんでした!)。混乱の私の謝罪。両方をカバーするように答えを更新しました。
その説明は、Forsberg&Setzerの論文「帰納的帰納的定義の有限公理」にあります。
帰納再帰
帰納的再帰定義は、タイプとタイプファミリーを定義するものです特別な方法で同時に定義します。AB:A→Type
- Aは誘導型として定義されます。
- Bは再帰によって定義されます。A
- 重要なのは、の定義で使用ことです。AB
3番目の要件がない場合、最初にを定義し、次に個別に定義できます。AB
これが赤ちゃんの例です。次のコンストラクターを持つように帰納的に定義します。A
- a:A
- ℓ:(∑x:AB(x))→A
タイプファミリーは、B
- B(a)=bool
- B(ℓ(x,f))=nat。
それで、は何がありますか?まず、要素そのため、として定義されている型あります。したがって、我々は、2つの新しい要素を形成することができるおよびにおける。これで、が得られたので、すべてのについても形成できます要素
と
このように続けることができます。次の段階は、
Aa:A.
B(a)boolℓ(a,false)
ℓ(a,true)
AB(ℓ(a,false))=B(ℓ(a,true))=natn:natℓ(ℓ(a,false),n):A
ℓ(ℓ(a,true),n):A
B(ℓ(ℓ(a,true),n))=nat
ごとに存在します要素
と要素
続行できます。少し考えてみると、は自然数のリストの多かれ少なかれ2つのコピーであり、共通の空のリストを共有しています。その理由を理解するための演習として残しておきます。m:natℓ(ℓ(ℓ(a,true),n),m):A
ℓ(ℓ(ℓ(a,false),n),m):A
A
誘導誘導
帰納的帰納的定義は、タイプとタイプファミリー同時に定義し:AB:A→Type
- Aは帰納的に定義されます
- Bは帰納的に定義され、参照する場合がありますA
- 重要なのは、 が参照することです。AB
帰納再帰と帰納帰納の違いを理解することが重要です。帰納的再帰では、という形式の方程式を提供して
を定義します。
ここで、はコンストラクターです。誘導誘導定義では、定義元素形成するためのコンストラクタを提供することによって。BB(c(…))=⋯
c(…)ABB
前の例を帰納法として再定式化しましょう。最初に、帰納的に与えられたtpyeます:A
- a:A
- ℓ:(∑x:AB(x))→A
タイプファミリーは、次のコンストラクターによって定義されます。B
- Tru:B(a)
- Fal:B(a)
- もし及び、次にx:Ay:B(x)Zer:B(ℓ(x,y))
- if and and then。x:Ay:B(x)z:B(ℓ(x,y))Suc(z):B(ℓ(x,y))
ご覧のとおり、はブール値に(等値)であり、は自然数に(同型あるというの要素を生成するためのルールを提供しました。BB(a)B(ℓ(x,y))