diff options
| author | msozeau | 2009-05-16 13:41:38 +0000 |
|---|---|---|
| committer | msozeau | 2009-05-16 13:41:38 +0000 |
| commit | b0e371b354ffdbf4a8572924602d04848020079e (patch) | |
| tree | 4f656ec0d438667e479d76d1ee22bb74e2cd0577 | |
| parent | 47c3ff53ee1c6b93172da74cc9916f0e9c51516d (diff) | |
Minor fixes in typeclasses:
- Set implicit args on for Context decls
- Move class_apply tactic to Init
- Normalize evars before raising an error.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12127 85f007b7-540e-0410-9357-904b9bb8a0f7
| -rw-r--r-- | tactics/class_tactics.ml4 | 4 | ||||
| -rw-r--r-- | theories/Classes/Init.v | 4 | ||||
| -rw-r--r-- | theories/Classes/Morphisms.v | 7 | ||||
| -rw-r--r-- | theories/Classes/RelationClasses.v | 4 | ||||
| -rw-r--r-- | toplevel/classes.ml | 1 |
5 files changed, 11 insertions, 9 deletions
diff --git a/tactics/class_tactics.ml4 b/tactics/class_tactics.ml4 index e09ba93f8e..f9485e64cd 100644 --- a/tactics/class_tactics.ml4 +++ b/tactics/class_tactics.ml4 @@ -446,8 +446,8 @@ let resolve_all_evars debug m env p oevd do_split fail = | None -> if fail then (* Unable to satisfy the constraints. *) - let evm = evd in - let evm = if do_split then select_evars comp evm else evm in + let evm = if do_split then select_evars comp evd else evd in + let evm = Evarutil.nf_evars evm in let _, ev = Evd.fold (fun ev evi (b,acc) -> (* focus on one instance if only one was searched for *) diff --git a/theories/Classes/Init.v b/theories/Classes/Init.v index 7d6e1de1e6..3e2eb4f40a 100644 --- a/theories/Classes/Init.v +++ b/theories/Classes/Init.v @@ -21,6 +21,10 @@ Require Import Coq.Program.Basics. Typeclasses Opaque id const flip compose arrow impl iff not all. +(** Apply using the same opacity information as typeclass proof search. *) + +Ltac class_apply c := autoapply c using typeclass_instances. + (** The unconvertible typeclass, to test that two objects of the same type are actually different. *) diff --git a/theories/Classes/Morphisms.v b/theories/Classes/Morphisms.v index ee3d7876dc..19c360f62f 100644 --- a/theories/Classes/Morphisms.v +++ b/theories/Classes/Morphisms.v @@ -101,8 +101,7 @@ Hint Unfold Transitive : core. Typeclasses Opaque respectful pointwise_relation forall_relation. -Program Instance respectful_per `(PER A (R : relation A), PER B (R' : relation B)) : - PER (R ==> R'). +Program Instance respectful_per `(PER A R, PER B R') : PER (R ==> R'). Next Obligation. Proof with auto. @@ -127,8 +126,6 @@ Proof. simpl_relation. apply subr. apply H. apply subl. apply H0. Qed. Lemma subrelation_refl A R : @subrelation A R R. Proof. simpl_relation. Qed. -Ltac class_apply c := autoapply c using typeclass_instances. - Ltac subrelation_tac T U := (is_ground T ; is_ground U ; class_apply @subrelation_refl) || class_apply @subrelation_respectful || class_apply @subrelation_refl. @@ -438,7 +435,7 @@ Hint Extern 1 (subrelation _ (flip _)) => class_apply @inverse2 : typeclass_inst Lemma eq_subrelation `(Reflexive A R) : subrelation (@eq A) R. Proof. simpl_relation. Qed. -Hint Extern 3 (subrelation (@eq _) ?R) => not_evar R ; class_apply eq_subrelation. +(* Hint Extern 3 (subrelation (@eq _) ?R) => not_evar R ; class_apply eq_subrelation : typeclass_instances. *) (** Once we have normalized, we will apply this instance to simplify the problem. *) diff --git a/theories/Classes/RelationClasses.v b/theories/Classes/RelationClasses.v index 681bd90a9e..1a966ded5f 100644 --- a/theories/Classes/RelationClasses.v +++ b/theories/Classes/RelationClasses.v @@ -45,7 +45,7 @@ Class Reflexive {A} (R : relation A) := Class Irreflexive {A} (R : relation A) := irreflexivity : Reflexive (complement R). -Hint Extern 1 (Reflexive (complement _)) => eapply @irreflexivity : typeclasses_instances. +Hint Extern 1 (Reflexive (complement _)) => class_apply @irreflexivity : typeclasses_instances. Class Symmetric {A} (R : relation A) := symmetry : forall x y, R x y -> R y x. @@ -311,7 +311,7 @@ Notation "∙⊥∙" := false_predicate : predicate_scope. (** Predicate equivalence is an equivalence, and predicate implication defines a preorder. *) Program Instance predicate_equivalence_equivalence : Equivalence (@predicate_equivalence l). - Next Obligation. + Next Obligation. induction l ; firstorder. Qed. Next Obligation. diff --git a/toplevel/classes.ml b/toplevel/classes.ml index 2d5cd659f7..10283e5295 100644 --- a/toplevel/classes.ml +++ b/toplevel/classes.ml @@ -258,6 +258,7 @@ let named_of_rel_context l = in ctx let context ?(hook=fun _ -> ()) l = + Impargs.make_manual_implicit_args true; let env = Global.env() in let evars = ref Evd.empty in let (env', fullctx), impls = interp_context_evars evars env l in |
