什么是感应感应?


11

什么是感应感应?

我发现的资源是:

前两个参考资料对我来说太简短了,后两个参考文献太技术性了。有人能用外行的术语解释吗?如果有Agda代码,那就更好了。


您的第四次引用中有Agda代码。
— 吉尔(Gilles)'所以

当然可以,但是要阅读那么多的代码将非常困难。而且(我想)仅通过查看1或2个示例就可以轻松完成。
— 盛安安

Answers:


13

补充资料2016-10-03:我混合了归纳-归纳和归纳-递归(这不是我第一次这样做!)。我为这个烂摊子道歉。我更新了答案以涵盖这两个方面。

我在Forsberg&Setzer的论文《归纳-归纳定义的有限公理化》中找到了解释。

归纳递归

归纳递归定义是一种定义A类型和乙:一个→ŤÿpË类类型的类:A → T y p e以一种特殊的方式同时定义:

  1. 一个被定义为归纳类型。
  2. 乙通过对一个的递归来定义。
  3. 重要的是,定义一个可以使用乙。

如果没有第三个要求,我们可以先定义一个,然后分别乙。

这是一个婴儿的例子。归纳定义一个具有以下构造函数:

  • 一个:一个
  • ℓ:(∑X:一个乙(X))→一个

类型乙的定义为

  • 乙(一个)=bØØ升
  • 乙(ℓ(X,F))=ñ一个Ť。

那么,一个什么?首先我们有一个元素

一个:一个。
因此,存在类型乙(一个)定义为bØØ升。因此,我们可以形成两个新元素
ℓ(一个,F一个升sË)
和
ℓ(一个,Ť[RüË)
在一个。现在我们有乙(ℓ(一个,F一个升sË))=乙(ℓ(一个,Ť[RüË))=ñ一个Ť,因此我们也可以为每个ñ:ñ一个Ť形成元素
ℓ(ℓ(一个,F一个升sË),ñ):一个
和
ℓ(ℓ(一个,Ť[RüË),ñ):一个
我们可以继续这样下去。下一阶段将是由于
乙(ℓ(ℓ(一个,Ť[RüË),ñ))=ñ一个Ť
每米:ñ一个Ť都有一个元素
ℓ(ℓ(ℓ(一个,Ť[RüË),ñ),米):一个
和元素
ℓ(ℓ(ℓ(一个,F一个升sË),ñ),米):一个
我们可以继续。一点点思考表明,一个或多或少是自然数列表的两个副本,共享一个公共的空列表。我将其作为练习找出原因。

感应感应

归纳-归纳定义还定义了类型一个,同时定义了类型乙:一个→ŤÿpË:

  1. 一个归纳定义
  2. 乙是归纳定义的,它可以引用一个
  3. 至关重要的是, 一个可指乙。

重要的是要了解归纳递归和归纳感应之间的区别。在归纳递归中,我们通过提供形式为B (c(… ))= ⋯的方程来定义乙, 其中c(… )是A的构造函数。在感应感应定义我们定义乙通过用于形成的元件提供构造乙。

乙(C(…))=⋯
C(…)一个乙乙

让我们将前面的例子重新表述为感应归纳法。首先,我们有归纳式tpye 一个:

  • 一个:一个
  • ℓ:(∑X:一个乙(X))→一个

乙系列类型由以下构造函数定义:

  • Ť[Rü:乙(一个)
  • F一个升:乙(一个)
  • 如果X:一个和ÿ:乙(X)则žË[R:乙(ℓ(X,ÿ))
  • 如果X:一个和ÿ:乙(X)和ž:乙(ℓ(X,ÿ))那么小号üC(ž):乙(ℓ(X,ÿ))。

如您所见,我们给出了生成乙元素的规则,这些规则等于说乙(一个)是布尔(等价)布尔,而乙(ℓ(X,ÿ))是(同构)自然数。


为什么有人会定义这样的数据类型D:
— 盛安安

7
为了教什么是感应-感应类型。我可以举一个真实的例子,即类型Universe,但这会造成混淆。
— Andrej Bauer

3
@AndrejBauer在我看来,这更像是归纳递归。归纳-归纳是将类型族定义为归纳类型。
— gallais 16-10-3

2
糟糕,您绝对正确。我会解决的。
— 安德烈·鲍尔

ℓ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.