Coq 使用';同一关系';(可能还有其他库定义)?
给定任何编程语言,只要存在标准库函数,我们就应该使用它,而不是编写自己的代码。人们会认为,这一建议同样适用于Coq。然而,我最近强迫自己使用Coq 使用';同一关系';(可能还有其他库定义)?,coq,Coq,给定任何编程语言,只要存在标准库函数,我们就应该使用它,而不是编写自己的代码。人们会认为,这一建议同样适用于Coq。然而,我最近强迫自己使用关系模块的相同的\u关系谓词,让我感觉情况更糟。所以我肯定错过了什么,所以我的问题。为了说明我的意思,让我们考虑一下可能的关系: Require Import Relations. (* same_relation *) Require Import Setoids.Setoid. (* seems to be needed for rewrite
关系
模块的相同的\u关系
谓词,让我感觉情况更糟。所以我肯定错过了什么,所以我的问题。为了说明我的意思,让我们考虑一下可能的关系:
Require Import Relations. (* same_relation *)
Require Import Setoids.Setoid. (* seems to be needed for rewrite *)
Inductive rel1 {A:Type} : A -> A -> Prop :=
| rel1_refl : forall x:A, rel1 x x. (* for example *)
Inductive rel2 {A:Type} : A -> A -> Prop :=
| rel2_refl : forall x:A, rel2 x x. (* for example *)
这些关系的具体细节在这里并不重要,只要rel1
和rel2
是等效的。现在,如果我想忽略Coq库,我可以简单地说:
Lemma L1: forall (A:Type)(x y:A), rel1 x y <-> rel2 x y.
Proof.
(* some proof *)
Qed.
在最简单的情况下,似乎已证明引理L1
或引理L2
同样有益:
Lemma application1: forall (A:Type) (x y:A),
rel1 x y -> rel2 x y (* for example *)
Proof.
intros A x y H. apply L1 (* or L2 *) . exact H.
Qed.
无论我决定使用apply L1
还是apply L2
都没有区别
然而,在实践中,我们可能面临一个更复杂的目标:
Lemma application2: forall (A:Type) (x y:A) (p:Prop),
p /\ rel1 x y -> p /\ rel2 x y.
Proof.
intros A x y p H. rewrite <- L1. exact H.
Qed.
引理应用2:forall(A:Type)(xy:A)(p:Prop),
p/\rel1 x y->p/\rel2 x y。
证明。
介绍A x y p H.重写你提出了两个问题,我试着分别回答:
- 关于你的重写问题,这个问题很自然,因为
相同关系的定义是双重包含。我同意使用
的定义可能更方便。这实际上取决于你有什么样的目标。您的问题的一个可能解决方案是定义一个视图:iff
Lemma L1 {A:Type} {x y:A} : rel1 x y <-> rel2 x y. Proof. Admitted. Lemma L2 {A:Type} : same_relation A rel1 rel2. Proof. Admitted. Lemma U {T} {R1 R2 : relation T} : same_relation _ R1 R2 -> forall x y, R1 x y <-> R2 x y. Proof. now destruct 1; intros x y; split; auto. Qed. Lemma application2 {A:Type} {x y:A} {p:Prop} : p /\ rel1 x y -> p /\ rel2 x y. Proof. now rewrite (U L2). Qed.
还要注意,使用引理L1{A:Type}{xy:A}:rel1xyrel2xy。 证明。 承认。 引理L2{A:Type}:相同的关系A rel1 rel2。 证明。 承认。 引理U{T}{r1r2:关系T}: 相同的关系r1r2->对于所有x y,r1x y r2x y。 证明。现在销毁1;简介xy;分裂自动的。Qed。 引理application2{A:Type}{xy:A}{p:Prop}: p/\rel1 x y->p/\rel2 x y。 证明。现在重写(U L2)。Qed。
关系进行重写实际上并不是基于相等,而是基于“setoid重写”。事实上,以下内容在Coq
中并不适用ab->A=B
- 关于第二个问题,是否使用Coq标准库是一个非常主观的话题。我个人很少使用它,我更喜欢另一个名为
的库,但是YMMV。关于关系,mathcomp主要专门用于布尔关系math comp
,因此,等价性只是简单地定义为相等,通常,给定您要编写的rel x y=x->y->bool
总之,这些选择在很大程度上取决于你的应用领域r1=2 r2
因此,事实上,它可能不是建造Coq开发项目的最佳现代化基地。非常感谢!!
集合
库(包含关系
和大写字母R
)于1993年启动。但是OP指的是包含关系的库(虽然我不知道它是什么时候开始的)。我认为关系是集合的直接后代,但是svn历史并不是那么简单。
Lemma L1 {A:Type} {x y:A} : rel1 x y <-> rel2 x y.
Proof.
Admitted.
Lemma L2 {A:Type} : same_relation A rel1 rel2.
Proof.
Admitted.
Lemma U {T} {R1 R2 : relation T} :
same_relation _ R1 R2 -> forall x y, R1 x y <-> R2 x y.
Proof. now destruct 1; intros x y; split; auto. Qed.
Lemma application2 {A:Type} {x y:A} {p:Prop} :
p /\ rel1 x y -> p /\ rel2 x y.
Proof. now rewrite (U L2). Qed.