aboutsummaryrefslogtreecommitdiff
path: root/src/Util/Tactics
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2017-03-31 16:14:27 -0400
committerGravatar Jason Gross <jgross@mit.edu>2017-03-31 16:15:33 -0400
commitd1ff24b6e9dcd81ec70729143d90ff3e96dea313 (patch)
tree8df0af3be3585ab422ae41ad57a57039626e2c9d /src/Util/Tactics
parente97200ea903c57574026c6b6d0be73ad0bfed991 (diff)
Add [etransitivity y], [etransitivity_rev] tactics
Diffstat (limited to 'src/Util/Tactics')
-rw-r--r--src/Util/Tactics/ETransitivity.v14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/Util/Tactics/ETransitivity.v b/src/Util/Tactics/ETransitivity.v
new file mode 100644
index 000000000..c6fe59318
--- /dev/null
+++ b/src/Util/Tactics/ETransitivity.v
@@ -0,0 +1,14 @@
+Require Import Coq.Classes.RelationClasses.
+
+Tactic Notation "etransitivity" open_constr(y) :=
+ let R := match goal with |- ?R ?x ?z => constr:(R) end in
+ let x := match goal with |- ?R ?x ?z => constr:(x) end in
+ let z := match goal with |- ?R ?x ?z => constr:(z) end in
+ let pre_proof_term_head := constr:(@transitivity _ R _) in
+ let proof_term_head := (eval cbn in pre_proof_term_head) in
+ refine (proof_term_head x y z _ _); [ change (R x y) | change (R y z) ].
+Tactic Notation "etransitivity" := etransitivity _.
+Tactic Notation "etransitivity_rev" uconstr(y) := [ > etransitivity y; cycle 1.. ].
+Tactic Notation "etransitivity_rev" := etransitivity_rev _.
+
+Ltac transitivity_rev y := [ > transitivity y; cycle 1.. ].