aboutsummaryrefslogtreecommitdiff
path: root/src/Util/Tactics/SimplifyProjections.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Util/Tactics/SimplifyProjections.v')
-rw-r--r--src/Util/Tactics/SimplifyProjections.v32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/Util/Tactics/SimplifyProjections.v b/src/Util/Tactics/SimplifyProjections.v
new file mode 100644
index 000000000..f9b319057
--- /dev/null
+++ b/src/Util/Tactics/SimplifyProjections.v
@@ -0,0 +1,32 @@
+(** [simplify_projections] reduces terms of the form [fst (_, _)] (for
+ any projection from [prod], [sig], [sigT], or [and]) *)
+Ltac pre_simplify_projection proj proj' uproj' :=
+ pose proj as proj';
+ pose proj as uproj';
+ unfold proj in uproj';
+ change proj with proj'.
+Ltac do_simplify_projection_2Targ_4carg_step proj proj' uproj' construct :=
+ change proj' with uproj' at 1;
+ lazymatch goal with
+ | [ |- appcontext[uproj' _ _ (construct _ _ _ _)] ]
+ => cbv beta iota delta [uproj']
+ | _ => change uproj' with proj
+ end.
+Ltac do_simplify_projection_2Targ_4carg proj proj' uproj' construct :=
+ repeat do_simplify_projection_2Targ_4carg_step proj proj' uproj' construct.
+Ltac simplify_projection_2Targ_4carg proj construct :=
+ let proj' := fresh "proj" in
+ let uproj' := fresh "proj" in
+ pre_simplify_projection proj proj' uproj';
+ do_simplify_projection_2Targ_4carg proj proj' uproj' construct;
+ clear proj' uproj'.
+
+Ltac simplify_projections :=
+ repeat (simplify_projection_2Targ_4carg @fst @pair
+ || simplify_projection_2Targ_4carg @snd @pair
+ || simplify_projection_2Targ_4carg @proj1_sig @exist
+ || simplify_projection_2Targ_4carg @proj2_sig @exist
+ || simplify_projection_2Targ_4carg @projT1 @existT
+ || simplify_projection_2Targ_4carg @projT2 @existT
+ || simplify_projection_2Targ_4carg @proj1 @conj
+ || simplify_projection_2Targ_4carg @proj2 @conj).