Coq:在编写证明脚本期间查看证明术语

Coq: viewing proof term during proof script writing

所以,我有一个看起来像这样的证明:

induction t; intros; inversion H ; crush.

它解决了我所有的目标,但是当我这样做时 Qed,我收到以下错误:

Cannot guess decreasing argument of fix.

所以在生成的证明项中的某处,存在没有充分根据的递归。问题是,我不知道在哪里。

有没有办法调试这种错误,或者查看战术脚本生成的(可能是非停止的)证明项?

您可以在校样模式下使用Show Proof.命令来打印目前生成的校样项。

您可以使用Show Proof.查看目前的证明项。

另一个可以帮助查看递归哪里出错的命令是 Guarded.,它在到目前为止的证明项上运行终止检查器。不过,您需要将战术脚本分解成独立的句子才能使用它。这是一个例子:

Fixpoint f (n:nat) :  nat.
Proof.
  apply plus.
  exact (f n).
  Guarded.
(* fails with:
   Error:
   Recursive definition of f is ill-formed.
   ...
 *)
Defined.

除了其他出色的答案之外,我还想指出在交互模式 Fixpoint 中使用 induction 通常是错误的,因为您递归了两次。在交互模式下编写固定点通常很棘手,因为大多数自动化工具会很乐意在每一个可能的机会进行递归调用,即使它是没有根据的。

我建议使用 Definition 而不是 Fixpoint,并在证明脚本中使用 induction。这会调用显式递归,从而可以更好地控制自动化。缺点是灵活性降低,因为固定点的限制比递归少 - 但正如我们所见,这既是福也是祸。