Coq 中的定理 + 归纳 vs Fixpoint + destruct
Theorem + induction vs Fixpoint + destruct in Coq
是否可以将每个 属性 在 Coq 中使用 Theorem
通过归纳在其中一个前提上证明的证明重构为使用 Fixpoint
的证明,我们在同一前提下进行破坏?为 Theorem
和 Fixpoint
使用单独的命令有什么意义?
是的。当你调用 induction
策略时,它等同于 apply
ing 一个归纳原理引理(称为 nat_ind
或 DatatypeName_ind
),并且该归纳原理由 Coq 自动证明使用定点和匹配。因此,如果您“内联”归纳原理的证明,您将得到一个可以由 Fixpoint
和 destruct
.
构造的证明
然而,使用Fixpoint
手动编写证明有点容易出错,因为它总是在递归调用对应的上下文中添加一个假设,并且只有在对一个假设使用假设时证明才有效来自 destruct
的论点。该条件仅在最终 Qed
时检查(您可以使用 Guarded
命令检查,但这需要提前正确知道递归参数,可能使用 {struct x}
声明) .因此,如果您使用 Fixpoint 编写证明,然后调用 eauto
之类的策略,该策略可能会“意外地”以没有充分根据的方式使用递归参数。如果你使用induction
,你只会得到直接子项的归纳假设,所以通过策略构造的证明总是有效的。
是否可以将每个 属性 在 Coq 中使用 Theorem
通过归纳在其中一个前提上证明的证明重构为使用 Fixpoint
的证明,我们在同一前提下进行破坏?为 Theorem
和 Fixpoint
使用单独的命令有什么意义?
是的。当你调用 induction
策略时,它等同于 apply
ing 一个归纳原理引理(称为 nat_ind
或 DatatypeName_ind
),并且该归纳原理由 Coq 自动证明使用定点和匹配。因此,如果您“内联”归纳原理的证明,您将得到一个可以由 Fixpoint
和 destruct
.
然而,使用Fixpoint
手动编写证明有点容易出错,因为它总是在递归调用对应的上下文中添加一个假设,并且只有在对一个假设使用假设时证明才有效来自 destruct
的论点。该条件仅在最终 Qed
时检查(您可以使用 Guarded
命令检查,但这需要提前正确知道递归参数,可能使用 {struct x}
声明) .因此,如果您使用 Fixpoint 编写证明,然后调用 eauto
之类的策略,该策略可能会“意外地”以没有充分根据的方式使用递归参数。如果你使用induction
,你只会得到直接子项的归纳假设,所以通过策略构造的证明总是有效的。