diff options
author | msozeau <msozeau@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2008-02-03 00:42:23 +0000 |
---|---|---|
committer | msozeau <msozeau@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2008-02-03 00:42:23 +0000 |
commit | 36fa70885150234159b0a6d8a1deb2d9fb3d2b8a (patch) | |
tree | a16ec5f253ee4fbc529c59e22abab2a46d8c28ab /theories/Classes/SetoidTactics.v | |
parent | c3f187d2eee5a99bf1a903059a3f18ff77560c98 (diff) |
Add new files theories/Program/Basics.v and theories/Classes/Relations.v
for basic functional programming and relation
definitions respectively.
Classes.Relations also includes the definition of Morphism
and instances for the standard morphisms and relations (eq, iff, impl,
inverse and complement). The class_setoid.ml4 [setoid_rewrite] tactic
has been reimplemented on top of these definitions, hence it doesn't
require a setoid implementation anymore. It also generates obligations
for missing reflexivity proofs, like the current setoid_rewrite. It has
not been tested on large examples but it should handle directions and
occurences. Works with in if no obligations are generated at this time.
What's missing is being able to rewrite by a lemma instead of a simple
hypothesis with no premises.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10502 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/Classes/SetoidTactics.v')
-rw-r--r-- | theories/Classes/SetoidTactics.v | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/theories/Classes/SetoidTactics.v b/theories/Classes/SetoidTactics.v index 540ac184e..39809865c 100644 --- a/theories/Classes/SetoidTactics.v +++ b/theories/Classes/SetoidTactics.v @@ -25,12 +25,12 @@ Require Export Coq.Classes.SetoidClass. (* Application of the extensionality axiom to turn a goal on leibinz equality to a setoid equivalence. *) -Lemma setoideq_eq [ sa : Setoid a eqa ] : forall x y, eqa x y -> x = y. +Lemma setoideq_eq [ sa : Setoid a ] : forall x y : a, x == y -> x = y. Proof. admit. Qed. -Implicit Arguments setoideq_eq [[a] [eqa] [sa]]. +Implicit Arguments setoideq_eq [[a] [sa]]. (** Application of the extensionality principle for setoids. *) @@ -65,5 +65,25 @@ Ltac setoid_tactic := | [ H : not (@equiv ?A ?R ?s ?X ?X) |- _ ] => elim H ; refl | [ H : not (@equiv ?A ?R ?s ?X ?Y), H' : @equiv ?A ?R ?s ?Y ?X |- _ ] => elim H ; sym ; apply H | [ H : not (@equiv ?A ?R ?s ?X ?Y), H' : ?R ?Y ?X |- _ ] => elim H ; sym ; apply H - | [ H : not (@equiv ?A ?R ?s ?X ?Y) |- False ] => elim H ; clear H ; setoid_tac + | [ H : not (@equiv ?A ?R ?s ?X ?Y) |- False ] => elim H ; clear H ; setoid_tactic end. +(** Need to fix fresh to not fail if some arguments are not identifiers. *) +(* Ltac setoid_sat ::= *) +(* match goal with *) +(* | [ H : ?x == ?y |- _ ] => let name:=fresh "Heq" y x in add_hypothesis name (equiv_sym H) *) +(* | [ H : ?x =/= ?y |- _ ] => let name:=fresh "Hneq" y x in add_hypothesis name (nequiv_sym H) *) +(* | [ H : ?x == ?y, H' : ?y == ?z |- _ ] => let name:=fresh "Heq" x z in add_hypothesis name (equiv_trans H H') *) +(* | [ H : ?x == ?y, H' : ?y =/= ?z |- _ ] => let name:=fresh "Hneq" x z in add_hypothesis name (equiv_nequiv H H') *) +(* | [ H : ?x =/= ?y, H' : ?y == ?z |- _ ] => let name:=fresh "Hneq" x z in add_hypothesis name (nequiv_equiv H H') *) +(* end. *) + +Ltac setoid_sat := + match goal with + | [ H : ?x == ?y |- _ ] => let name:=fresh "Heq" in add_hypothesis name (equiv_sym H) + | [ H : ?x =/= ?y |- _ ] => let name:=fresh "Hneq" in add_hypothesis name (nequiv_sym H) + | [ H : ?x == ?y, H' : ?y == ?z |- _ ] => let name:=fresh "Heq" in add_hypothesis name (equiv_trans H H') + | [ H : ?x == ?y, H' : ?y =/= ?z |- _ ] => let name:=fresh "Hneq" in add_hypothesis name (equiv_nequiv H H') + | [ H : ?x =/= ?y, H' : ?y == ?z |- _ ] => let name:=fresh "Hneq" in add_hypothesis name (nequiv_equiv H H') + end. +Ltac setoid_saturate := repeat setoid_sat. + |