Coq 中的定理 + 归纳 vs Fixpoint + destruct

Theorem + induction vs Fixpoint + destruct in Coq

是否可以将每个 属性 在 Coq 中使用 Theorem 通过归纳在其中一个前提上证明的证明重构为使用 Fixpoint 的证明,我们在同一前提下进行破坏?为 TheoremFixpoint 使用单独的命令有什么意义?

是的。当你调用 induction 策略时,它等同于 applying 一个归纳原理引理(称为 nat_indDatatypeName_ind),并且该归纳原理由 Coq 自动证明使用定点和匹配。因此,如果您“内联”归纳原理的证明,您将得到一个可以由 Fixpointdestruct.

构造的证明

然而,使用Fixpoint手动编写证明有点容易出错,因为它总是在递归调用对应的上下文中添加一个假设,并且只有在对一个假设使用假设时证明才有效来自 destruct 的论点。该条件仅在最终 Qed 时检查(您可以使用 Guarded 命令检查,但这需要提前正确知道递归参数,可能使用 {struct x} 声明) .因此,如果您使用 Fixpoint 编写证明,然后调用 eauto 之类的策略,该策略可能会“意外地”以没有充分根据的方式使用递归参数。如果你使用induction,你只会得到直接子项的归纳假设,所以通过策略构造的证明总是有效的。