Coq:在校对脚本编写期间查看校对术语
所以,我有一个证据,看起来像这样:Coq:在校对脚本编写期间查看校对术语,coq,dependent-type,termination,theorem-proving,ltac,Coq,Dependent Type,Termination,Theorem Proving,Ltac,所以,我有一个证据,看起来像这样: induction t; intros; inversion H ; crush. 它解决了我的所有目标,但当我执行Qed时,我得到以下错误: 无法猜测修复的递减参数。 因此,在生成的证明项的某个地方,存在着无充分根据的递归。问题是,我不知道在哪里 有没有办法调试这种错误,或者查看战术脚本生成的(可能是非停止的)证明项?您可以使用显示证明。命令在证明模式内部打印到目前为止生成的证明项。您可以使用显示证明。查看到目前为止的证明项 另一个可以帮助查看递归哪里出错
induction t; intros; inversion H ; crush.
它解决了我的所有目标,但当我执行Qed
时,我得到以下错误:
无法猜测修复的递减参数。
因此,在生成的证明项的某个地方,存在着无充分根据的递归。问题是,我不知道在哪里
有没有办法调试这种错误,或者查看战术脚本生成的(可能是非停止的)证明项?您可以使用
显示证明。
命令在证明模式内部打印到目前为止生成的证明项。您可以使用显示证明。
查看到目前为止的证明项
另一个可以帮助查看递归哪里出错的命令是Guarded.
,该命令目前为止在证明项上运行终止检查器。不过,你需要将战术脚本分解成独立的句子来使用它。下面是一个例子:
Fixpoint f (n:nat) : nat.
Proof.
apply plus.
exact (f n).
Guarded.
(* fails with:
Error:
Recursive definition of f is ill-formed.
...
*)
Defined.
除了其他优秀的答案之外,我还想指出,在交互模式
定点中使用归纳法通常是一个错误,因为你会重复两次。在交互模式下编写固定点通常是很棘手的,因为大多数自动化工具在任何可能的机会都会愉快地进行递归调用,即使这种调用是没有根据的
我建议使用定义
而不是固定点
,并在校对脚本中使用归纳
。这将调用显式递归器,它允许更好地控制自动化。缺点是灵活性降低,因为不动点的限制比递归少——但正如我们所看到的,这既是福也是祸。如果您非常小心,在不动点
内部使用归纳法是一种相对简单的方法,可以证明包含嵌套不动点的函数。你必须确保在运行诸如<代码> Auto < /C> >之前专门定位不动点。@ Jasun罗斯这是合理的,不过我也会考虑将必要的嵌套归纳抽象成自己的方案,这样就不必那么小心了。注意,你可以写“代码> {结构N}。
告诉Coq递减参数应该是n
,从而得到更好的错误消息。当Coq猜不到fix的递减参数时,保护的
有效吗?事实证明,当您在证明模式中定义一个不动点时,Coq总是使用最后一个参数作为递减参数(如果不是归纳式的,则该命令将失败)。然后Guarded
确保减少此参数。请注意,您始终可以在定义时显式提供{struct n}
注释。