diff --git a/ProofMode.md b/ProofMode.md index ae2233edfd6bb004cc9aeccc786a8834ed4d570b..8137c2c6c140c5e1b9d0885e161e4cfa169b62f4 100644 --- a/ProofMode.md +++ b/ProofMode.md @@ -40,8 +40,10 @@ Context management `H`. - `iAssert P with "spat" as "ipat"` : create a new goal with conclusion `P` and put `P` in the context of the original goal. The specialization pattern - `spat` specifies which hypotheses will be consumed by proving `P` and the + `spat` specifies which hypotheses will be consumed by proving `P`. The introduction pattern `ipat` specifies how to eliminate `P`. +- `iAssert P with "spat" as %cpat` : assert `P` and eliminate it using the Coq + introduction pattern `cpat`. Introduction of logical connectives ----------------------------------- diff --git a/proofmode/tactics.v b/proofmode/tactics.v index 382e488aeb006550b1a2ce9a051a65217daea921..11ca3016c3a879cddd72da7f05b6d2dcc0702754 100644 --- a/proofmode/tactics.v +++ b/proofmode/tactics.v @@ -833,7 +833,7 @@ Tactic Notation "iLöb" "(" ident(x1) ident(x2) ident(x3) ident(x4) ltac:(iIntros ( x1 x2 x3 x4 x5 x6 x7 x8 )). (** * Assert *) -Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) := +Tactic Notation "iAssertCore" open_constr(Q) "with" constr(Hs) "as" tactic(tac) := let H := iFresh in let Hs := spec_pat.parse Hs in lazymatch Hs with @@ -842,7 +842,7 @@ Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) := [env_cbv; reflexivity |(*goal*) |apply _ || fail "iAssert:" Q "not persistent" - |iDestructHyp H as pat] + |tac H] | [SGoal ?k ?lr ?Hs] => eapply tac_assert with _ _ _ lr Hs H Q _; (* (js:=Hs) (j:=H) (P:=Q) *) [match k with @@ -851,13 +851,21 @@ Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) := end |env_cbv; reflexivity || fail "iAssert:" Hs "not found" |env_cbv; reflexivity| - |iDestructHyp H as pat] + |tac H] | ?pat => fail "iAssert: invalid pattern" pat end. +Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) := + iAssertCore Q with Hs as (fun H => iDestructHyp H as pat). Tactic Notation "iAssert" open_constr(Q) "as" constr(pat) := iAssert Q with "[]" as pat. +Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) + "as" "%" simple_intropattern(pat) := + iAssertCore Q with Hs as (fun H => iPure H as pat). +Tactic Notation "iAssert" open_constr(Q) "as" "%" simple_intropattern(pat) := + iAssert Q with "[]" as %pat. + (** * Rewrite *) Local Ltac iRewriteFindPred := match goal with