Coq 归纳的定义产生了“;“忽略递归调用”;

Coq 归纳的定义产生了“;“忽略递归调用”;,coq,Coq,我有一个归纳定义,在计算后打印警告“忽略递归调用”。这个定义似乎很好用。然而,我仍然很好奇,为什么会给出这样的警告。下面是一个简单的例子 Inductive testor := | Constr1 : list testor -> testor | Constr2 : testor -> testor. 我认为罪魁祸首是第一个构造函数中的列表testor。另一方面,如果没有第二个构造函数,则不会给出警告 Q:为什么会发出警告?这是否意味着对归纳定义施加了限制 我使用的是Coq 8.

我有一个归纳定义,在计算后打印警告“忽略递归调用”。这个定义似乎很好用。然而,我仍然很好奇,为什么会给出这样的警告。下面是一个简单的例子

Inductive testor :=
| Constr1 : list testor -> testor
| Constr2 : testor -> testor.
我认为罪魁祸首是第一个构造函数中的
列表testor
。另一方面,如果没有第二个构造函数,则不会给出警告

Q:为什么会发出警告?这是否意味着对归纳定义施加了限制


我使用的是Coq 8.5。

类型
testor
称为嵌套归纳类型,因为出现了
列表testor
。没有限制,你可以安全地使用这个定义,只是自动生成的归纳原理不是很有用。这涉及到这个问题。以下是Adam Chlipala答案的摘录:

警告仅仅是关于启发式尝试生成有用的 归纳原理。嵌套归纳类型(如您的[AllList]使用 这里)需要一些技巧来构建正确的归纳案例模式


有关更多详细信息,请参阅CPDT中的“嵌套归纳类型”部分。

一个附带问题:为什么不将其声明为共归纳类型?@Cryptostasis我从一种小型编程语言的定义中派生了这个示例。我从未使用过共导类型,但据我所知,这些类型用于处理无限对象。通常,程序是有限的。将这样的定义声明为共导性有什么好处?这是一个错误的假设。我认为testor是一种非终止类型。现在我看到testor确实终止为Constr1 nil