Mit jeder gegebenen Programmiersprache sollten wir immer dann, wenn eine Standardbibliotheksfunktion existiert, diese verwenden, anstatt unseren eigenen Code zu schreiben. Man könnte meinen, dass dieser Rat auch für Coq gilt. Allerdings zwang ich mich kürzlich, das same_relation
Prädikat des Relation
Moduls zu verwenden, und mir bleibt das Gefühl, schlechter dran zu sein. Also muss mir etwas fehlen, daher meine Frage. Um zu zeigen, was ich meine lassen Sie uns auf mögliche Beziehungen betrachten:Wird eine Person bestraft, indem 'self_relation' (und möglicherweise andere Bibliotheksdefinitionen) verwendet wird?
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 *)
Die spezifischen Details dieser Beziehungen spielen hier keine Rolle, solange rel1
und rel2
gleichwertig sind. Nun, wenn ich will die Coq Bibliothek ignorieren, ich konnte einfach Zustand:
Lemma L1: forall (A:Type)(x y:A), rel1 x y <-> rel2 x y.
Proof.
(* some proof *)
Qed.
und wenn ich will mein Instinkt folgen und die Coq Bibliothek verwenden:
Lemma L2: forall (A:Type), same_relation A rel1 rel2.
Proof.
(* some proof *)
Qed.
Im einfachsten Fall, es scheint, dass L1
oder Lemma L2
Lemma bewiesen zu haben, ist gleichermaßen von Vorteil:
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.
Ob ich entscheiden apply L1
oderzu verwendenmacht keinen Unterschied ...
jedoch in der Praxis werden wir wahrscheinlich mit einem komplizierteren Ziel konfrontiert werden:
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.
Mein Punkt hier ist, dass rewrite <- L1
durch rewrite <- L2
ersetzt wird fehlschlagen. Dies gilt auch für das vorherige Beispiel, aber ich konnte zumindest apply
statt rewrite
verwenden. Ich kann apply
in diesem Fall nicht verwenden (es sei denn, ich mache mir die Mühe, mein Ziel zu teilen). So scheint es, dass ich den Komfort der Verwendung von rewrite
verloren habe, wenn ich nur Lemma L2
habe.
Mit rewrite
auf Ergebnisse, die eine Äquivalenz (nicht nur eine Gleichheit) sind, ist sehr bequem. Es scheint, dass das Einwickeln einer Äquivalenz in das Prädikat same_relation
diese Bequemlichkeit wegnimmt. Habe ich Recht, meinem Instinkt zu folgen und mich dazu zu zwingen, same_relation
zu verwenden? Allgemeiner ist es so wahr, dass wenn ein Konstrukt in der Standard-Coq-Bibliothek definiert ist, ich es verwenden sollte, anstatt meine eigene Version davon zu definieren?
Vielen Dank !! –
Die Bibliothek 'Sets' (die 'Relation' mit dem Großbuchstaben' R' enthält) wurde 1993 gestartet. Das OP bezieht sich jedoch auf die 'Relations'-Bibliothek, die' relation' enthält (ich weiß nicht, wann es gestartet wurde)). –
Ich denke, "Relationen" sind ein direkter Nachkomme von 'Sets', aber die SVN-Geschichte geht nicht so einfach. – ejgallego