diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v index b580a047a07a815e14afba439f98cf1d87fd66af..6da1b9bb36336f82ed0a138ffcb06a2af585f2ad 100644 --- a/theories/proofmode/tactics.v +++ b/theories/proofmode/tactics.v @@ -709,6 +709,7 @@ Local Tactic Notation "iDestructHyp" constr(H) "as" "(" simple_intropattern(x1) (** * Introduction tactic *) Local Tactic Notation "iIntro" "(" simple_intropattern(x) ")" := + try iStartProof; try first [(* (∀ _, _) *) apply tac_forall_intro |(* (?P → _) *) eapply tac_impl_intro_pure; @@ -721,7 +722,9 @@ Local Tactic Notation "iIntro" "(" simple_intropattern(x) ")" := |(* ⌜_ → _⌠*) apply tac_pure_impl_intro]; intros x. -Local Tactic Notation "iIntro" constr(H) := first +Local Tactic Notation "iIntro" constr(H) := + iStartProof; + first [ (* (?Q → _) *) eapply tac_impl_intro with _ H; (* (i:=H) *) [reflexivity || fail 1 "iIntro: introducing" H @@ -732,7 +735,9 @@ Local Tactic Notation "iIntro" constr(H) := first [env_cbv; reflexivity || fail 1 "iIntro:" H "not fresh"|] | fail 1 "iIntro: nothing to introduce" ]. -Local Tactic Notation "iIntro" "#" constr(H) := first +Local Tactic Notation "iIntro" "#" constr(H) := + iStartProof; + first [ (* (?P → _) *) eapply tac_impl_intro_persistent with _ H _; (* (i:=H) *) [let P := match goal with |- IntoPersistentP ?P _ => P end in @@ -746,12 +751,14 @@ Local Tactic Notation "iIntro" "#" constr(H) := first | fail 1 "iIntro: nothing to introduce" ]. Local Tactic Notation "iIntroForall" := + try iStartProof; lazymatch goal with | |- ∀ _, ?P => fail | |- ∀ _, _ => intro | |- _ ⊢ (∀ x : _, _) => iIntro (x) end. Local Tactic Notation "iIntro" := + try iStartProof; lazymatch goal with | |- _ → ?P => intro | |- _ ⊢ (_ -∗ _) => iIntro (?) || let H := iFresh in iIntro #H || iIntro H @@ -785,11 +792,11 @@ Tactic Notation "iIntros" constr(pat) := | ?pat :: ?pats => let H := iFresh in iIntro H; iDestructHyp H as pat; go pats end - in let pats := intro_pat.parse pat in iStartProof; go pats. + in let pats := intro_pat.parse pat in go pats. Tactic Notation "iIntros" := iIntros [IAll]. Tactic Notation "iIntros" "(" simple_intropattern(x1) ")" := - try iStartProof; iIntro ( x1 ). + iIntro ( x1 ). Tactic Notation "iIntros" "(" simple_intropattern(x1) simple_intropattern(x2) ")" := iIntros ( x1 ); iIntro ( x2 ).