diff --git a/iris/proofmode/base.v b/iris/proofmode/base.v index db4811a3b955caeb88813d9688f9477414504151..8144fc88728abea35956f94c4150dc1f63df7004 100644 --- a/iris/proofmode/base.v +++ b/iris/proofmode/base.v @@ -14,10 +14,10 @@ that in Ltac2. For most proofmode tactics we only need to iterate over a list and [ltac1_list_rev_iter] allow us to do that while encapsulating the Ltac2 code. These tactics can be used as: - Ltac iTactic_ xs := + Ltac _iTactic xs := ltac1_list_rev_iter ltac:(fun x => /* stuff */) xs. Tactic Notation "iTactic" "(" ne_ident_list(xs) ")" := - iTactic_ xs. + _iTactic xs. It is important to note that given one n-ary [Tactic Notation] we cannot call another n-ary [Tactic Notation]. For example, the following does NOT work: @@ -27,12 +27,12 @@ another n-ary [Tactic Notation]. For example, the following does NOT work: iTactic (xs). Because of this reason, as already shown above, we typically provide an [Ltac] -called [iTactic_] (note the underscore), and define the [Tactic Notation] as a -wrapper, allowing us to write: +called [_iTactic] (note the underscore to mark it is "private"), and define the +[Tactic Notation] as a wrapper, allowing us to write: Tactic Notation "iAnotherTactic" "(" ne_ident_list(xs) ")" := /* stuff */ - iTactic_ xs. + _iTactic xs. *) Ltac2 of_ltac1_list l := Option.get (Ltac1.to_list l). @@ -48,11 +48,11 @@ Ltac ltac1_list_rev_iter tac l := go tac l. (** Since the Ltac1-Ltac2 API only supports unit-returning functions, there is -no nice way to call [Ltac]s such as [iTactic_] above with the empty list. We -therefore often define a special version [iTactic0_] for the empty list. This +no nice way to call [Ltac]s such as [_iTactic] above with the empty list. We +therefore often define a special version [_iTactic0] for the empty list. This version can be created using [with_ltac1_nil]: - Ltac iTactic0_ := with_ltac1_nil ltac:(fun xs => iTactic_ xs) + Ltac _iTactic0 := with_ltac1_nil ltac:(fun xs => _iTactic xs) *) Ltac with_ltac1_nil tac := let go := ltac2:(tac |- ltac1:(tac l |- tac l) tac (Ltac1.of_list [])) in diff --git a/iris/proofmode/ltac_tactics.v b/iris/proofmode/ltac_tactics.v index 0e2b3bfa01e24fd09781b5b637007bb7da90d2b3..00497ab83640f3e19b12b74b99af522a55b75d31 100644 --- a/iris/proofmode/ltac_tactics.v +++ b/iris/proofmode/ltac_tactics.v @@ -422,26 +422,26 @@ Ltac iFrameAnySpatial := let Hs := eval cbv in (env_dom (env_spatial Δ)) in go Hs end. -Local Ltac iFrame_go Hs := +Local Ltac _iFrame_go Hs := lazymatch Hs with | [] => idtac - | SelPure :: ?Hs => iFrameAnyPure; iFrame_go Hs - | SelIntuitionistic :: ?Hs => iFrameAnyIntuitionistic; iFrame_go Hs - | SelSpatial :: ?Hs => iFrameAnySpatial; iFrame_go Hs - | SelIdent ?H :: ?Hs => iFrameHyp H; iFrame_go Hs + | SelPure :: ?Hs => iFrameAnyPure; _iFrame_go Hs + | SelIntuitionistic :: ?Hs => iFrameAnyIntuitionistic; _iFrame_go Hs + | SelSpatial :: ?Hs => iFrameAnySpatial; _iFrame_go Hs + | SelIdent ?H :: ?Hs => iFrameHyp H; _iFrame_go Hs end. -Ltac iFrame0_ Hs := +Ltac _iFrame0 Hs := let Hs := sel_pat.parse Hs in - iFrame_go Hs. -Ltac iFrame_ ts Hs := + _iFrame_go Hs. +Ltac _iFrame ts Hs := ltac1_list_iter iFramePure ts; - iFrame0_ Hs. + _iFrame0 Hs. Tactic Notation "iFrame" := iFrameAnySpatial. -Tactic Notation "iFrame" "(" ne_constr_list(ts) ")" := iFrame_ ts "". -Tactic Notation "iFrame" constr(Hs) := iFrame0_ Hs. -Tactic Notation "iFrame" "(" ne_constr_list(ts) ")" constr(Hs) := iFrame_ ts Hs. +Tactic Notation "iFrame" "(" ne_constr_list(ts) ")" := _iFrame ts "". +Tactic Notation "iFrame" constr(Hs) := _iFrame0 Hs. +Tactic Notation "iFrame" "(" ne_constr_list(ts) ")" constr(Hs) := _iFrame ts Hs. Tactic Notation "iFrame" "select" open_constr(pat) := iSelect pat ltac:(fun H => iFrameHyp H). @@ -635,26 +635,26 @@ Tactic Notation "iRevertHyp" constr(H) "with" tactic1(tac) := Tactic Notation "iRevertHyp" constr(H) := iRevertHyp H with (fun _ => idtac). -Ltac iRevert_go Hs := +Ltac _iRevert_go Hs := lazymatch Hs with | [] => idtac | ESelPure :: ?Hs => repeat match goal with x : _ |- _ => revert x end; - iRevert_go Hs - | ESelIdent _ ?H :: ?Hs => iRevertHyp H; iRevert_go Hs + _iRevert_go Hs + | ESelIdent _ ?H :: ?Hs => iRevertHyp H; _iRevert_go Hs end. -Ltac iRevert0_ Hs := +Ltac _iRevert0 Hs := iStartProof; let Hs := iElaborateSelPat Hs in - iRevert_go Hs. -Ltac iRevert_ xs Hs := - iRevert0_ Hs; + _iRevert_go Hs. +Ltac _iRevert xs Hs := + _iRevert0 Hs; ltac1_list_rev_iter iForallRevert xs. -Tactic Notation "iRevert" constr(Hs) := iRevert0_ Hs. -Tactic Notation "iRevert" "(" ne_ident_list(xs) ")" := iRevert_ xs "". -Tactic Notation "iRevert" "(" ne_ident_list(xs) ")" constr(Hs) := iRevert_ xs Hs. +Tactic Notation "iRevert" constr(Hs) := _iRevert0 Hs. +Tactic Notation "iRevert" "(" ne_ident_list(xs) ")" := _iRevert xs "". +Tactic Notation "iRevert" "(" ne_ident_list(xs) ")" constr(Hs) := _iRevert xs Hs. Tactic Notation "iRevert" "select" open_constr(pat) := iSelect pat ltac:(fun H => iRevertHyp H). @@ -1257,7 +1257,7 @@ Local Tactic Notation "iAndDestructChoice" constr(H) "as" constr(d) constr(H') : (** * Existential *) -Ltac iExists_ x := +Ltac _iExists x := iStartProof; eapply tac_exist; [tc_solve || @@ -1267,7 +1267,7 @@ Ltac iExists_ x := (* subgoal *) ]. Tactic Notation "iExists" ne_uconstr_list_sep(xs,",") := - ltac1_list_iter iExists_ xs. + ltac1_list_iter _iExists xs. Local Tactic Notation "iExistDestruct" constr(H) "as" simple_intropattern(x) constr(Hx) := @@ -1458,17 +1458,17 @@ Local Ltac iDestructHypFindPat Hgo pat found pats := end end. -Ltac iDestructHyp0_ H pat := +Ltac _iDestructHyp0 H pat := let pats := intro_pat.parse pat in iDestructHypFindPat H pat false pats. -Ltac iDestructHyp_ H xs pat := +Ltac _iDestructHyp H xs pat := ltac1_list_iter ltac:(fun x => iExistDestruct H as x H) xs; - iDestructHyp0_ H pat. + _iDestructHyp0 H pat. Tactic Notation "iDestructHyp" constr(H) "as" constr(pat) := - iDestructHyp0_ H pat. + _iDestructHyp0 H pat. Tactic Notation "iDestructHyp" constr(H) "as" - "(" ne_simple_intropattern_list(xs) ")" constr(pat) := iDestructHyp_ H xs pat. + "(" ne_simple_intropattern_list(xs) ")" constr(pat) := _iDestructHyp H xs pat. (** * Combinining hypotheses *) Tactic Notation "iCombine" constr(Hs) "as" constr(pat) := @@ -1560,7 +1560,7 @@ Tactic Notation "iCombine" constr(H1) constr(H2) "as" constr(pat1) iCombine [H1;H2] as pat1 gives %pat2. (** * Introduction tactic *) -Ltac iIntros_go pats startproof := +Ltac _iIntros_go pats startproof := lazymatch pats with | [] => lazymatch startproof with @@ -1572,70 +1572,70 @@ Ltac iIntros_go pats startproof := let i := fresh in iIntro (i); rename_by_string i s; - iIntros_go pats startproof - | IPure IGallinaAnon :: ?pats => iIntro (?); iIntros_go pats startproof - | IIntuitionistic (IIdent ?H) :: ?pats => iIntro #H; iIntros_go pats false - | IDrop :: ?pats => iIntro _; iIntros_go pats startproof - | IIdent ?H :: ?pats => iIntro H; iIntros_go pats startproof + _iIntros_go pats startproof + | IPure IGallinaAnon :: ?pats => iIntro (?); _iIntros_go pats startproof + | IIntuitionistic (IIdent ?H) :: ?pats => iIntro #H; _iIntros_go pats false + | IDrop :: ?pats => iIntro _; _iIntros_go pats startproof + | IIdent ?H :: ?pats => iIntro H; _iIntros_go pats startproof (* Introduction patterns that can only occur at the top-level *) - | IPureIntro :: ?pats => iPureIntro; iIntros_go pats false - | IModalIntro :: ?pats => iModIntro; iIntros_go pats false - | IForall :: ?pats => repeat iIntroForall; iIntros_go pats startproof - | IAll :: ?pats => repeat (iIntroForall || iIntro); iIntros_go pats startproof + | IPureIntro :: ?pats => iPureIntro; _iIntros_go pats false + | IModalIntro :: ?pats => iModIntro; _iIntros_go pats false + | IForall :: ?pats => repeat iIntroForall; _iIntros_go pats startproof + | IAll :: ?pats => repeat (iIntroForall || iIntro); _iIntros_go pats startproof (* Clearing and simplifying introduction patterns *) - | ISimpl :: ?pats => simpl; iIntros_go pats startproof - | IClear ?H :: ?pats => iClear H; iIntros_go pats false - | IClearFrame ?H :: ?pats => iFrame H; iIntros_go pats false - | IDone :: ?pats => try done; iIntros_go pats startproof + | ISimpl :: ?pats => simpl; _iIntros_go pats startproof + | IClear ?H :: ?pats => iClear H; _iIntros_go pats false + | IClearFrame ?H :: ?pats => iFrame H; _iIntros_go pats false + | IDone :: ?pats => try done; _iIntros_go pats startproof (* Introduction + destruct *) | IIntuitionistic ?pat :: ?pats => - let H := iFresh in iIntro #H; iDestructHyp H as pat; iIntros_go pats false + let H := iFresh in iIntro #H; iDestructHyp H as pat; _iIntros_go pats false | ?pat :: ?pats => - let H := iFresh in iIntro H; iDestructHyp H as pat; iIntros_go pats false + let H := iFresh in iIntro H; iDestructHyp H as pat; _iIntros_go pats false end. -Ltac iIntros0_ pat := +Ltac _iIntros0 pat := let pats := intro_pat.parse pat in - iIntros_go pats true. -Ltac iIntros_ xs pat := + _iIntros_go pats true. +Ltac _iIntros xs pat := ltac1_list_iter ltac:(fun x => iIntro (x)) xs; - iIntros0_ pat. + _iIntros0 pat. -Tactic Notation "iIntros" := iIntros0_ [IAll]. -Tactic Notation "iIntros" constr(pat) := iIntros0_ pat. +Tactic Notation "iIntros" := _iIntros0 [IAll]. +Tactic Notation "iIntros" constr(pat) := _iIntros0 pat. Tactic Notation "iIntros" "(" ne_simple_intropattern_list(xs) ")" := - iIntros_ xs "". + _iIntros xs "". Tactic Notation "iIntros" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iIntros_ xs pat. + _iIntros xs pat. Tactic Notation "iIntros" constr(pat) "(" ne_simple_intropattern_list(xs) ")" := - iIntros0_ pat; iIntros_ xs "". + _iIntros0 pat; _iIntros xs "". Tactic Notation "iIntros" constr(pat1) "(" ne_simple_intropattern_list(xs) ")" constr(pat2) := - iIntros0_ pat1; iIntros_ xs pat2. + _iIntros0 pat1; _iIntros xs pat2. (* Used for generalization in [iInduction] and [iLöb] *) -Ltac iRevertIntros_go Hs tac := +Ltac _iRevertIntros_go Hs tac := lazymatch Hs with | [] => tac () | ESelPure :: ?Hs => fail "iRevertIntros: % not supported" - | ESelIdent ?p ?H :: ?Hs => iRevertHyp H; iRevertIntros_go Hs tac; iIntro H as p + | ESelIdent ?p ?H :: ?Hs => iRevertHyp H; _iRevertIntros_go Hs tac; iIntro H as p end. -Ltac iRevertIntros0_ Hs tac := +Ltac _iRevertIntros0 Hs tac := try iStartProof; let Hs := iElaborateSelPat Hs in - iRevertIntros_go Hs tac. -Ltac iRevertIntros_ xs Hs tac := - iRevertIntros0_ Hs ltac:(fun _ => iRevert_ xs ""; tac (); iIntros_ xs ""). + _iRevertIntros_go Hs tac. +Ltac _iRevertIntros xs Hs tac := + _iRevertIntros0 Hs ltac:(fun _ => _iRevert xs ""; tac (); _iIntros xs ""). Tactic Notation "iRevertIntros" constr(Hs) "with" tactic3(tac) := - iRevertIntros0_ Hs tac. + _iRevertIntros0 Hs tac. Tactic Notation "iRevertIntros" "(" ne_ident_list(xs) ")" constr(Hs) "with" tactic3(tac):= - iRevertIntros_ xs Hs tac. + _iRevertIntros xs Hs tac. Tactic Notation "iRevertIntros" "with" tactic3(tac) := - iRevertIntros0_ "" tac. + _iRevertIntros0 "" tac. Tactic Notation "iRevertIntros" "(" ne_ident_list(xs) ")" "with" tactic3(tac):= - iRevertIntros_ xs "" tac. + _iRevertIntros xs "" tac. (** * Destruct and PoseProof tactics *) (** The tactics [iDestruct] and [iPoseProof] are similar, but there are some @@ -1681,25 +1681,25 @@ Tactic Notation "iDestructCore" open_constr(lem) "as" constr(p) tactic3(tac) := | _ => iPoseProofCore lem as p tac end. -Ltac iDestruct0_ lem pat := +Ltac _iDestruct0 lem pat := iDestructCore lem as pat (fun H => iDestructHyp H as pat). -Ltac iDestruct_ lem xs pat := - iDestructCore lem as pat (fun H => iDestructHyp_ H xs pat). +Ltac _iDestruct lem xs pat := + iDestructCore lem as pat (fun H => _iDestructHyp H xs pat). Tactic Notation "iDestruct" open_constr(lem) "as" constr(pat) := - iDestruct0_ lem pat. + _iDestruct0 lem pat. Tactic Notation "iDestruct" open_constr(lem) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iDestruct_ lem xs pat. + _iDestruct lem xs pat. Tactic Notation "iDestruct" open_constr(lem) "as" "%" simple_intropattern(pat) := iDestructCore lem as true (fun H => iPure H as pat). Tactic Notation "iDestruct" "select" open_constr(pat) "as" constr(ipat) := - iSelect pat ltac:(fun H => iDestruct0_ H ipat). + iSelect pat ltac:(fun H => _iDestruct0 H ipat). Tactic Notation "iDestruct" "select" open_constr(pat) "as" "(" ne_simple_intropattern_list(xs) ")" constr(ipat) := - iSelect pat ltac:(fun H => iDestruct_ H xs ipat). + iSelect pat ltac:(fun H => _iDestruct H xs ipat). Tactic Notation "iDestruct" "select" open_constr(pat) "as" "%" simple_intropattern(ipat) := iSelect pat ltac:(fun H => iDestruct H as % ipat). @@ -1707,7 +1707,7 @@ Tactic Notation "iPoseProof" open_constr(lem) "as" constr(pat) := iPoseProofCore lem as pat (fun H => iDestructHyp H as pat). Tactic Notation "iPoseProof" open_constr(lem) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iPoseProofCore lem as pat (fun H => iDestructHyp_ H xs pat). + iPoseProofCore lem as pat (fun H => _iDestructHyp H xs pat). (** * Induction *) (* An invocation of [iInduction (x) as pat IH forall (x1...xn) Hs] will @@ -1761,48 +1761,48 @@ Ltac iHypsContaining x := let Γs := lazymatch goal with |- envs_entails (Envs _ ?Γs _) _ => Γs end in let Hs := go Γp x (@nil ident) in go Γs x Hs. -Ltac iInduction_ x xs Hs tac IH := +Ltac _iInduction x xs Hs tac IH := (* FIXME: We should be able to do this in a more sane way, by concatenating the spec patterns instead of calling [iRevertIntros] multiple times. *) - iRevertIntros0_ Hs ltac:(fun _ => - iRevertIntros_ xs "∗" ltac:(fun _ => + _iRevertIntros0 Hs ltac:(fun _ => + _iRevertIntros xs "∗" ltac:(fun _ => let Hsx := iHypsContaining x in - iRevertIntros0_ Hsx ltac:(fun _ => + _iRevertIntros0 Hsx ltac:(fun _ => iInductionCore tac as IH ) ) ). -Ltac iInduction0_ x Hs tac IH := - with_ltac1_nil ltac:(fun xs => iInduction_ x xs Hs tac IH). +Ltac _iInduction0 x Hs tac IH := + with_ltac1_nil ltac:(fun xs => _iInduction x xs Hs tac IH). (* Without induction scheme *) Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) := - iInduction0_ x "" ltac:(fun _ => induction x as pat) IH. + _iInduction0 x "" ltac:(fun _ => induction x as pat) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "forall" "(" ne_ident_list(xs) ")" := - iInduction_ x xs "" ltac:(fun _ => induction x as pat) IH. + _iInduction x xs "" ltac:(fun _ => induction x as pat) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "forall" constr(Hs) := - iInduction0_ x Hs ltac:(fun _ => induction x as pat) IH. + _iInduction0 x Hs ltac:(fun _ => induction x as pat) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "forall" "(" ne_ident_list(xs) ")" constr(Hs) := - iInduction_ x xs Hs ltac:(fun _ => induction x as pat) IH. + _iInduction x xs Hs ltac:(fun _ => induction x as pat) IH. (* With induction scheme *) Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "using" uconstr(u) := - iInduction0_ x "" ltac:(fun _ => induction x as pat using u) IH. + _iInduction0 x "" ltac:(fun _ => induction x as pat using u) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "using" uconstr(u) "forall" "(" ne_ident_list(xs) ")" := - iInduction_ x xs "" ltac:(fun _ => induction x as pat using u) IH. + _iInduction x xs "" ltac:(fun _ => induction x as pat using u) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "using" uconstr(u) "forall" constr(Hs) := - iInduction0_ x Hs ltac:(fun _ => induction x as pat using u) IH. + _iInduction0 x Hs ltac:(fun _ => induction x as pat using u) IH. Tactic Notation "iInduction" constr(x) "as" simple_intropattern(pat) constr(IH) "using" uconstr(u) "forall" "(" ne_ident_list(xs) ")" constr(Hs) := - iInduction_ x xs Hs ltac:(fun _ => induction x as pat using u) IH. + _iInduction x xs Hs ltac:(fun _ => induction x as pat using u) IH. (** * Löb Induction *) Tactic Notation "iLöbCore" "as" constr (IH) := @@ -1821,25 +1821,25 @@ Tactic Notation "iLöbCore" "as" constr (IH) := | _ => idtac end]. -Ltac iLöb_ xs Hs IH := +Ltac _iLöb xs Hs IH := (* FIXME: We should be able to do this in a more sane way, by concatenating the spec patterns instead of calling [iRevertIntros] multiple times. *) - iRevertIntros0_ Hs ltac:(fun _ => - iRevertIntros_ xs "∗" ltac:(fun _ => + _iRevertIntros0 Hs ltac:(fun _ => + _iRevertIntros xs "∗" ltac:(fun _ => iLöbCore as IH ) ). -Ltac iLöb0_ Hs IH := - with_ltac1_nil ltac:(fun xs => iLöb_ xs Hs IH). +Ltac _iLöb0 Hs IH := + with_ltac1_nil ltac:(fun xs => _iLöb xs Hs IH). Tactic Notation "iLöb" "as" constr (IH) := - iLöb0_ "" IH. + _iLöb0 "" IH. Tactic Notation "iLöb" "as" constr (IH) "forall" "(" ne_ident_list(xs) ")" := - iLöb_ xs "" IH. + _iLöb xs "" IH. Tactic Notation "iLöb" "as" constr (IH) "forall" constr(Hs) := - iLöb0_ Hs IH. + _iLöb0 Hs IH. Tactic Notation "iLöb" "as" constr (IH) "forall" "(" ne_ident_list(xs) ")" constr(Hs) := - iLöb0_ xs Hs IH. + _iLöb0 xs Hs IH. (** * Assert *) (* The argument [p] denotes whether [Q] is persistent. It can either be a @@ -1866,16 +1866,16 @@ Tactic Notation "iAssertCore" open_constr(Q) "as" constr(p) tactic3(tac) := end. Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) := - iAssertCore Q with Hs as pat (fun H => iDestructHyp0_ H pat). + iAssertCore Q with Hs as pat (fun H => _iDestructHyp0 H pat). Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iAssertCore Q with Hs as pat (fun H => iDestructHyp_ H xs pat). + iAssertCore Q with Hs as pat (fun H => _iDestructHyp H xs pat). Tactic Notation "iAssert" open_constr(Q) "as" constr(pat) := - iAssertCore Q as pat (fun H => iDestructHyp0_ H pat). + iAssertCore Q as pat (fun H => _iDestructHyp0 H pat). Tactic Notation "iAssert" open_constr(Q) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iAssertCore Q as pat (fun H => iDestructHyp_ H xs pat). + iAssertCore Q as pat (fun H => _iDestructHyp H xs pat). Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" "%" simple_intropattern(pat) := @@ -1938,7 +1938,7 @@ Tactic Notation "iMod" open_constr(lem) "as" constr(pat) := iDestructCore lem as false (fun H => iModCore H as H; last iDestructHyp H as pat). Tactic Notation "iMod" open_constr(lem) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iDestructCore lem as false (fun H => iModCore H as H; last iDestructHyp_ H xs pat). + iDestructCore lem as false (fun H => iModCore H as H; last _iDestructHyp H xs pat). Tactic Notation "iMod" open_constr(lem) "as" "%" simple_intropattern(pat) := iDestructCore lem as false (fun H => iModCore H as H; iPure H as pat). @@ -2017,13 +2017,13 @@ Tactic Notation "iInvCore" constr(N) "as" constr(Hclose) "in" tactic3(tac) := Tactic Notation "iInvCore" constr(N) "in" tactic3(tac) := iInvCore N with "[$]" as (@None string) in tac. -Ltac iDestructAccAndHyp0 pat x H := +Ltac _iDestructAccAndHyp0 pat x H := lazymatch type of x with - | unit => destruct x as []; iDestructHyp0_ H pat + | unit => destruct x as []; _iDestructHyp0 H pat | _ => fail "Missing intro pattern for accessor variable" end. -Ltac iDestructAccAndHyp xs pat x H := +Ltac _iDestructAccAndHyp xs pat x H := let go := ltac2:(tac xs |- match of_ltac1_list xs with | [] => @@ -2033,37 +2033,37 @@ Ltac iDestructAccAndHyp xs pat x H := ltac1:(tac xs' |- tac xs') tac (Ltac1.of_list xs') end) in lazymatch type of x with - | unit => destruct x as []; iDestructHyp_ H xs pat - | _ => revert x; go ltac:(fun xs' => iDestructHyp_ H xs' pat) xs + | unit => destruct x as []; _iDestructHyp H xs pat + | _ => revert x; go ltac:(fun xs' => _iDestructHyp H xs' pat) xs end. (* With everything *) Tactic Notation "iInv" constr(N) "with" constr(Hs) "as" constr(pat) constr(Hclose) := - iInvCore N with Hs as (Some Hclose) in iDestructAccAndHyp0 pat. + iInvCore N with Hs as (Some Hclose) in _iDestructAccAndHyp0 pat. Tactic Notation "iInv" constr(N) "with" constr(Hs) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) constr(Hclose) := - iInvCore N with Hs as (Some Hclose) in iDestructAccAndHyp xs pat. + iInvCore N with Hs as (Some Hclose) in _iDestructAccAndHyp xs pat. (* Without closing view shift *) Tactic Notation "iInv" constr(N) "with" constr(Hs) "as" constr(pat) := - iInvCore N with Hs in iDestructAccAndHyp0 pat. + iInvCore N with Hs in _iDestructAccAndHyp0 pat. Tactic Notation "iInv" constr(N) "with" constr(Hs) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iInvCore N with Hs in iDestructAccAndHyp xs pat. + iInvCore N with Hs in _iDestructAccAndHyp xs pat. (* Without selection pattern *) Tactic Notation "iInv" constr(N) "as" constr(pat) constr(Hclose) := - iInvCore N as (Some Hclose) in iDestructAccAndHyp0 pat. + iInvCore N as (Some Hclose) in _iDestructAccAndHyp0 pat. Tactic Notation "iInv" constr(N) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) constr(Hclose) := - iInvCore N as (Some Hclose) in iDestructAccAndHyp xs pat. + iInvCore N as (Some Hclose) in _iDestructAccAndHyp xs pat. (* Without both *) Tactic Notation "iInv" constr(N) "as" constr(pat) := - iInvCore N in iDestructAccAndHyp0 pat. + iInvCore N in _iDestructAccAndHyp0 pat. Tactic Notation "iInv" constr(N) "as" "(" ne_simple_intropattern_list(xs) ")" constr(pat) := - iInvCore N in iDestructAccAndHyp xs pat. + iInvCore N in _iDestructAccAndHyp xs pat. (** Miscellaneous *) Tactic Notation "iAccu" :=