diff --git a/theories/proofmode/ltac_tactics.v b/theories/proofmode/ltac_tactics.v index e48d17176c9275f4be9cf15a9a5a15ae1d72f1b5..5e5ec2b3fffbafcadc3b201c38a754f3edcb4734 100644 --- a/theories/proofmode/ltac_tactics.v +++ b/theories/proofmode/ltac_tactics.v @@ -41,6 +41,11 @@ performance and horrible error messages, so we wrap it in a [once]. *) Ltac iSolveTC := solve [once (typeclasses eauto)]. +(** Tactic used for solving side-conditions arising from TC resolution in iMod +and iInv. *) +Ltac iSolveSideCondition := + try (split_and?; solve [ fast_done | solve_ndisj ]). + (** * Misc *) Ltac iMissingHyps Hs := @@ -1005,7 +1010,7 @@ Tactic Notation "iModCore" constr(H) := let P := match goal with |- ElimModal _ _ _ ?P _ _ _ => P end in let Q := match goal with |- ElimModal _ _ _ _ _ ?Q _ => Q end in fail "iMod: cannot eliminate modality " P "in" Q - |try fast_done (* optional side-condition *) + |iSolveSideCondition |env_reflexivity|]. (** * Basic destruct tactic *) @@ -1920,7 +1925,7 @@ Tactic Notation "iInvCore" constr(select) "with" constr(pats) "as" open_constr(H [iSolveTC || let I := match goal with |- ElimInv _ ?I _ _ _ _ _ => I end in fail "iInv: cannot eliminate invariant " I - |try (split_and?; solve [ fast_done | solve_ndisj ]) + |iSolveSideCondition |let R := fresh in intros R; eexists; split; [env_reflexivity|]; (* Now we are left proving [envs_entails Δ'' R]. *) iSpecializePat H pats; last (