Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Iris
gpfsl
Commits
d9d7e576
Commit
d9d7e576
authored
Oct 07, 2021
by
Hai Dang
Browse files
Minor cleanup
parent
a9ed30a3
Changes
1
Hide whitespace changes
Inline
Side-by-side
theories/examples/queue/proof_per_elem_graph.v
View file @
d9d7e576
...
...
@@ -27,41 +27,39 @@ Context {Σ : gFunctors} `{noprolG Σ, inG Σ (graphR qevent)}.
#[
local
]
Notation
iProp
:
=
(
iProp
Σ
).
#[
local
]
Notation
vProp
:
=
(
vProp
Σ
).
Variable
N
:
namespace
.
Hypothesis
msq
:
weak_queue_spec
Σ
.
Variable
P
:
Z
→
vProp
.
Variable
q
:
loc
.
Implicit
Types
(
N
:
namespace
)
(
P
:
Z
→
vProp
)
(
q
:
loc
).
Definition
queue_resources
G
:
vProp
:
=
Definition
queue_resources
P
G
:
vProp
:
=
([
∗
set
]
eid
∈
filter
(
unmatched_enq_2
G
)
(
to_set
G
.(
Es
)),
match
G
.(
Es
)
!!
eid
with
|
Some
(
mkGraphEvent
(
Enq
v
)
V
_
)
=>
@{
V
.(
dv_in
)}
P
v
|
_
=>
emp
(* this is impossible *)
end
)%
I
.
Instance
queue_resources_objective
G
:
Objective
(
queue_resources
G
).
Instance
queue_resources_objective
P
G
:
Objective
(
queue_resources
P
G
).
Proof
.
apply
big_sepS_objective
=>
e
.
destruct
(
G
.(
Es
)
!!
e
)
as
[[
ge
??]|]
;
[|
apply
_
].
destruct
ge
;
apply
_
.
Qed
.
Definition
QueuePerElemInv
γ
g
:
vProp
:
=
∃
G
,
msq
.(
QueueInv
)
γ
g
G
∗
queue_resources
G
.
Definition
QueuePerElemInv
P
γ
g
:
vProp
:
=
∃
G
,
msq
.(
QueueInv
)
γ
g
G
∗
queue_resources
P
G
.
Local
Existing
Instance
QueueInv_Objective
.
Instance
QueuePerElemInv_objective
γ
g
:
Objective
(
QueuePerElemInv
γ
g
)
:
=
_
.
Instance
QueuePerElemInv_objective
P
γ
g
:
Objective
(
QueuePerElemInv
P
γ
g
)
:
=
_
.
Definition
QueuePerElem
γ
g
:
vProp
:
=
Definition
QueuePerElem
N
P
γ
g
q
:
vProp
:
=
∃
G
M
,
msq
.(
QueueLocal
)
(
N
.@
"que"
)
γ
g
q
G
M
∗
inv
(
N
.@
"iinv"
)
(
QueuePerElemInv
γ
g
).
inv
(
N
.@
"iinv"
)
(
QueuePerElemInv
P
γ
g
).
(* TODO: we can prove logically-atomic spec here. *)
Lemma
per_elem_enqueue
(
DISJ
:
N
##
histN
)
γ
g
(
x
:
Z
)
tid
(
NZ
:
0
<
x
)
:
{{{
QueuePerElem
γ
g
∗
▷
P
x
}}}
Lemma
per_elem_enqueue
N
P
γ
g
q
(
x
:
Z
)
tid
(
DISJ
:
N
##
histN
)
(
NZ
:
0
<
x
)
:
{{{
QueuePerElem
N
P
γ
g
q
∗
▷
P
x
}}}
msq
.(
enqueue
)
[
#
q
;
#
x
]
@
tid
;
⊤
{{{
RET
#
☠
;
QueuePerElem
γ
g
}}}.
{{{
RET
#
☠
;
QueuePerElem
N
P
γ
g
q
}}}.
Proof
.
iIntros
(
Φ
)
"[Queue P] Post"
.
iDestruct
"Queue"
as
(
G0
M0
)
"[Queue #QPI]"
.
...
...
@@ -86,7 +84,7 @@ Proof.
{
by
rewrite
EsG'
Eqenq
lookup_app_1_eq
.
}
iIntros
"!>"
.
iAssert
(
▷
queue_resources
G'
)%
I
with
"[P Elems]"
as
"Elems'"
.
iAssert
(
▷
queue_resources
P
G'
)%
I
with
"[P Elems]"
as
"Elems'"
.
{
iNext
.
rewrite
/
queue_resources
.
have
UMe
:
unmatched_enq_2
G'
enqId
.
{
split
.
...
...
@@ -123,10 +121,10 @@ Proof.
iExists
_
,
_
.
by
iFrame
.
Qed
.
Lemma
per_elem_dequeue
(
DISJ
:
N
##
histN
)
γ
g
tid
:
{{{
QueuePerElem
γ
g
}}}
Lemma
per_elem_dequeue
N
P
γ
g
q
tid
(
DISJ
:
N
##
histN
)
:
{{{
QueuePerElem
N
P
γ
g
q
}}}
msq
.(
dequeue
)
[
#
q
]
@
tid
;
⊤
{{{
(
x
:
Z
),
RET
#
x
;
QueuePerElem
γ
g
∗
(
⌜
x
=
0
⌝
∨
▷
P
x
)
}}}.
{{{
(
x
:
Z
),
RET
#
x
;
QueuePerElem
N
P
γ
g
q
∗
(
⌜
x
=
0
⌝
∨
▷
P
x
)
}}}.
Proof
.
iIntros
(
Φ
)
"QI Post"
.
iDestruct
"QI"
as
(
G0
M0
)
"[Queue #QPI]"
.
iApply
(
wp_step_fupd
_
_
⊤
_
(
∀
_
,
_
-
∗
_
)%
I
with
"[$Post]"
)
;
[
auto
..|].
...
...
@@ -190,7 +188,7 @@ Proof.
have
EqEm'
:
G'
.(
Es
)
!!
enqId
=
Some
(
mkGraphEvent
(
Enq
x
)
Venq
Menq
).
{
rewrite
EsG'
lookup_app_1_ne
;
[
done
|
by
rewrite
-
Eqdeq
].
}
iAssert
(
▷
(@{
Venq
.(
dv_in
)}
P
x
∗
queue_resources
G'
))%
I
iAssert
(
▷
(@{
Venq
.(
dv_in
)}
P
x
∗
queue_resources
P
G'
))%
I
with
"[Elems]"
as
"[Px Elems]"
.
{
iNext
.
rewrite
/
queue_resources
.
rewrite
(
_:
(@{
Venq
.(
dv_in
)}
P
x
)%
I
...
...
@@ -260,19 +258,19 @@ From gpfsl.examples.queue Require Import code_ms proof_ms_graph.
(* TODO: use ther spec_per_elem one. Need try_enq and try_deq *)
Section
RSL_instance
.
Context
{
Σ
:
gFunctors
}
`
{
noprolG
Σ
,
!
msqueueG
Σ
,
!
atomicG
Σ
}.
Context
(
P
:
lit
→
vProp
Σ
)
(
q
:
loc
).
Let
is_queue
N
:
=
QueuePerElem
N
(
msqueue_impl_weak
Σ
).
Let
is_queue
:
=
QueuePerElem
(
msqueue_impl_weak
Σ
).
Lemma
per_elem_enqueue_inst
N
(
DISJ
:
N
##
histN
)
γ
g
(
x
:
Z
)
tid
(
NZ
:
(
0
<
x
)%
Z
)
:
{{{
is_queue
N
P
q
γ
g
∗
▷
P
x
}}}
Lemma
per_elem_enqueue_inst
N
P
γ
g
q
(
x
:
Z
)
tid
(
NZ
:
(
0
<
x
)%
Z
)
(
DISJ
:
N
##
histN
)
:
{{{
is_queue
N
P
γ
g
q
∗
▷
P
x
}}}
enqueue
[
#
q
;
#
x
]
@
tid
;
⊤
{{{
RET
#
☠
;
is_queue
N
P
q
γ
g
}}}.
{{{
RET
#
☠
;
is_queue
N
P
γ
g
q
}}}.
Proof
.
by
apply
:
per_elem_enqueue
.
Qed
.
Lemma
per_elem_dequeue_inst
N
(
DISJ
:
N
##
histN
)
γ
g
tid
:
{{{
is_queue
N
P
q
γ
g
}}}
Lemma
per_elem_dequeue_inst
N
P
γ
g
q
tid
(
DISJ
:
N
##
histN
)
:
{{{
is_queue
N
P
γ
g
q
}}}
dequeue
[
#
q
]
@
tid
;
⊤
{{{
(
x
:
Z
),
RET
#
x
;
is_queue
N
P
q
γ
g
∗
(
⌜
x
=
0
⌝
∨
▷
P
x
)
}}}.
{{{
(
x
:
Z
),
RET
#
x
;
is_queue
N
P
γ
g
q
∗
(
⌜
x
=
0
⌝
∨
▷
P
x
)
}}}.
Proof
.
by
apply
:
per_elem_dequeue
.
Qed
.
End
RSL_instance
.
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