我有一个术语重写系统(A,→),其中A是一个集合,在A上是一个中缀二元关系。给定A的x和y,x→y表示x减少为y。
要实现某些属性,我只需使用Coq.Relations.Relation_Definitions
和Coq.Relations.Relation_Operators
中的定义。
现在我要形式化以下属性:
如何在Coq中实现这一目标?
答案 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中的Acc
和well_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 y
在R x y
时保持不变。 (根据R
的含义,这可能意味着x
步骤y
,或y
严格小于x
,等等。) ,P x
适用于任何x
,Acc R x
。有根据的递归工作方式类似,并且直观地表示如果每个递归调用都在"较小的"上执行,则递归定义是有效的。元件。
Adam Chlipala的CPDT有一个chapter on general recursion,可以更全面地报道这种材料。