Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Jonas Kastberg
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
Show whitespace changes
Inline
Side-by-side
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 non-persistent"
H
":"
P
"into non-empty 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 top-level *)
|
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