如何得出依赖类型的消除符?


10

在依赖类型的编程中,有两种主要的方法来分解数据并执行递归:

  • 相关模式匹配:函数定义作为多个子句给出。统一可确保所有遗漏的情况都是不可能的,并且外部求解器可确保有充分的递归依据。
  • 消除符:每个归纳数据类型都有一个关联的常数E D,它充当归纳原理,并充当分解类型D的值的递归函数。它们比较冗长,但是具有总计(所有情况都由E D覆盖)并通过构造终止的优点。dËddËd

我已经看到了常见数据类型的消除器,例如,其中消除器基本上是数学归纳法,或者L i s t,其中消除器基本上是折叠。ñ一个Ť大号一世sŤ

我已经阅读了几篇有关依存模式匹配的论文,并且许多论文都引用了类型理论,在其中可以定义数据类型,并且该理论提供了消除符。例如,消除相关模式匹配描述了UTT如何基于消除符,以及在存在公理的情况下如何将模式匹配转换为消除。我的理解是,一旦定义了数据类型,该理论便提供了消除器。ķ

我没有发现(或者至少没有发现,如果我没看过的话)很好地描述了如何导出消除符,包括其类型和语义。

有人可以指出我的引用,该引用描述了如何从数据类型的定义中获得消除符吗?


我敢肯定在构造或Coq文献的演算中有一个描述(对于严格的正数类型-对于更复杂类型的Coq消除器并不完全通用)。
吉尔(Gilles)'所以

@Gilles我的理解是Coq没有使用消除符,而是使用了单独的match和(受保护的)fix运算符。
jmite '18

3
核心语言不使用消除符,但是当您定义类型时,Coq会生成一个消除符,该消除符由fix和定义match。我手头没有参考资料,但是我知道我已经阅读了有关此消除器是如何生成的。cs.stackexchange.com/questions/104/…可能很有趣。
吉尔斯(Gillles)“所以-别再邪恶了”

对于任何归纳类型T,Coq定义了归纳原理T_ind,它是一个依存消除器。这是根据递归和模式匹配定义的,但是原则上您可以将其假定为具有相同类型(具有相同语义)的新常量。

Answers:


8

规范的参考文献是归纳家庭 Peter Dybjer,该书对基于消除器的归纳家庭进行了相当全面的处理。


6

您可能会发现一些关于此的最新文章很有用,因为我们可以得出针对lambda编码的数据类型的消除符。例如,请参阅此一个用于消除器的通用推导,这一个为基本技术施加刚刚到NAT类型。

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.