在依赖类型的编程中,有两种主要的方法来分解数据并执行递归:
- 相关模式匹配:函数定义作为多个子句给出。统一可确保所有遗漏的情况都是不可能的,并且外部求解器可确保有充分的递归依据。
- 消除符:每个归纳数据类型都有一个关联的常数E D,它充当归纳原理,并充当分解类型D的值的递归函数。它们比较冗长,但是具有总计(所有情况都由E D覆盖)并通过构造终止的优点。
我已经看到了常见数据类型的消除器,例如,其中消除器基本上是数学归纳法,或者L i s t,其中消除器基本上是折叠。
我已经阅读了几篇有关依存模式匹配的论文,并且许多论文都引用了类型理论,在其中可以定义数据类型,并且该理论提供了消除符。例如,消除相关模式匹配描述了UTT如何基于消除符,以及在存在公理的情况下如何将模式匹配转换为消除。我的理解是,一旦定义了数据类型,该理论便提供了消除器。
我没有发现(或者至少没有发现,如果我没看过的话)很好地描述了如何导出消除符,包括其类型和语义。
有人可以指出我的引用,该引用描述了如何从数据类型的定义中获得消除符吗?
我敢肯定在构造或Coq文献的演算中有一个描述(对于严格的正数类型-对于更复杂类型的Coq消除器并不完全通用)。
—
吉尔(Gilles)'所以
@Gilles我的理解是Coq没有使用消除符,而是使用了单独的match和(受保护的)fix运算符。
—
jmite '18
核心语言不使用消除符,但是当您定义类型时,Coq会生成一个消除符,该消除符由
—
吉尔斯(Gillles)“所以-别再邪恶了”
fix
和定义match
。我手头没有参考资料,但是我知道我已经阅读了有关此消除器是如何生成的。cs.stackexchange.com/questions/104/…可能很有趣。
对于任何归纳类型
—
志
T
,Coq定义了归纳原理T_ind
,它是一个依存消除器。这是根据递归和模式匹配定义的,但是原则上您可以将其假定为具有相同类型(具有相同语义)的新常量。