aboutsummaryrefslogtreecommitdiffhomepage
path: root/test-suite/success/eauto.v
diff options
context:
space:
mode:
Diffstat (limited to 'test-suite/success/eauto.v')
-rw-r--r--test-suite/success/eauto.v136
1 files changed, 96 insertions, 40 deletions
diff --git a/test-suite/success/eauto.v b/test-suite/success/eauto.v
index 4db547f4e..160f2d9de 100644
--- a/test-suite/success/eauto.v
+++ b/test-suite/success/eauto.v
@@ -5,7 +5,6 @@
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(************************************************************************)
-Require Import List.
Class A (A : Type).
Instance an: A nat.
@@ -31,6 +30,8 @@ Defined.
Hint Extern 0 (_ /\ _) => constructor : typeclass_instances.
+Existing Class and.
+
Goal exists (T : Type) (t : T), A T /\ B T t.
Proof.
eexists. eexists. typeclasses eauto.
@@ -46,7 +47,7 @@ Class C {T} `(a : A T) (t : T).
Require Import Classes.Init.
Hint Extern 0 { x : ?A & _ } =>
unshelve class_apply @existT : typeclass_instances.
-
+Existing Class sigT.
Set Typeclasses Debug.
Instance can: C an 0.
(* Backtrack on instance implementation *)
@@ -63,41 +64,6 @@ Proof.
Defined.
-Parameter in_list : list (nat * nat) -> nat -> Prop.
-Definition not_in_list (l : list (nat * nat)) (n : nat) : Prop :=
- ~ in_list l n.
-
-(* Hints Unfold not_in_list. *)
-
-Axiom
- lem1 :
- forall (l1 l2 : list (nat * nat)) (n : nat),
- not_in_list (l1 ++ l2) n -> not_in_list l1 n.
-
-Axiom
- lem2 :
- forall (l1 l2 : list (nat * nat)) (n : nat),
- not_in_list (l1 ++ l2) n -> not_in_list l2 n.
-
-Axiom
- lem3 :
- forall (l : list (nat * nat)) (n p q : nat),
- not_in_list ((p, q) :: l) n -> not_in_list l n.
-
-Axiom
- lem4 :
- forall (l1 l2 : list (nat * nat)) (n : nat),
- not_in_list l1 n -> not_in_list l2 n -> not_in_list (l1 ++ l2) n.
-
-Hint Resolve lem1 lem2 lem3 lem4: essai.
-
-Goal
-forall (l : list (nat * nat)) (n p q : nat),
-not_in_list ((p, q) :: l) n -> not_in_list l n.
- intros.
- eauto with essai.
-Qed.
-
(* Example from Nicolas Magaud on coq-club - Jul 2000 *)
Definition Nat : Set := nat.
@@ -126,6 +92,9 @@ Qed.
Full backtracking on dependent subgoals.
*)
Require Import Coq.Classes.Init.
+
+Module NTabareau.
+
Set Typeclasses Dependency Order.
Unset Typeclasses Iterative Deepening.
Notation "x .1" := (projT1 x) (at level 3).
@@ -149,7 +118,8 @@ Hint Extern 5 (Bar ?D.1) =>
Hint Extern 5 (Qux ?D.1) =>
destruct D; simpl : typeclass_instances.
-Hint Extern 1 myType => unshelve refine (fooTobar _ _).1 : typeclass_instances.
+Hint Extern 1 myType =>
+ unshelve refine (fooTobar _ _).1 : typeclass_instances.
Hint Extern 1 myType => unshelve refine (barToqux _ _).1 : typeclass_instances.
@@ -158,8 +128,94 @@ Hint Extern 0 { x : _ & _ } => simple refine (existT _ _ _) : typeclass_instance
Unset Typeclasses Debug.
Definition trivial a (H : Foo a) : {b : myType & Qux b}.
Proof.
- Time typeclasses eauto 10.
+ Time typeclasses eauto 10 with typeclass_instances.
Undo. Set Typeclasses Iterative Deepening.
- Time typeclasses eauto.
+ Time typeclasses eauto with typeclass_instances.
Defined.
+End NTabareau.
+
+Module NTabareauClasses.
+
+Set Typeclasses Dependency Order.
+Unset Typeclasses Iterative Deepening.
+Notation "x .1" := (projT1 x) (at level 3).
+Notation "x .2" := (projT2 x) (at level 3).
+
+Parameter myType: Type.
+Existing Class myType.
+
+Class Foo (a:myType) := {}.
+
+Class Bar (a:myType) := {}.
+
+Class Qux (a:myType) := {}.
+
+Parameter fooTobar : forall a (H : Foo a), {b: myType & Bar b}.
+
+Parameter barToqux : forall a (H : Bar a), {b: myType & Qux b}.
+
+Hint Extern 5 (Bar ?D.1) =>
+ destruct D; simpl : typeclass_instances.
+
+Hint Extern 5 (Qux ?D.1) =>
+ destruct D; simpl : typeclass_instances.
+
+Hint Extern 1 myType =>
+ unshelve notypeclasses refine (fooTobar _ _).1 : typeclass_instances.
+
+Hint Extern 1 myType =>
+ unshelve notypeclasses refine (barToqux _ _).1 : typeclass_instances.
+
+Hint Extern 0 { x : _ & _ } =>
+ unshelve notypeclasses refine (existT _ _ _) : typeclass_instances.
+
+Unset Typeclasses Debug.
+
+Definition trivial a (H : Foo a) : {b : myType & Qux b}.
+Proof.
+ Time typeclasses eauto 10 with typeclass_instances.
+ Undo. Set Typeclasses Iterative Deepening.
+ (* Much faster in iteratove deepening mode *)
+ Time typeclasses eauto with typeclass_instances.
+Defined.
+
+End NTabareauClasses.
+
+
+Require Import List.
+
+Parameter in_list : list (nat * nat) -> nat -> Prop.
+Definition not_in_list (l : list (nat * nat)) (n : nat) : Prop :=
+ ~ in_list l n.
+
+(* Hints Unfold not_in_list. *)
+
+Axiom
+ lem1 :
+ forall (l1 l2 : list (nat * nat)) (n : nat),
+ not_in_list (l1 ++ l2) n -> not_in_list l1 n.
+
+Axiom
+ lem2 :
+ forall (l1 l2 : list (nat * nat)) (n : nat),
+ not_in_list (l1 ++ l2) n -> not_in_list l2 n.
+
+Axiom
+ lem3 :
+ forall (l : list (nat * nat)) (n p q : nat),
+ not_in_list ((p, q) :: l) n -> not_in_list l n.
+
+Axiom
+ lem4 :
+ forall (l1 l2 : list (nat * nat)) (n : nat),
+ not_in_list l1 n -> not_in_list l2 n -> not_in_list (l1 ++ l2) n.
+
+Hint Resolve lem1 lem2 lem3 lem4: essai.
+
+Goal
+forall (l : list (nat * nat)) (n p q : nat),
+not_in_list ((p, q) :: l) n -> not_in_list l n.
+ intros.
+ eauto with essai.
+Qed.