补充资料2016-10-03:我混合了归纳-归纳和归纳-递归(这不是我第一次这样做!)。我为这个烂摊子道歉。我更新了答案以涵盖这两个方面。
我在Forsberg&Setzer的论文《归纳-归纳定义的有限公理化》中找到了解释。
归纳递归
归纳递归定义是一种定义A类型和B:A→Type类类型的类:A → T y p e以一种特殊的方式同时定义:
- A被定义为归纳类型。
- B通过对A的递归来定义。
- 重要的是,定义A可以使用B。
如果没有第三个要求,我们可以先定义A,然后分别B。
这是一个婴儿的例子。归纳定义A具有以下构造函数:
- a:A
- ℓ:(∑x:AB(x))→A
类型B的定义为
- B(a)=bool
- B(ℓ(x,f))=nat。
那么,A什么?首先我们有一个元素a:A.
因此,存在类型B(a)定义为bool。因此,我们可以形成两个新元素ℓ(a,false)
和ℓ(a,true)
在A。现在我们有B(ℓ(a,false))=B(ℓ(a,true))=nat,因此我们也可以为每个n:nat形成元素
ℓ(ℓ(a,false),n):A
和
ℓ(ℓ(a,true),n):A
我们可以继续这样下去。下一阶段将是由于
B(ℓ(ℓ(a,true),n))=nat
每m:nat都有一个元素
ℓ (ℓ (ℓ (a ,t r u e),n ),m ):A
和元素
ℓ (ℓ (ℓ (a ,f a l s e),n ),m ):A
我们可以继续。一点点思考表明,一个或多或少是自然数列表的两个副本,共享一个公共的空列表。我将其作为练习找出原因。
感应感应
归纳-归纳定义还定义了类型一个,同时定义了类型乙:甲→ Ť ÿ p ë:
- 一个归纳定义
- 乙是归纳定义的,它可以引用一个
- 至关重要的是, 一个可指乙。
重要的是要了解归纳递归和归纳感应之间的区别。在归纳递归中,我们通过提供形式为B (c(… ))= ⋯的方程来定义乙,
其中c(… )是A的构造函数。在感应感应定义我们定义乙通过用于形成的元件提供构造乙。B (c(… ))= ⋯
c(…)一个乙乙
让我们将前面的例子重新表述为感应归纳法。首先,我们有归纳式tpye 一个:
- 一:一
- ℓ :( ∑X :一B (x )) → A
乙系列类型由以下构造函数定义:
- Ť ř û:乙(一)
- F a l:B (a )
- 如果X :一和ÿ:B (x )则Z e r:B(ℓ(x,y))
- 如果X :一和ÿ:B (x )和ž:B (ℓ (x ,y))那么小号ü Ç(ž):B (ℓ (x ,y))。
如您所见,我们给出了生成乙元素的规则,这些规则等于说B (a )是布尔(等价)布尔,而B (ℓ (x ,y))是(同构)自然数。