Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Rice Wine
Iris
Commits
b39f5a52
Commit
b39f5a52
authored
Jun 15, 2018
by
Ralf Jung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Proof mode error messages: Print hypothesis name without [INamed]
parent
4d9e16ec
Changes
3
Hide whitespace changes
Inline
Sidebyside
Showing
3 changed files
with
159 additions
and
62 deletions
+159
62
tests/proofmode.ref
tests/proofmode.ref
+10
3
tests/proofmode.v
tests/proofmode.v
+12
3
theories/proofmode/ltac_tactics.v
theories/proofmode/ltac_tactics.v
+137
56
No files found.
tests/proofmode.ref
View file @
b39f5a52
...
...
@@ 37,11 +37,11 @@ No applicable tactic.
The command has indeed failed with message:
In nested Ltac calls to "iClear (constr)", "iElaborateSelPat" and
"iElaborateSelPat_go", last call failed.
Tactic failure: iElaborateSelPat:
(INamed
"HQ"
)
not found.
Tactic failure: iElaborateSelPat: "HQ" not found.
The command has indeed failed with message:
In nested Ltac calls to "iClear (constr)", "iElaborateSelPat" and
"iElaborateSelPat_go", last call failed.
Tactic failure: iElaborateSelPat:
(INamed
"HQ"
)
not found.
Tactic failure: iElaborateSelPat: "HQ" not found.
The command has indeed failed with message:
In nested Ltac calls to "iSpecialize (open_constr)",
"iSpecializeCore (open_constr) as (constr)",
...
...
@@ 192,7 +192,11 @@ The command has indeed failed with message:
In nested Ltac calls to "iDestruct (open_constr) as (constr)",
"iDestructCore (open_constr) as (constr) (tactic)" and
"iDestructCore (open_constr) as (constr) (tactic)", last call failed.
Tactic failure: iDestruct: (INamed "HQ") not found.
Tactic failure: iDestruct: "HQ" not found.
The command has indeed failed with message:
In nested Ltac calls to "iIntros (constr)", "iIntros_go" and
"iIntro (constr)", last call failed.
Tactic failure: iIntro: "HP" not fresh.
The command has indeed failed with message:
In nested Ltac calls to "iIntros ( (intropattern) )",
"iIntro ( (intropattern) )" and "intros x", last call failed.
...
...
@@ 203,3 +207,6 @@ Tactic failure: iSplitL: hypotheses ["HPx"] not found.
The command has indeed failed with message:
Ltac call to "iSplitL (constr)" failed.
Tactic failure: iSplitL: hypotheses ["HPx"] not found.
The command has indeed failed with message:
Ltac call to "iExact (constr)" failed.
Tactic failure: iExact: "HQ" not found.
tests/proofmode.v
View file @
b39f5a52
...
...
@@ 561,9 +561,12 @@ Lemma iDestruct_bad_name P :
P

∗
P
.
Proof
.
iIntros
"HP"
.
Fail
iDestruct
"HQ"
as
"HP"
.
Abort
.
Lemma
iIntros_dup_name
P
:
P

∗
∀
x
y
:
(),
P
.
Proof
.
iIntros
"HP"
(
x
).
Fail
iIntros
(
x
).
Abort
.
Lemma
iIntros_dup_name
P
Q
:
P

∗
Q

∗
∀
x
y
:
(),
P
.
Proof
.
iIntros
"HP"
.
Fail
iIntros
"HP"
.
iIntros
"HQ"
(
x
).
Fail
iIntros
(
x
).
Abort
.
Lemma
iSplit_one_of_many
P
:
P

∗
P

∗
P
∗
P
.
...
...
@@ 571,4 +574,10 @@ Proof.
iIntros
"HP1 HP2"
.
Fail
iSplitL
"HP1 HPx"
.
Fail
iSplitL
"HPx HP1"
.
Abort
.
Lemma
iExact_not_found
P
:
P

∗
P
.
Proof
.
iIntros
"HP"
.
Fail
iExact
"HQ"
.
Abort
.
End
error_tests
.
theories/proofmode/ltac_tactics.v
View file @
b39f5a52
...
...
@@ 30,6 +30,13 @@ and iInv. *)
Ltac
iSolveSideCondition
:
=
split_and
?
;
try
solve
[
fast_done

solve_ndisj
].
(** Used for printing [string]s and [ident]s. *)
Ltac
pretty_ident
H
:
=
lazymatch
H
with

