我有一个归纳定义 - 在评估后 - 打印警告“忽略递归调用”。似乎这个定义完全正常。但是,我仍然很好奇为什么会给出这个警告。以下是一个最小的例子。
Inductive testor :=
| Constr1 : list testor -> testor
| Constr2 : testor -> testor.
我认为第一个构造函数中的罪魁祸首是list testor
。另一方面,如果没有第二个构造函数,则不会发出警告。
问:为什么会发出警告?这是否意味着对归纳定义施加限制?
我正在使用Coq 8.5。
答案 0 :(得分:4)
由于testor
的出现,类型list testor
被称为嵌套归纳类型。没有限制,你可以安全地使用这个定义,它只是自动生成的归纳原理并不是很有用。此Coq-club thread处理此问题。以下是Adam Chlipala的回答摘录:
警告只是关于生成有用的启发式尝试 归纳原理。嵌套归纳类型(如[AllList]使用 这里需要一些聪明才能构建正确的归纳案例模式。
有关详细信息,请参阅CPDT this chapter中的“嵌套归纳类型”部分。