aboutsummaryrefslogtreecommitdiffhomepage
path: root/test-suite/success/bteauto.v
diff options
context:
space:
mode:
authorGravatar Matthieu Sozeau <mattam@mattam.org>2016-05-27 19:37:36 +0200
committerGravatar Matthieu Sozeau <mattam@mattam.org>2016-06-16 18:21:08 +0200
commit855143c550cad6694f77a782d1056b07f8197bd3 (patch)
tree45ba61851044e31d4b3a8e2d1a0132e985656db9 /test-suite/success/bteauto.v
parent9e6696d67c7613b665799f7fe7f1a35cf4daf4b3 (diff)
bteauto: a Proofview.tactic for multiple goals
Add an option to force backtracking at toplevel, which is used by default when calling typeclasses eauto on a set of goals. They might be depended on by other subgoals, so the tactic should be backtracking by default, a once can make it not backtrack.
Diffstat (limited to 'test-suite/success/bteauto.v')
-rw-r--r--test-suite/success/bteauto.v40
1 files changed, 40 insertions, 0 deletions
diff --git a/test-suite/success/bteauto.v b/test-suite/success/bteauto.v
new file mode 100644
index 000000000..f55e32032
--- /dev/null
+++ b/test-suite/success/bteauto.v
@@ -0,0 +1,40 @@
+
+Class A := { foo : nat }.
+
+Instance A_1 : A | 2 := { foo := 42 }.
+Instance A_0 : A | 1 := { foo := 0 }.
+Lemma aeq (a : A) : foo = foo.
+ reflexivity.
+Qed.
+
+Goal exists n, n = 42.
+ eexists.
+ eapply eq_trans.
+ evar (a : A). subst a.
+ refine (@aeq ?a).
+ Unshelve. all:cycle 1.
+ typeclasses eauto.
+ Fail reflexivity.
+ Undo 2.
+ Set Typeclasses Debug.
+ (* Without multiple successes it fails *)
+ Fail all:((once typeclasses eauto) + reflexivity).
+ (* Does backtrack if other goals fail *)
+ all:((typeclasses eauto) + reflexivity).
+Qed.
+
+Hint Extern 0 (_ = _) => reflexivity : typeclass_instances.
+
+Goal exists n, n = 42.
+ eexists.
+ eapply eq_trans.
+ evar (a : A). subst a.
+ refine (@aeq ?a).
+ Unshelve. all:cycle 1.
+ typeclasses eauto.
+ Fail reflexivity.
+ Undo 2.
+ Set Typeclasses Debug.
+ (* Does backtrack between individual goals *)
+ all:(typeclasses eauto).
+Qed.