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
。这会调用显式递归,从而可以更好地控制自动化。缺点是灵活性降低,因为固定点的限制比递归少 - 但正如我们所见,这既是福也是祸。
所以,我有一个看起来像这样的证明:
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
。这会调用显式递归,从而可以更好地控制自动化。缺点是灵活性降低,因为固定点的限制比递归少 - 但正如我们所见,这既是福也是祸。