INamed
?H
=>
H

?H
=>
H
end
.
(** * Misc *)
Ltac
iMissingHyps
Hs
:
=
...
...
@@ 148,7 +155,9 @@ Ltac iElaborateSelPat_go pat Δ Hs :=

SelIdent
?H
::
?pat
=>
lazymatch
pm_eval
(
envs_lookup_delete
false
H
Δ
)
with

Some
(
?p
,
_
,?
Δ
'
)
=>
iElaborateSelPat_go
pat
Δ
'
(
ESelIdent
p
H
::
Hs
)

None
=>
fail
"iElaborateSelPat:"
H
"not found"

None
=>
let
H
:
=
pretty_ident
H
in
fail
"iElaborateSelPat:"
H
"not found"
end
end
.
Ltac
iElaborateSelPat
pat
:
=
...
...
@@ 159,7 +168,9 @@ Ltac iElaborateSelPat pat :=
Local
Ltac
iClearHyp
H
:
=
eapply
tac_clear
with
_
H
_
_;
(* (i:=H) *)
[
pm_reflexivity

fail
"iClear:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iClear:"
H
"not found"

pm_reduce
;
iSolveTC

let
P
:
=
match
goal
with

TCOr
(
Affine
?P
)
_
=>
P
end
in
fail
"iClear:"
H
":"
P
"not affine and the goal not absorbing"
...
...
@@ 180,7 +191,8 @@ Tactic Notation "iClear" "(" ident_list(xs) ")" constr(Hs) :=
(** * Assumptions *)
Tactic
Notation
"iExact"
constr
(
H
)
:
=
eapply
tac_assumption
with
_
H
_
_;
(* (i:=H) *)
[
pm_reflexivity

fail
"iExact:"
H
"not found"
[
pm_reflexivity

fail
"iExact:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

FromAssumption
_
?P
_
=>
P
end
in
fail
"iExact:"
H
":"
P
"does not match goal"
...
...
@@ 232,7 +244,9 @@ Tactic Notation "iExFalso" := apply tac_ex_falso.
(** * Making hypotheses persistent or pure *)
Local
Tactic
Notation
"iPersistent"
constr
(
H
)
:
=
eapply
tac_persistent
with
_
H
_
_
_;
(* (i:=H) *)
[
pm_reflexivity

fail
"iPersistent:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iPersistent:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoPersistent
_
?P
_
=>
P
end
in
fail
"iPersistent:"
P
"not persistent"
...
...
@@ 243,7 +257,9 @@ Local Tactic Notation "iPersistent" constr(H) :=
Local
Tactic
Notation
"iPure"
constr
(
H
)
"as"
simple_intropattern
(
pat
)
:
=
eapply
tac_pure
with
_
H
_
_
_;
(* (i:=H1) *)
[
pm_reflexivity

fail
"iPure:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iPure:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoPure
?P
_
=>
P
end
in
fail
"iPure:"
P
"not pure"
...
...
@@ 285,7 +301,9 @@ Local Ltac iFramePure t :=
Local
Ltac
iFrameHyp
H
:
=
iStartProof
;
eapply
tac_frame
with
_
H
_
_
_;
[
pm_reflexivity

fail
"iFrame:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iFrame:"
H
"not found"

iSolveTC

let
R
:
=
match
goal
with

Frame
_
?R
_
_
=>
R
end
in
fail
"iFrame: cannot frame"
R
...
...
@@ 395,13 +413,17 @@ Local Tactic Notation "iIntro" constr(H) :=
let
P
:
=
lazymatch
goal
with

Persistent
?P
=>
P
end
in
fail
1
"iIntro: introducing nonpersistent"
H
":"
P
"into nonempty spatial context"

pm_reflexivity

fail
1
"iIntro:"
H
"not fresh"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
1
"iIntro:"
H
"not fresh"

iSolveTC
]

(* (_ ∗ _) *)
eapply
tac_wand_intro
with
_
H
_
_;
(* (i:=H) *)
[
iSolveTC

pm_reflexivity

fail
1
"iIntro:"
H
"not fresh"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
1
"iIntro:"
H
"not fresh"
]

fail
"iIntro: nothing to introduce"
].
...
...
@@ 414,7 +436,9 @@ Local Tactic Notation "iIntro" "#" constr(H) :=

iSolveTC

let
P
:
=
match
goal
with

IntoPersistent
_
?P
_
=>
P
end
in
fail
1
"iIntro:"
P
"not persistent"

pm_reflexivity

fail
1
"iIntro:"
H
"not fresh"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
1
"iIntro:"
H
"not fresh"
]

(* (?P ∗ _) *)
eapply
tac_wand_intro_persistent
with
_
H
_
_
_;
(* (i:=H) *)
...
...
@@ 425,7 +449,9 @@ Local Tactic Notation "iIntro" "#" constr(H) :=

iSolveTC

let
P
:
=
match
goal
with

TCOr
(
Affine
?P
)
_
=>
P
end
in
fail
1
"iIntro:"
P
"not affine and the goal not absorbing"

pm_reflexivity

fail
1
"iIntro:"
H
"not fresh"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
1
"iIntro:"
H
"not fresh"
]

fail
"iIntro: nothing to introduce"
].
...
...
@@ 488,7 +514,9 @@ Local Tactic Notation "iSpecializeArgs" constr(H) open_constr(xs) :=

hnil
=>
idtac

hcons
?x
?xs
=>
notypeclasses
refine
(
tac_forall_specialize
_
_
H
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iSpecialize:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoForall
?P
_
=>
P
end
in
fail
"iSpecialize: cannot instantiate"
P
"with"
x
...
...
@@ 519,8 +547,12 @@ Ltac iSpecializePat_go H1 pats :=
iSpecializePat_go
H1
pats

SIdent
?H2
::
?pats
=>
notypeclasses
refine
(
tac_specialize
_
_
_
H2
_
H1
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H2
"not found"

pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H2
:
=
pretty_ident
H2
in
fail
"iSpecialize:"
H2
"not found"

pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoWand
_
_
?P
?Q
_
=>
P
end
in
let
Q
:
=
match
goal
with

IntoWand
_
_
?P
?Q
_
=>
Q
end
in
...
...
@@ 528,7 +560,9 @@ Ltac iSpecializePat_go H1 pats :=

pm_reflexivity

iSpecializePat_go
H1
pats
]

SPureGoal
?d
::
?pats
=>
notypeclasses
refine
(
tac_specialize_assert_pure
_
_
H1
_
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

solve_to_wand
H1

iSolveTC

let
Q
:
=
match
goal
with

FromPure
_
?Q
_
=>
Q
end
in
...
...
@@ 538,7 +572,9 @@ Ltac iSpecializePat_go H1 pats :=

iSpecializePat_go
H1
pats
]

SGoal
(
SpecGoal
GPersistent
false
?Hs_frame
[]
?d
)
::
?pats
=>
notypeclasses
refine
(
tac_specialize_assert_persistent
_
_
_
H1
_
_
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

solve_to_wand
H1

iSolveTC

let
Q
:
=
match
goal
with

Persistent
?Q
=>
Q
end
in
...
...
@@ 552,7 +588,9 @@ Ltac iSpecializePat_go H1 pats :=

SGoal
(
SpecGoal
?m
?lr
?Hs_frame
?Hs
?d
)
::
?pats
=>
let
Hs'
:
=
eval
cbv
in
(
if
lr
then
Hs
else
Hs_frame
++
Hs
)
in
notypeclasses
refine
(
tac_specialize_assert
_
_
_
_
H1
_
lr
Hs'
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

solve_to_wand
H1

lazymatch
m
with

GSpatial
=>
notypeclasses
refine
(
add_modal_id
_
_
)
...
...
@@ 565,7 +603,9 @@ Ltac iSpecializePat_go H1 pats :=

iSpecializePat_go
H1
pats
]

SAutoFrame
GPersistent
::
?pats
=>
notypeclasses
refine
(
tac_specialize_assert_persistent
_
_
_
H1
_
_
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

solve_to_wand
H1

iSolveTC

let
Q
:
=
match
goal
with

Persistent
?Q
=>
Q
end
in
...
...
@@ 575,7 +615,9 @@ Ltac iSpecializePat_go H1 pats :=

iSpecializePat_go
H1
pats
]

SAutoFrame
?m
::
?pats
=>
notypeclasses
refine
(
tac_specialize_frame
_
_
H1
_
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H1
"not found"
[
pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iSpecialize:"
H1
"not found"

solve_to_wand
H1

lazymatch
m
with

GSpatial
=>
notypeclasses
refine
(
add_modal_id
_
_
)
...
...
@@ 625,7 +667,9 @@ Tactic Notation "iSpecializeCore" open_constr(H)

true
=>
(* FIXME: do something reasonable when the BI is not affine *)
notypeclasses
refine
(
tac_specialize_persistent_helper
_
_
H
_
_
_
_
_
_
_
_
_
_
_
)
;
[
pm_reflexivity

fail
"iSpecialize:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iSpecialize:"
H
"not found"

iSpecializePat
H
pat
;
[..

refine
(
tac_specialize_persistent_helper_done
_
H
_
_
_
)
;
...
...
@@ 732,13 +776,19 @@ Tactic Notation "iPoseProofCore" open_constr(lem)
lazymatch
type
of
t
with

ident
=>
eapply
tac_pose_proof_hyp
with
_
_
t
_
Htmp
_;
[
pm_reflexivity

fail
"iPoseProof:"
t
"not found"

pm_reflexivity

fail
"iPoseProof:"
Htmp
"not fresh"
[
pm_reflexivity

let
t
:
=
pretty_ident
t
in
fail
"iPoseProof:"
t
"not found"

pm_reflexivity

let
Htmp
:
=
pretty_ident
Htmp
in
fail
"iPoseProof:"
Htmp
"not fresh"

goal_tac
()]

_
=>
eapply
tac_pose_proof
with
_
Htmp
_;
(* (j:=H) *)
[
iIntoEmpValid
t

pm_reflexivity

fail
"iPoseProof:"
Htmp
"not fresh"

pm_reflexivity

let
Htmp
:
=
pretty_ident
Htmp
in
fail
"iPoseProof:"
Htmp
"not fresh"

goal_tac
()]
end
;
try
iSolveTC
in
...
...
@@ 788,7 +838,9 @@ Tactic Notation "iRevert" constr(Hs) :=
go
Hs

ESelIdent
_
?H
::
?Hs
=>
eapply
tac_revert
with
_
H
_
_;
(* (i:=H2) *)
[
pm_reflexivity

fail
"iRevert:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iRevert:"
H
"not found"

pm_reduce
;
go
Hs
]
end
in
let
Hs
:
=
iElaborateSelPat
Hs
in
iStartProof
;
go
Hs
.
...
...
@@ 854,12 +906,18 @@ Tactic Notation "iRight" :=
Local
Tactic
Notation
"iOrDestruct"
constr
(
H
)
"as"
constr
(
H1
)
constr
(
H2
)
:
=
eapply
tac_or_destruct
with
_
_
H
_
H1
H2
_
_
_;
(* (i:=H) (j1:=H1) (j2:=H2) *)
[
pm_reflexivity

fail
"iOrDestruct:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iOrDestruct:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoOr
?P
_
_
=>
P
end
in
fail
"iOrDestruct: cannot destruct"
P

pm_reflexivity

fail
"iOrDestruct:"
H1
"not fresh"

pm_reflexivity

fail
"iOrDestruct:"
H2
"not fresh"

pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
fail
"iOrDestruct:"
H1
"not fresh"

pm_reflexivity

let
H2
:
=
pretty_ident
H2
in
fail
"iOrDestruct:"
H2
"not fresh"

].
(** * Conjunction and separating conjunction *)
...
...
@@ 901,7 +959,9 @@ Tactic Notation "iSplitR" := iSplitL "".
Local
Tactic
Notation
"iAndDestruct"
constr
(
H
)
"as"
constr
(
H1
)
constr
(
H2
)
:
=
eapply
tac_and_destruct
with
_
H
_
H1
H2
_
_
_;
(* (i:=H) (j1:=H1) (j2:=H2) *)
[
pm_reflexivity

fail
"iAndDestruct:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iAndDestruct:"
H
"not found"

pm_reduce
;
iSolveTC

let
P
:
=
lazymatch
goal
with
...
...
@@ 909,7 +969,10 @@ Local Tactic Notation "iAndDestruct" constr(H) "as" constr(H1) constr(H2) :=


IntoAnd
_
?P
_
_
=>
P
end
in
fail
"iAndDestruct: cannot destruct"
P

pm_reflexivity

fail
"iAndDestruct:"
H1
"or"
H2
" not fresh"
].

pm_reflexivity

let
H1
:
=
pretty_ident
H1
in
let
H2
:
=
pretty_ident
H2
in
fail
"iAndDestruct:"
H1
"or"
H2
" not fresh"
].
Local
Tactic
Notation
"iAndDestructChoice"
constr
(
H
)
"as"
constr
(
d
)
constr
(
H'
)
:
=
eapply
tac_and_destruct_choice
with
_
H
_
d
H'
_
_
_;
...
...
@@ 917,7 +980,9 @@ Local Tactic Notation "iAndDestructChoice" constr(H) "as" constr(d) constr(H') :

pm_reduce
;
iSolveTC

let
P
:
=
match
goal
with

TCOr
(
IntoAnd
_
?P
_
_
)
_
=>
P
end
in
fail
"iAndDestructChoice: cannot destruct"
P

pm_reflexivity

fail
"iAndDestructChoice:"
H'
" not fresh"
].

pm_reflexivity

let
H'
:
=
pretty_ident
H'
in
fail
"iAndDestructChoice:"
H'
" not fresh"
].
(** * Existential *)
Tactic
Notation
"iExists"
uconstr
(
x1
)
:
=
...
...
@@ 952,13 +1017,17 @@ Tactic Notation "iExists" uconstr(x1) "," uconstr(x2) "," uconstr(x3) ","
Local
Tactic
Notation
"iExistDestruct"
constr
(
H
)
"as"
simple_intropattern
(
x
)
constr
(
Hx
)
:
=
eapply
tac_exist_destruct
with
H
_
Hx
_
_;
(* (i:=H) (j:=Hx) *)
[
pm_reflexivity

fail
"iExistDestruct:"
H
"not found"
[
pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iExistDestruct:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoExist
?P
_
=>
P
end
in
fail
"iExistDestruct: cannot destruct"
P
]
;
let
y
:
=
fresh
in
intros
y
;
eexists
;
split
;
[
pm_reflexivity

fail
"iExistDestruct:"
Hx
"not fresh"
[
pm_reflexivity

let
Hx
:
=
pretty_ident
Hx
in
fail
"iExistDestruct:"
Hx
"not fresh"

revert
y
;
intros
x
].
(** * Modality introduction *)
...
...
@@ 1086,15 +1155,16 @@ Tactic Notation "iCombine" constr(Hs) "as" constr(pat) :=
let
Hs
:
=
iMissingHyps
Hs
in
fail
"iCombine: hypotheses"
Hs
"not found"

iSolveTC

pm_reflexivity

fail
"iCombine:"
H
"not fresh"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iCombine:"
H
"not fresh"

iDestructHyp
H
as
pat
].
Tactic
Notation
"iCombine"
constr
(
H1
)
constr
(
H2
)
"as"
constr
(
pat
)
:
=
iCombine
[
H1
;
H2
]
as
pat
.
(** * Introduction tactic *)
Tactic
Notation
"iIntros"
constr
(
pat
)
:
=
let
rec
go
pats
startproof
:
=
Ltac
iIntros_go
pats
startproof
:
=
lazymatch
pats
with

[]
=>
lazymatch
startproof
with
...
...
@@ 1102,28 +1172,29 @@ Tactic Notation "iIntros" constr(pat) :=

false
=>
idtac
end
(* Optimizations to avoid generating fresh names *)

IPureElim
::
?pats
=>
iIntro
(?)
;
go
pats
startproof

IAlwaysElim
(
IIdent
?H
)
::
?pats
=>
iIntro
#
H
;
go
pats
false

IDrop
::
?pats
=>
iIntro
_;
go
pats
startproof

IIdent
?H
::
?pats
=>
iIntro
H
;
go
pats
startproof

IPureElim
::
?pats
=>
iIntro
(?)
;
iIntros_
go
pats
startproof

IAlwaysElim
(
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 toplevel *)

IPureIntro
::
?pats
=>
iPureIntro
;
go
pats
false

IAlwaysIntro
::
?pats
=>
iAlways
;
go
pats
false

IModalIntro
::
?pats
=>
iModIntro
;
go
pats
false

IForall
::
?pats
=>
repeat
iIntroForall
;
go
pats
startproof

IAll
::
?pats
=>
repeat
(
iIntroForall

iIntro
)
;
go
pats
startproof

IPureIntro
::
?pats
=>
iPureIntro
;
iIntros_
go
pats
false

IAlwaysIntro
::
?pats
=>
iAlways
;
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
;
go
pats
startproof

IClear
?H
::
?pats
=>
iClear
H
;
go
pats
false

IClearFrame
?H
::
?pats
=>
iFrame
H
;
go
pats
false

IDone
::
?pats
=>
try
done
;
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 *)

IAlwaysElim
?pat
::
?pats
=>
let
H
:
=
iFresh
in
iIntro
#
H
;
iDestructHyp
H
as
pat
;
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
;
go
pats
false
end
in
let
pats
:
=
intro_pat
.
parse
pat
in
go
pats
true
.
let
H
:
=
iFresh
in
iIntro
H
;
iDestructHyp
H
as
pat
;
iIntros_go
pats
false
end
.
Tactic
Notation
"iIntros"
constr
(
pat
)
:
=
let
pats
:
=
intro_pat
.
parse
pat
in
iIntros_go
pats
true
.
Tactic
Notation
"iIntros"
:
=
iIntros
[
IAll
].
Tactic
Notation
"iIntros"
"("
simple_intropattern
(
x1
)
")"
:
=
...
...
@@ 1448,7 +1519,9 @@ Tactic Notation "iDestructCore" open_constr(lem) "as" constr(p) tactic(tac) :=

None
=>
iPoseProofCore
lem
as
p
false
tac

Some
?H
=>
lazymatch
iTypeOf
H
with

None
=>
fail
"iDestruct:"
H
"not found"

None
=>
let
H
:
=
pretty_ident
H
in
fail
"iDestruct:"
H
"not found"

Some
(
true
,
?P
)
=>
(* persistent hypothesis, check for a CopyDestruct instance *)
tryif
(
let
dummy
:
=
constr
:
(
_
:
CopyDestruct
P
)
in
idtac
)
...
...
@@ 1657,7 +1730,9 @@ Tactic Notation "iLöbCore" "as" constr (IH) :=
not have this issue. *)
notypeclasses
refine
(
tac_l
ö
b
_
_
IH
_
_
_
_
)
;
[
reflexivity

fail
"iLöb: spatial context not empty, this should not happen"

pm_reflexivity

fail
"iLöb:"
IH
"not fresh"
].

pm_reflexivity

let
IH
:
=
pretty_ident
IH
in
fail
"iLöb:"
IH
"not fresh"
].
Tactic
Notation
"iLöbRevert"
constr
(
Hs
)
"with"
tactic
(
tac
)
:
=
iRevertIntros
Hs
with
(
...
...
@@ 1790,7 +1865,9 @@ Local Ltac iRewriteFindPred :=
Local
Tactic
Notation
"iRewriteCore"
constr
(
lr
)
open_constr
(
lem
)
:
=
iPoseProofCore
lem
as
true
true
(
fun
Heq
=>
eapply
(
tac_rewrite
_
Heq
_
_
lr
)
;
[
pm_reflexivity

fail
"iRewrite:"
Heq
"not found"
[
pm_reflexivity

let
Heq
:
=
pretty_ident
Heq
in
fail
"iRewrite:"
Heq
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoInternalEq
?P
_
_
⊢
_
=>
P
end
in
fail
"iRewrite:"
P
"not an equality"
...
...
@@ 1803,8 +1880,12 @@ Tactic Notation "iRewrite" "" open_constr(lem) := iRewriteCore Left lem.
Local
Tactic
Notation
"iRewriteCore"
constr
(
lr
)
open_constr
(
lem
)
"in"
constr
(
H
)
:
=
iPoseProofCore
lem
as
true
true
(
fun
Heq
=>
eapply
(
tac_rewrite_in
_
Heq
_
_
H
_
_
lr
)
;
[
pm_reflexivity

fail
"iRewrite:"
Heq
"not found"

pm_reflexivity

fail
"iRewrite:"
H
"not found"
[
pm_reflexivity

let
Heq
:
=
pretty_ident
Heq
in
fail
"iRewrite:"
Heq
"not found"

pm_reflexivity

let
H
:
=
pretty_ident
H
in
fail
"iRewrite:"
H
"not found"

iSolveTC

let
P
:
=
match
goal
with

IntoInternalEq
?P
_
_
⊢
_
=>
P
end
in
fail
"iRewrite:"
P
"not an equality"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment