我正在编写一个修复点,需要在每次迭代时将整数递增到“零”。这对于Coq来说太复杂了,无法自动识别为一个递减参数,我正在尝试证明我的修复点会终止。
我一直在复制(我认为是)标准库中Z步进功能的基础证据的一个例子。 (Here)
Require Import ZArith.Zwf.
Section wf_proof_wf_inc.
Variable c : Z.
Let Z_increment (z:Z) := (z + ((Z.sgn c) * (-1)))%Z.
Lemma Zwf_wf_inc : well_founded (Zwf c).
Proof.
unfold well_founded.
intros a.
Qed.
End wf_proof_wf_inc.
创建以下上下文:
c : Z
wf_inc := fun z : Z => (z + Z.sgn c * -1)%Z : Z -> Z
a : Z
============================
Acc (Zwf c) a
我的问题是这个目标究竟意味着什么?
我认为我必须为此证明的目标至少涉及我要展示的阶梯函数具有“有根据”的属性,“Z_increment”。
我看过的最有用的解释是this,但我从未使用它所使用的列表类型,也没有解释“可访问”等术语的含义。
答案 0 :(得分:3)
基本上,你不需要做一个有根据的证据,你只需要证明你的函数减少了(自然数)abs(z)。更具体地说,您可以实施abs (z:Z) : nat := z_to_nat (z * Z.sgn z)
(通过一些适当的转换为nat),然后将其用作Function
的衡量标准,例如Function foo z {measure abs z} := ...
。
有充分理由的业务是显示关系是有充分根据的:我们的想法是,你可以通过显示它“减少”一些有根据的关系R
来证明你的功能终止(把它想象为<
);也就是说,f x
的定义仅在f y
时生成递归子查询R y x
。为了实现这个目标,R
必须有充分根据,这直观地意味着它没有无限下降的链。 CPDT的general recursion chapter作为一个非常好的解释,说明这是如何运作的。
这与你正在做的事情有什么关系?标准库证明,对于所有下界c
,x < y
在Z
中是一个有充分根据的关系,如果另外它仅适用于y >= c
。我不认为这适用于您 - 相反,您会向零移动,因此您可以使用abs z
上常用的<
关系减少nat
。标准库已经证明了这种关系是有根据的,这就是Function ... {measure ...}
使用的。