如何在Coq中正式终止术语缩减关系?

时间:2017-05-14 21:35:50

标签: coq

我有一个术语重写系统(A,→),其中A是一个集合,在A上是一个中缀二元关系。给定A的x和y,x→y表示x减少为y。

要实现某些属性,我只需使用Coq.Relations.Relation_DefinitionsCoq.Relations.Relation_Operators中的定义。

现在我要形式化以下属性:

  • →正在终止,即:没有无限下行链a0→a1→...

如何在Coq中实现这一目标?

1 个答案:

答案 0 :(得分:5)

显示重写关系终止与显示它是有充分根据的相同。这可以用Coq中的归纳谓词编码:

Inductive Acc {A} (R : A -> A -> Prop) (x: A) : Prop :=
  Acc_intro : (forall y:A, R x y -> Acc R y) -> Acc R x.

Definition well_founded {A} (R : A -> A -> Prop) :=
  forall a:A, Acc R a.

(此定义与standard library中的Accwell_founded谓词基本相同,但我改变了关系的顺序以匹配使用的约定在重写系统。)

A上给出R类型和A类型,Acc R x表示从R开始的每个x : A减少序列都是终止;因此,well_founded R表示从任何点开始的每个序列都在终止。 (Acc代表"可访问"。)

为什么这个定义有效可能不太清楚;首先,我们怎样才能表明Acc R x对任何x都有效?请注意,如果x是一个元素不会减少(也就是说,R x y永远不会对任何y保持),那么Acc_intro的前提是平凡的,我们能够得出结论Acc R x。例如,这将允许我们显示Acc gt 0。如果R确实有充分根据,那么我们可以从这些基本案例中倒退,并得出结论A的其他元素是可访问的。正确性的正式证明比这更复杂,因为它必须为每个x一般地工作,但这至少表明我们如何能够显示每个元素是可以单独访问的。

好的,也许我们可以证明Acc R x成立。那我们怎么用呢? 使用Coq为Acc生成的归纳和递归原则;例如:

Acc_ind : forall A (R : A -> A -> Prop) (P : A -> Prop),
   (forall x : A, (forall y : A, R x y -> P y) -> P x) ->
   forall x : A, Acc R x -> P x

R有充分根据时,这只是有根据的归纳原则。我们可以解释如下。假设我们可以显示P x适用于任何x : A,同时使用感应假设,该假设表示P yR x y时保持不变。 (根据R的含义,这可能意味着x步骤y,或y严格小于x,等等。) ,P x适用于任何xAcc R x。有根据的递归工作方式类似,并且直观地表示如果每个递归调用都在"较小的"上执行,则递归定义是有效的。元件。

Adam Chlipala的CPDT有一个chapter on general recursion,可以更全面地报道这种材料。