Coq 使用';同一关系';(可能还有其他库定义)?

Coq 使用';同一关系';(可能还有其他库定义)?,coq,Coq,给定任何编程语言,只要存在标准库函数,我们就应该使用它,而不是编写自己的代码。人们会认为,这一建议同样适用于Coq。然而,我最近强迫自己使用关系模块的相同的\u关系谓词,让我感觉情况更糟。所以我肯定错过了什么,所以我的问题。为了说明我的意思,让我们考虑一下可能的关系: Require Import Relations. (* same_relation *) Require Import Setoids.Setoid. (* seems to be needed for rewrite

给定任何编程语言,只要存在标准库函数,我们就应该使用它,而不是编写自己的代码。人们会认为,这一建议同样适用于Coq。然而,我最近强迫自己使用
关系
模块的
相同的\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标准库是一个非常主观的话题。我个人很少使用它,我更喜欢另一个名为
    math comp
    的库,但是YMMV。关于关系,mathcomp主要专门用于布尔关系
    rel x y=x->y->bool
    ,因此,等价性只是简单地定义为相等,通常,给定您要编写的
    r1=2 r2

    总之,这些选择在很大程度上取决于你的应用领域

[编辑]:请注意,关系库的日期为:

Coq中的朴素集理论。COQV6.1。这项工作由F.Prost于1993年7月开始


因此,事实上,它可能不是建造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.