Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Iris
Tutorial POPL18
Commits
e3601a05
Commit
e3601a05
authored
Jun 11, 2019
by
Ralf Jung
Browse files
bump Iris, update for frac_auth notation
parent
2d178e1e
Pipeline
#17672
canceled with stage
in 2 minutes and 38 seconds
Changes
4
Pipelines
9
Hide whitespace changes
Inline
Side-by-side
exercises/ex_04_parallel_add.v
View file @
e3601a05
...
...
@@ -131,7 +131,7 @@ Section proof3.
Context
`
{!
heapG
Σ
,
!
spawnG
Σ
,
!
inG
Σ
(
frac_authR
natR
)}.
Definition
parallel_add_inv_3
(
r
:
loc
)
(
γ
:
gname
)
:
iProp
Σ
:
=
(
∃
n
:
nat
,
r
↦
#
n
∗
own
γ
(
●
!
n
))%
I
.
(
∃
n
:
nat
,
r
↦
#
n
∗
own
γ
(
●
F
n
))%
I
.
(** *Exercise*: finish the missing cases of the proof. *)
Lemma
parallel_add_spec_3
:
...
...
@@ -139,17 +139,17 @@ Section proof3.
Proof
.
iIntros
(
Φ
)
"_ Post"
.
unfold
parallel_add
.
wp_alloc
r
as
"Hr"
.
wp_let
.
iMod
(
own_alloc
(
●
!
0
%
nat
⋅
◯
!
0
%
nat
))
as
(
γ
)
"[Hγ● [Hγ1◯ Hγ2◯]]"
.
iMod
(
own_alloc
(
●
F
0
%
nat
⋅
◯
F
0
%
nat
))
as
(
γ
)
"[Hγ● [Hγ1◯ Hγ2◯]]"
.
{
by
apply
auth_both_valid
.
}
wp_apply
(
newlock_spec
(
parallel_add_inv_3
r
γ
)
with
"[Hr Hγ●]"
).
{
(* exercise *)
admit
.
}
iIntros
(
l
)
"#Hl"
.
wp_let
.
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
with
"[Hγ1◯] [Hγ2◯]"
).
-
wp_apply
(
acquire_spec
with
"Hl"
).
iDestruct
1
as
(
n
)
"[Hr Hγ●]"
.
wp_seq
.
wp_load
.
wp_op
.
wp_store
.
iMod
(
own_update_2
_
_
_
(
●
!
(
n
+
2
)
⋅
◯
!
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ1◯"
)
as
"[Hγ● Hγ1◯]"
.
iMod
(
own_update_2
_
_
_
(
●
F
(
n
+
2
)
⋅
◯
F
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ1◯"
)
as
"[Hγ● Hγ1◯]"
.
{
rewrite
(
comm
plus
).
by
apply
frac_auth_update
,
(
op_local_update_discrete
n
0
2
)%
nat
.
}
wp_apply
(
release_spec
with
"[$Hl Hr Hγ●]"
)
;
[|
by
auto
].
...
...
opam
View file @
e3601a05
...
...
@@ -9,5 +9,5 @@ build: [make "-j%{jobs}%"]
install: [] # This repo does not install
remove: []
depends: [
"coq-iris" { (= "dev.2019-0
5-24.0.c9984c7
f") | (= "dev") }
"coq-iris" { (= "dev.2019-0
6-11.8.a51fa3c
f") | (= "dev") }
]
solutions/ex_04_parallel_add.v
View file @
e3601a05
...
...
@@ -144,7 +144,7 @@ Section proof3.
Context
`
{!
heapG
Σ
,
!
spawnG
Σ
,
!
inG
Σ
(
frac_authR
natR
)}.
Definition
parallel_add_inv_3
(
r
:
loc
)
(
γ
:
gname
)
:
iProp
Σ
:
=
(
∃
n
:
nat
,
r
↦
#
n
∗
own
γ
(
●
!
n
))%
I
.
(
∃
n
:
nat
,
r
↦
#
n
∗
own
γ
(
●
F
n
))%
I
.
(** *Exercise*: finish the missing cases of the proof. *)
Lemma
parallel_add_spec_3
:
...
...
@@ -152,16 +152,16 @@ Section proof3.
Proof
.
iIntros
(
Φ
)
"_ Post"
.
unfold
parallel_add
.
wp_alloc
r
as
"Hr"
.
wp_let
.
iMod
(
own_alloc
(
●
!
0
%
nat
⋅
◯
!
0
%
nat
))
as
(
γ
)
"[Hγ● [Hγ1◯ Hγ2◯]]"
.
iMod
(
own_alloc
(
●
F
0
%
nat
⋅
◯
F
0
%
nat
))
as
(
γ
)
"[Hγ● [Hγ1◯ Hγ2◯]]"
.
{
by
apply
auth_both_valid
.
}
wp_apply
(
newlock_spec
(
parallel_add_inv_3
r
γ
)
with
"[Hr Hγ●]"
).
{
(* exercise *)
iExists
0
%
nat
.
iFrame
.
}
iIntros
(
l
)
"#Hl"
.
wp_let
.
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
with
"[Hγ1◯] [Hγ2◯]"
).
-
wp_apply
(
acquire_spec
with
"Hl"
).
iDestruct
1
as
(
n
)
"[Hr Hγ●]"
.
wp_seq
.
wp_load
.
wp_op
.
wp_store
.
iMod
(
own_update_2
_
_
_
(
●
!
(
n
+
2
)
⋅
◯
!
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ1◯"
)
as
"[Hγ● Hγ1◯]"
.
iMod
(
own_update_2
_
_
_
(
●
F
(
n
+
2
)
⋅
◯
F
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ1◯"
)
as
"[Hγ● Hγ1◯]"
.
{
rewrite
(
comm
plus
).
by
apply
frac_auth_update
,
(
op_local_update_discrete
n
0
2
)%
nat
.
}
wp_apply
(
release_spec
with
"[$Hl Hr Hγ●]"
)
;
[|
by
auto
].
...
...
@@ -169,7 +169,7 @@ Section proof3.
-
(* exercise *)
wp_apply
(
acquire_spec
with
"Hl"
).
iDestruct
1
as
(
n
)
"[Hr Hγ●]"
.
wp_seq
.
wp_load
.
wp_op
.
wp_store
.
iMod
(
own_update_2
_
_
_
(
●
!
(
n
+
2
)
⋅
◯
!
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ2◯"
)
as
"[Hγ● Hγ2◯]"
.
iMod
(
own_update_2
_
_
_
(
●
F
(
n
+
2
)
⋅
◯
F
{
1
/
2
}
2
)%
nat
with
"Hγ● Hγ2◯"
)
as
"[Hγ● Hγ2◯]"
.
{
rewrite
(
comm
plus
).
by
apply
frac_auth_update
,
(
op_local_update_discrete
n
0
2
)%
nat
.
}
wp_apply
(
release_spec
with
"[- $Hl Hγ2◯]"
)
;
[|
by
auto
].
...
...
talks/demo/part4.v
View file @
e3601a05
...
...
@@ -54,23 +54,23 @@ Section proof2.
(* Rules for fractional ghost variables
(proved from generic principles) *)
Lemma
frac_auth_alloc
n
:
(|==>
∃
γ
,
own
γ
(
●
!
n
)
∗
own
γ
(
◯
!
{
1
}
n
))%
I
.
(|==>
∃
γ
,
own
γ
(
●
F
n
)
∗
own
γ
(
◯
F
{
1
}
n
))%
I
.
Proof
.
by
iMod
(
own_alloc
(
●
!
n
⋅
◯
!
n
))
by
iMod
(
own_alloc
(
●
F
n
⋅
◯
F
n
))
as
(
γ
)
"[??]"
;
eauto
with
iFrame
.
Qed
.
Lemma
frac_auth_update
n
n1
n2
q
γ
:
own
γ
(
●
!
n1
)
-
∗
own
γ
(
◯
!
{
q
}
n2
)
-
∗
|==>
own
γ
(
●
!
(
n1
+
n
)%
nat
)
∗
own
γ
(
◯
!
{
q
}
(
n2
+
n
)%
nat
).
own
γ
(
●
F
n1
)
-
∗
own
γ
(
◯
F
{
q
}
n2
)
-
∗
|==>
own
γ
(
●
F
(
n1
+
n
)%
nat
)
∗
own
γ
(
◯
F
{
q
}
(
n2
+
n
)%
nat
).
Proof
.
iIntros
"H H'"
.
iMod
(
own_update_2
with
"H H'"
)
as
"[$ $]"
;
last
done
.
apply
frac_auth_update
,
nat_local_update
.
lia
.
Qed
.
Lemma
frac_auth_agree
n
n'
γ
:
own
γ
(
●
!
n
)
-
∗
own
γ
(
◯
!
{
1
}
n'
)
-
∗
⌜
n
=
n'
⌝
.
own
γ
(
●
F
n
)
-
∗
own
γ
(
◯
F
{
1
}
n'
)
-
∗
⌜
n
=
n'
⌝
.
Proof
.
iIntros
"H H'"
.
by
iDestruct
(
own_valid_2
with
"H H'"
)
as
%->%
frac_auth_agreeL
.
...
...
@@ -78,13 +78,13 @@ Section proof2.
(* The invariant that we use *)
Definition
proof2_inv
(
γ
:
gname
)
(
l
:
loc
)
:
iProp
Σ
:
=
(
∃
n
:
nat
,
own
γ
(
●
!
n
)
∗
l
↦
#
n
)%
I
.
(
∃
n
:
nat
,
own
γ
(
●
F
n
)
∗
l
↦
#
n
)%
I
.
(* Proof of the threads *)
Lemma
par_inc_FAA_spec
n
n'
γ
l
q
:
{{{
inv
N
(
proof2_inv
γ
l
)
∗
own
γ
(
◯
!
{
q
}
n
)
}}}
{{{
inv
N
(
proof2_inv
γ
l
)
∗
own
γ
(
◯
F
{
q
}
n
)
}}}
FAA
#
l
#
n'
{{{
m
,
RET
#
m
;
own
γ
(
◯
!
{
q
}
(
n
+
n'
))%
nat
}}}.
{{{
m
,
RET
#
m
;
own
γ
(
◯
F
{
q
}
(
n
+
n'
))%
nat
}}}.
Proof
.
iIntros
(
Φ
)
"[#Hinv Hγ] Post"
.
iInv
N
as
(
m
)
">[Hauth Hl]"
"Hclose"
.
wp_faa
.
...
...
@@ -103,8 +103,8 @@ Section proof2.
iDestruct
"Hγ"
as
"[Hγ1 Hγ2]"
.
iMod
(
inv_alloc
_
_
(
proof2_inv
γ
l
)
with
"[Hl Hauth]"
)
as
"#Hinv"
.
{
iNext
.
iExists
0
%
nat
.
iFrame
.
}
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
!
{
1
/
2
}
2
%
nat
))
with
"[Hγ1] [Hγ2]"
).
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
F
{
1
/
2
}
2
%
nat
))
with
"[Hγ1] [Hγ2]"
).
-
iApply
(
par_inc_FAA_spec
0
2
with
"[$]"
)
;
auto
.
-
iApply
(
par_inc_FAA_spec
0
2
with
"[$]"
)
;
auto
.
-
iIntros
(
v1
v2
)
"[Hγ1 Hγ2] !>"
.
iCombine
"Hγ1 Hγ2"
as
"Hγ"
.
simpl
.
...
...
@@ -117,9 +117,9 @@ Section proof2.
Qed
.
Lemma
par_incN_helper_spec
n
γ
l
q
:
{{{
inv
N
(
proof2_inv
γ
l
)
∗
own
γ
(
◯
!
{
q
}
0
%
nat
)
}}}
{{{
inv
N
(
proof2_inv
γ
l
)
∗
own
γ
(
◯
F
{
q
}
0
%
nat
)
}}}
par_incN_helper
#
n
#
l
{{{
v
,
RET
v
;
own
γ
(
◯
!
{
q
}
(
n
*
2
))%
nat
}}}.
{{{
v
,
RET
v
;
own
γ
(
◯
F
{
q
}
(
n
*
2
))%
nat
}}}.
Proof
.
iIntros
(
Φ
)
"[#? Hγ] Post /="
.
iInduction
n
as
[|
n
]
"IH"
forall
(
q
Φ
).
...
...
@@ -127,8 +127,8 @@ Section proof2.
rewrite
Nat2Z
.
inj_succ
.
do
2
wp_let
.
wp_op
.
case_bool_decide
;
first
lia
.
wp_if
.
iDestruct
"Hγ"
as
"[Hγ1 Hγ2]"
.
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
!
{
q
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
!
{
q
/
2
}
(
n
*
2
)%
nat
))
with
"[Hγ1] [Hγ2]"
).
wp_apply
(
wp_par
(
λ
_
,
own
γ
(
◯
F
{
q
/
2
}
2
%
nat
))
(
λ
_
,
own
γ
(
◯
F
{
q
/
2
}
(
n
*
2
)%
nat
))
with
"[Hγ1] [Hγ2]"
).
-
iApply
(
par_inc_FAA_spec
0
2
with
"[$]"
)
;
auto
.
-
wp_op
.
rewrite
(
_
:
Z
.
succ
n
-
1
=
n
)
;
last
lia
.
iApply
(
"IH"
with
"Hγ2"
)
;
auto
.
...
...
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment