Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Iris
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Gaëtan Gilbert
Iris
Commits
b39f5a52
Commit
b39f5a52
authored
7 years ago
by
Ralf Jung
Browse files
Options
Downloads
Patches
Plain Diff
Proof mode error messages: Print hypothesis name without [INamed]
parent
4d9e16ec
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
tests/proofmode.ref
+10
-3
10 additions, 3 deletions
tests/proofmode.ref
tests/proofmode.v
+12
-3
12 additions, 3 deletions
tests/proofmode.v
theories/proofmode/ltac_tactics.v
+137
-56
137 additions, 56 deletions
theories/proofmode/ltac_tactics.v
with
159 additions
and
62 deletions
tests/proofmode.ref
+
10
−
3
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.
This diff is collapsed.
Click to expand it.
tests/proofmode.v
+
12
−
3
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
.
This diff is collapsed.
Click to expand it.
theories/proofmode/ltac_tactics.v
+
137
−
56
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"
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment