Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
Iris
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
116
Issues
116
List
Boards
Labels
Service Desk
Milestones
Merge Requests
22
Merge Requests
22
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Iris
Iris
Commits
f1aa22f6
Commit
f1aa22f6
authored
Nov 27, 2016
by
Robbert Krebbers
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Generalize boxes to have a version both with and without laters.
parent
86315b42
Pipeline
#3151
passed with stage
in 10 minutes and 39 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
41 additions
and
43 deletions
+41
-43
ProofMode.md
ProofMode.md
+4
-1
base_logic/lib/boxes.v
base_logic/lib/boxes.v
+37
-42
No files found.
ProofMode.md
View file @
f1aa22f6
...
...
@@ -111,7 +111,10 @@ Modalities
The later modality
------------------
-
`iNext`
: introduce a later by stripping laters from all hypotheses.
-
`iNext n`
: introduce
`n`
laters by stripping that number of laters from all
hypotheses. If the argument
`n`
is not given, it strips one later if the
leftmost conjuct is of the shape
`▷ P`
, or
`n`
laters if the leftmost conjuct
is of the shape
`▷^n P`
.
-
`iLöb as "IH" forall (x1 ... xn)`
: perform Löb induction by generating a
hypothesis
`IH : ▷ goal`
. The tactic generalizes over the Coq level variables
`x1 ... xn`
, the hypotheses given by the selection pattern
`selpat`
, and the
...
...
base_logic/lib/boxes.v
View file @
f1aa22f6
...
...
@@ -89,9 +89,9 @@ Proof.
-
by
rewrite
big_sepM_empty
.
Qed
.
Lemma
slice_insert_empty
Q
E
f
P
:
▷
box
N
f
P
={
E
}=
∗
∃
γ
,
⌜
f
!!
γ
=
None
⌝
∗
slice
N
γ
Q
∗
▷
box
N
(<[
γ
:
=
false
]>
f
)
(
Q
∗
P
).
Lemma
slice_insert_empty
E
q
f
Q
P
:
▷
?q
box
N
f
P
={
E
}=
∗
∃
γ
,
⌜
f
!!
γ
=
None
⌝
∗
slice
N
γ
Q
∗
▷
?q
box
N
(<[
γ
:
=
false
]>
f
)
(
Q
∗
P
).
Proof
.
iDestruct
1
as
(
Φ
)
"[#HeqP Hf]"
.
iMod
(
own_alloc_strong
(
●
Excl'
false
⋅
◯
Excl'
false
,
...
...
@@ -108,38 +108,35 @@ Proof.
iFrame
;
eauto
.
Qed
.
Lemma
slice_delete_empty
E
f
P
Q
γ
:
Lemma
slice_delete_empty
E
q
f
P
Q
γ
:
↑
N
⊆
E
→
f
!!
γ
=
Some
false
→
slice
N
γ
Q
-
∗
▷
box
N
f
P
={
E
}=
∗
∃
P'
,
▷
▷
(
P
≡
(
Q
∗
P'
))
∗
▷
box
N
(
delete
γ
f
)
P'
.
slice
N
γ
Q
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
∃
P'
,
▷
?q
▷
(
P
≡
(
Q
∗
P'
))
∗
▷
?q
box
N
(
delete
γ
f
)
P'
.
Proof
.
iIntros
(??)
"[#HγQ Hinv] H"
.
iDestruct
"H"
as
(
Φ
)
"[#HeqP Hf]"
.
iExists
([
∗
map
]
γ
'
↦
_
∈
delete
γ
f
,
Φ
γ
'
)%
I
.
iInv
N
as
(
b
)
"[Hγ _]"
"Hclose"
.
iApply
fupd_trans_frame
;
iFrame
"Hclose"
;
iModIntro
;
iNext
.
iInv
N
as
(
b
)
"[>Hγ _]"
"Hclose"
.
iDestruct
(
big_sepM_delete
_
f
_
false
with
"Hf"
)
as
"[[Hγ' #[HγΦ ?]] ?]"
;
first
done
.
iDestruct
(
box_own_agree
γ
Q
(
Φ
γ
)
with
"[#]"
)
as
"HeqQ"
;
first
by
eauto
.
as
"[[>Hγ' #[HγΦ ?]] ?]"
;
first
done
.
iDestruct
(
box_own_auth_agree
γ
b
false
with
"[-]"
)
as
%->
;
first
by
iFrame
.
iSplitL
"Hγ"
;
last
iSplit
.
-
iExists
false
;
eauto
.
-
iNext
.
iRewrite
"HeqP"
.
iRewrite
"HeqQ"
.
by
rewrite
-
big_sepM_delete
.
iMod
(
"Hclose"
with
"[Hγ]"
)
;
first
iExists
false
;
eauto
.
iModIntro
.
iNext
.
iSplit
.
-
iDestruct
(
box_own_agree
γ
Q
(
Φ
γ
)
with
"[#]"
)
as
"HeqQ"
;
first
by
eauto
.
iNext
.
iRewrite
"HeqP"
.
iRewrite
"HeqQ"
.
by
rewrite
-
big_sepM_delete
.
-
iExists
Φ
;
eauto
.
Qed
.
Lemma
slice_fill
E
f
γ
P
Q
:
Lemma
slice_fill
E
q
f
γ
P
Q
:
↑
N
⊆
E
→
f
!!
γ
=
Some
false
→
slice
N
γ
Q
-
∗
▷
Q
-
∗
▷
box
N
f
P
={
E
}=
∗
▷
box
N
(<[
γ
:
=
true
]>
f
)
P
.
slice
N
γ
Q
-
∗
▷
Q
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
▷
?q
box
N
(<[
γ
:
=
true
]>
f
)
P
.
Proof
.
iIntros
(??)
"#[HγQ Hinv] HQ H"
;
iDestruct
"H"
as
(
Φ
)
"[#HeqP Hf]"
.
iInv
N
as
(
b'
)
"[>Hγ _]"
"Hclose"
.
iDestruct
(
big_sepM_later
_
f
with
"Hf"
)
as
"Hf"
.
iDestruct
(
big_sepM_delete
_
f
_
false
with
"Hf"
)
as
"[[>Hγ' #[HγΦ Hinv']] ?]"
;
first
done
.
iMod
(
box_own_auth_update
γ
b'
false
true
with
"[Hγ Hγ']"
)
as
"[Hγ Hγ']"
;
first
by
iFrame
.
iMod
(
box_own_auth_update
γ
b'
false
true
with
"[$Hγ $Hγ']"
)
as
"[Hγ Hγ']"
.
iMod
(
"Hclose"
with
"[Hγ HQ]"
)
;
first
(
iNext
;
iExists
true
;
by
iFrame
).
iModIntro
;
iNext
;
iExists
Φ
;
iSplit
.
-
by
rewrite
big_sepM_insert_override
.
...
...
@@ -147,19 +144,18 @@ Proof.
iFrame
;
eauto
.
Qed
.
Lemma
slice_empty
E
f
P
Q
γ
:
Lemma
slice_empty
E
q
f
P
Q
γ
:
↑
N
⊆
E
→
f
!!
γ
=
Some
true
→
slice
N
γ
Q
-
∗
▷
box
N
f
P
={
E
}=
∗
▷
Q
∗
▷
box
N
(<[
γ
:
=
false
]>
f
)
P
.
slice
N
γ
Q
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
▷
Q
∗
▷
?q
box
N
(<[
γ
:
=
false
]>
f
)
P
.
Proof
.
iIntros
(??)
"#[HγQ Hinv] H"
;
iDestruct
"H"
as
(
Φ
)
"[#HeqP Hf]"
.
iInv
N
as
(
b
)
"[>Hγ HQ]"
"Hclose"
.
iDestruct
(
big_sepM_later
_
f
with
"Hf"
)
as
"Hf"
.
iDestruct
(
big_sepM_delete
_
f
with
"Hf"
)
as
"[[>Hγ' #[HγΦ Hinv']] ?]"
;
first
done
.
iDestruct
(
box_own_auth_agree
γ
b
true
with
"[-]"
)
as
%->
;
first
by
iFrame
.
iFrame
"HQ"
.
iMod
(
box_own_auth_update
γ
with
"[
Hγ Hγ']"
)
as
"[Hγ Hγ']"
;
first
by
iFrame
.
iMod
(
box_own_auth_update
γ
with
"[
$Hγ $Hγ']"
)
as
"[Hγ Hγ']"
.
iMod
(
"Hclose"
with
"[Hγ]"
)
;
first
(
iNext
;
iExists
false
;
by
repeat
iSplit
).
iModIntro
;
iNext
;
iExists
Φ
;
iSplit
.
-
by
rewrite
big_sepM_insert_override
.
...
...
@@ -167,10 +163,10 @@ Proof.
iFrame
;
eauto
.
Qed
.
Lemma
slice_insert_full
Q
E
f
P
:
Lemma
slice_insert_full
E
q
f
P
Q
:
↑
N
⊆
E
→
▷
Q
-
∗
▷
box
N
f
P
={
E
}=
∗
∃
γ
,
⌜
f
!!
γ
=
None
⌝
∗
slice
N
γ
Q
∗
▷
box
N
(<[
γ
:
=
true
]>
f
)
(
Q
∗
P
).
▷
Q
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
∃
γ
,
⌜
f
!!
γ
=
None
⌝
∗
slice
N
γ
Q
∗
▷
?q
box
N
(<[
γ
:
=
true
]>
f
)
(
Q
∗
P
).
Proof
.
iIntros
(?)
"HQ Hbox"
.
iMod
(
slice_insert_empty
with
"Hbox"
)
as
(
γ
)
"(% & #Hslice & Hbox)"
.
...
...
@@ -178,11 +174,11 @@ Proof.
by
apply
lookup_insert
.
by
rewrite
insert_insert
.
Qed
.
Lemma
slice_delete_full
E
f
P
Q
γ
:
Lemma
slice_delete_full
E
q
f
P
Q
γ
:
↑
N
⊆
E
→
f
!!
γ
=
Some
true
→
slice
N
γ
Q
-
∗
▷
box
N
f
P
={
E
}=
∗
∃
P'
,
▷
Q
∗
▷
▷
(
P
≡
(
Q
∗
P'
))
∗
▷
box
N
(
delete
γ
f
)
P'
.
slice
N
γ
Q
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
∃
P'
,
▷
Q
∗
▷
?q
▷
(
P
≡
(
Q
∗
P'
))
∗
▷
?q
box
N
(
delete
γ
f
)
P'
.
Proof
.
iIntros
(??)
"#Hslice Hbox"
.
iMod
(
slice_empty
with
"Hslice Hbox"
)
as
"[$ Hbox]"
;
try
done
.
...
...
@@ -221,8 +217,7 @@ Proof.
assert
(
true
=
b
)
as
<-
by
eauto
.
iInv
N
as
(
b
)
"[>Hγ HΦ]"
"Hclose"
.
iDestruct
(
box_own_auth_agree
γ
b
true
with
"[-]"
)
as
%->
;
first
by
iFrame
.
iMod
(
box_own_auth_update
γ
true
true
false
with
"[Hγ Hγ']"
)
as
"[Hγ $]"
;
first
by
iFrame
.
iMod
(
box_own_auth_update
γ
true
true
false
with
"[$Hγ $Hγ']"
)
as
"[Hγ $]"
.
iMod
(
"Hclose"
with
"[Hγ]"
)
;
first
(
iNext
;
iExists
false
;
iFrame
;
eauto
).
iFrame
"HγΦ Hinv"
.
by
iApply
"HΦ"
.
}
iModIntro
;
iSplitL
"HΦ"
.
...
...
@@ -230,24 +225,24 @@ Proof.
-
iExists
Φ
;
iSplit
;
by
rewrite
big_sepM_fmap
.
Qed
.
Lemma
slice_split
E
f
P
Q1
Q2
γ
b
:
Lemma
slice_split
E
q
f
P
Q1
Q2
γ
b
:
↑
N
⊆
E
→
f
!!
γ
=
Some
b
→
slice
N
γ
(
Q1
∗
Q2
)
-
∗
▷
box
N
f
P
={
E
}=
∗
∃
γ
1
γ
2
,
slice
N
γ
(
Q1
∗
Q2
)
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
∃
γ
1
γ
2
,
⌜
delete
γ
f
!!
γ
1
=
None
⌝
∗
⌜
delete
γ
f
!!
γ
2
=
None
⌝
∗
⌜γ
1
≠
γ
2
⌝
∗
slice
N
γ
1
Q1
∗
slice
N
γ
2
Q2
∗
▷
box
N
(<[
γ
2
:
=
b
]>(<[
γ
1
:
=
b
]>(
delete
γ
f
)))
P
.
slice
N
γ
1
Q1
∗
slice
N
γ
2
Q2
∗
▷
?q
box
N
(<[
γ
2
:
=
b
]>(<[
γ
1
:
=
b
]>(
delete
γ
f
)))
P
.
Proof
.
iIntros
(??)
"#Hslice Hbox"
.
destruct
b
.
-
iMod
(
slice_delete_full
with
"Hslice Hbox"
)
as
(
P'
)
"([HQ1 HQ2] & Heq & Hbox)"
;
try
done
.
iMod
(
slice_insert_full
Q1
with
"HQ1 Hbox"
)
as
(
γ
1
)
"(% & #Hslice1 & Hbox)"
;
first
done
.
iMod
(
slice_insert_full
Q2
with
"HQ2 Hbox"
)
as
(
γ
2
)
"(% & #Hslice2 & Hbox)"
;
first
done
.
iMod
(
slice_insert_full
with
"HQ1 Hbox"
)
as
(
γ
1
)
"(% & #Hslice1 & Hbox)"
;
first
done
.
iMod
(
slice_insert_full
with
"HQ2 Hbox"
)
as
(
γ
2
)
"(% & #Hslice2 & Hbox)"
;
first
done
.
iExists
γ
1
,
γ
2
.
iFrame
"%#"
.
iModIntro
.
iSplit
;
last
iSplit
;
try
iPureIntro
.
{
by
eapply
lookup_insert_None
.
}
{
by
apply
(
lookup_insert_None
(
delete
γ
f
)
γ
1
γ
2
true
).
}
iNext
.
eapply
internal_eq_rewrite_contractive
;
[
by
apply
_
|
|
by
eauto
].
iNext
.
iRewrite
"Heq"
.
iPureIntro
.
by
rewrite
assoc
(
comm
_
Q2
).
-
iMod
(
slice_delete_empty
with
"Hslice Hbox"
)
as
(
P'
)
"[Heq Hbox]"
;
try
done
.
iMod
(
slice_insert_empty
Q1
with
"Hbox"
)
as
(
γ
1
)
"(% & #Hslice1 & Hbox)"
.
iMod
(
slice_insert_empty
Q2
with
"Hbox"
)
as
(
γ
2
)
"(% & #Hslice2 & Hbox)"
.
iMod
(
slice_insert_empty
with
"Hbox"
)
as
(
γ
1
)
"(% & #Hslice1 & Hbox)"
.
iMod
(
slice_insert_empty
with
"Hbox"
)
as
(
γ
2
)
"(% & #Hslice2 & Hbox)"
.
iExists
γ
1
,
γ
2
.
iFrame
"%#"
.
iModIntro
.
iSplit
;
last
iSplit
;
try
iPureIntro
.
{
by
eapply
lookup_insert_None
.
}
{
by
apply
(
lookup_insert_None
(
delete
γ
f
)
γ
1
γ
2
false
).
}
...
...
@@ -255,17 +250,17 @@ Proof.
iNext
.
iRewrite
"Heq"
.
iPureIntro
.
by
rewrite
assoc
(
comm
_
Q2
).
Qed
.
Lemma
slice_combine
E
f
P
Q1
Q2
γ
1
γ
2
b
:
Lemma
slice_combine
E
q
f
P
Q1
Q2
γ
1
γ
2
b
:
↑
N
⊆
E
→
γ
1
≠
γ
2
→
f
!!
γ
1
=
Some
b
→
f
!!
γ
2
=
Some
b
→
slice
N
γ
1
Q1
-
∗
slice
N
γ
2
Q2
-
∗
▷
box
N
f
P
={
E
}=
∗
∃
γ
,
slice
N
γ
1
Q1
-
∗
slice
N
γ
2
Q2
-
∗
▷
?q
box
N
f
P
={
E
}=
∗
∃
γ
,
⌜
delete
γ
2
(
delete
γ
1
f
)
!!
γ
=
None
⌝
∗
slice
N
γ
(
Q1
∗
Q2
)
∗
▷
box
N
(<[
γ
:
=
b
]>(
delete
γ
2
(
delete
γ
1
f
)))
P
.
▷
?q
box
N
(<[
γ
:
=
b
]>(
delete
γ
2
(
delete
γ
1
f
)))
P
.
Proof
.
iIntros
(????)
"#Hslice1 #Hslice2 Hbox"
.
destruct
b
.
-
iMod
(
slice_delete_full
with
"Hslice1 Hbox"
)
as
(
P1
)
"(HQ1 & Heq1 & Hbox)"
;
try
done
.
iMod
(
slice_delete_full
with
"Hslice2 Hbox"
)
as
(
P2
)
"(HQ2 & Heq2 & Hbox)"
;
first
done
.
{
by
simplify_map_eq
.
}
iMod
(
slice_insert_full
(
Q1
∗
Q2
)%
I
with
"[$HQ1 $HQ2] Hbox"
)
iMod
(
slice_insert_full
_
_
_
_
(
Q1
∗
Q2
)%
I
with
"[$HQ1 $HQ2] Hbox"
)
as
(
γ
)
"(% & #Hslice & Hbox)"
;
first
done
.
iExists
γ
.
iFrame
"%#"
.
iModIntro
.
iNext
.
eapply
internal_eq_rewrite_contractive
;
[
by
apply
_
|
|
by
eauto
].
...
...
@@ -273,7 +268,7 @@ Proof.
-
iMod
(
slice_delete_empty
with
"Hslice1 Hbox"
)
as
(
P1
)
"(Heq1 & Hbox)"
;
try
done
.
iMod
(
slice_delete_empty
with
"Hslice2 Hbox"
)
as
(
P2
)
"(Heq2 & Hbox)"
;
first
done
.
{
by
simplify_map_eq
.
}
iMod
(
slice_insert_empty
(
Q1
∗
Q2
)%
I
with
"Hbox"
)
as
(
γ
)
"(% & #Hslice & Hbox)"
.
iMod
(
slice_insert_empty
with
"Hbox"
)
as
(
γ
)
"(% & #Hslice & Hbox)"
.
iExists
γ
.
iFrame
"%#"
.
iModIntro
.
iNext
.
eapply
internal_eq_rewrite_contractive
;
[
by
apply
_
|
|
by
eauto
].
iNext
.
iRewrite
"Heq1"
.
iRewrite
"Heq2"
.
by
rewrite
assoc
.
...
...
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