Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq:在校对脚本编写期间查看校对术语_Coq_Dependent Type_Termination_Theorem Proving_Ltac - Fatal编程技术网

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}
注释。