理解Coq中的“有根据”的证明

时间:2018-05-06 21:35:14

标签: theory coq

我正在编写一个修复点,需要在每次迭代时将整数递增到“零”。这对于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,但我从未使用它所使用的列表类型,也没有解释“可访问”等术语的含义。

1 个答案:

答案 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作为一个非常好的解释,说明这是如何运作的。

这与你正在做的事情有什么关系?标准库证明,对于所有下界cx < yZ中是一个有充分根据的关系,如果另外它仅适用于y >= c。我不认为这适用于您 - 相反,您会向零移动,因此您可以使用abs z上常用的<关系减少nat。标准库已经证明了这种关系是有根据的,这就是Function ... {measure ...}使用的。