diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v index 049649aa67f5b46d1bc528e39f23ae83c16181b6..7ad7a193a58595650ecc743641f057fea74efbb5 100644 --- a/theories/proofmode/tactics.v +++ b/theories/proofmode/tactics.v @@ -41,11 +41,9 @@ Ltac iMissingHyps Hs := let Hhyps := eval env_cbv in (envs_dom Δ) in eval vm_compute in (list_difference Hs Hhyps). -Tactic Notation "iTypeOf" constr(H) tactic(tac):= +Ltac iTypeOf H := let Δ := match goal with |- of_envs ?Δ ⊢ _ => Δ end in - lazymatch eval env_cbv in (envs_lookup H Δ) with - | Some (?p,?P) => tac p P - end. + eval env_cbv in (envs_lookup H Δ). Tactic Notation "iMatchHyp" tactic1(tac) := match goal with @@ -431,7 +429,7 @@ Local Tactic Notation "iSpecializePat" constr(H) constr(pat) := end |env_reflexivity || let Hs' := iMissingHyps Hs' in - fail "iSpecialize: hypotheses" Hs' "not found in the context" + fail "iSpecialize: hypotheses" Hs' "not found" |iFrame Hs_frame; done_if d (*goal*) |go H1 pats] | SAutoFrame GPersistent :: ?pats => @@ -567,8 +565,10 @@ Tactic Notation "iApply" open_constr(lem) := |apply _ |lazy beta (* reduce betas created by instantiation *)] |iSpecializePat H "[]"; last go H] in - iPoseProofCore lem as false true (fun H => - first [iExact H|go H|iTypeOf H (fun _ Q => fail "iApply: cannot apply" Q)]). + iPoseProofCore lem as false true (fun H => first + [iExact H + |go H + |lazymatch iTypeOf H with Some (_,?Q) => fail "iApply: cannot apply" Q end]). (** * Revert *) Local Tactic Notation "iForallRevert" ident(x) := @@ -687,7 +687,7 @@ Tactic Notation "iSplitL" constr(Hs) := fail "iSplitL:" P "not a separating conjunction" |env_reflexivity || let Hs := iMissingHyps Hs in - fail "iSplitL: hypotheses" Hs "not found in the context" + fail "iSplitL: hypotheses" Hs "not found" | |]. Tactic Notation "iSplitR" constr(Hs) := @@ -699,7 +699,7 @@ Tactic Notation "iSplitR" constr(Hs) := fail "iSplitR:" P "not a separating conjunction" |env_reflexivity || let Hs := iMissingHyps Hs in - fail "iSplitR: hypotheses" Hs "not found in the context" + fail "iSplitR: hypotheses" Hs "not found" | |]. Tactic Notation "iSplitL" := iSplitR "". @@ -727,7 +727,7 @@ Tactic Notation "iCombine" constr(Hs) "as" constr(H) := eapply tac_combine with _ _ Hs _ _ H _; [env_reflexivity || let Hs := iMissingHyps Hs in - fail "iCombine: hypotheses" Hs "not found in the context" + fail "iCombine: hypotheses" Hs "not found" |apply _ |env_reflexivity || fail "iCombine:" H "not fresh"|]. @@ -1120,17 +1120,18 @@ Tactic Notation "iDestructCore" open_constr(lem) "as" constr(p) tactic(tac) := (which cannot be kept). *) lazymatch hyp_name with | None => iPoseProofCore lem as p false tac - | Some ?H => iTypeOf H (fun q P => - lazymatch q with - | true => + | Some ?H => + lazymatch iTypeOf H with + | None => fail "iDestruct:" H "not found" + | Some (true, ?P) => (* persistent hypothesis, check for a CopyDestruct instance *) tryif (let dummy := constr:(_ : CopyDestruct P) in idtac) then (iPoseProofCore lem as p false tac) else (iSpecializeCore lem as p; last (tac H)) - | false => + | Some (false, ?P) => (* spatial hypothesis, cannot copy *) iSpecializeCore lem as p; last (tac H) - end) + end end end. @@ -1352,7 +1353,7 @@ Tactic Notation "iAssertCore" open_constr(Q) end |env_reflexivity || let Hs' := iMissingHyps Hs' in - fail "iAssert: hypotheses" Hs' "not found in the context" + fail "iAssert: hypotheses" Hs' "not found" |env_reflexivity |iFrame Hs_frame; done_if d (*goal*) |tac H] @@ -1360,7 +1361,7 @@ Tactic Notation "iAssertCore" open_constr(Q) eapply tac_assert_persistent with _ _ _ lr Hs' H Q; [env_reflexivity || let Hs' := iMissingHyps Hs' in - fail "iAssert: hypotheses" Hs' "not found in the context" + fail "iAssert: hypotheses" Hs' "not found" |env_reflexivity |apply _ || fail "iAssert:" Q "not persistent" |done_if d (*goal*)