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

时间:2018-02-19 23:59:13

标签: coq dependent-type termination theorem-proving ltac

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

induction t; intros; inversion H ; crush.

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

Cannot guess decreasing argument of fix.

所以在生成的证明术语的某处,有一个非有根据的递归。问题是,我不知道在哪里。

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

3 个答案:

答案 0 :(得分:5)

到目前为止,您可以使用Guarded.查看证明字词。

另一个可以帮助查看递归出错位置的命令是Fixpoint f (n:nat) : nat. Proof. apply plus. exact (f n). Guarded. (* fails with: Error: Recursive definition of f is ill-formed. ... *) Defined. ,它在到目前为止的证明项上运行终止检查器。但是,您需要将策略脚本拆分为独立的句子才能使用它。这是一个例子:

request.setHeader("authorization", "bearer " + token);

答案 1 :(得分:3)

您可以在校样模式下使用Show Proof.命令打印到目前为止生成的校样术语。

答案 2 :(得分:3)

除了其他出色的答案,我还想指出,在交互式模式induction中使用Fixpoint通常是一个错误,因为您要重复两次。以交互方式编写定位点通常很棘手,因为大多数自动化工具都会在可能的情况下很高兴地进行递归调用,即使它没有根据。

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