Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
lambda-rust
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
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
Simon Spies
lambda-rust
Commits
c6a626ad
Commit
c6a626ad
authored
8 years ago
by
Ralf Jung
Browse files
Options
Downloads
Patches
Plain Diff
heap: avoid dec_agree
parent
64751fcd
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
theories/lang/heap.v
+34
-33
34 additions, 33 deletions
theories/lang/heap.v
with
34 additions
and
33 deletions
theories/lang/heap.v
+
34
−
33
View file @
c6a626ad
From
iris
.
algebra
Require
Import
cmra_big_op
gmap
frac
dec_
agree
.
From
iris
.
algebra
Require
Import
cmra_big_op
gmap
frac
agree
.
From
iris
.
algebra
Require
Import
csum
excl
auth
.
From
iris
.
base_logic
Require
Import
big_op
lib
.
invariants
lib
.
fractional
.
From
iris
.
proofmode
Require
Export
tactics
.
...
...
@@ -11,7 +11,7 @@ Definition lock_stateR : cmraT :=
csumR
(
exclR
unitC
)
natR
.
Definition
heapUR
:
ucmraT
:=
gmapUR
loc
(
prodR
(
prodR
fracR
lock_stateR
)
(
dec_
agreeR
val
))
.
gmapUR
loc
(
prodR
(
prodR
fracR
lock_stateR
)
(
agreeR
val
C
))
.
Definition
heap_freeableUR
:
ucmraT
:=
gmapUR
block
(
prodR
fracR
(
gmapR
Z
(
exclR
unitC
)))
.
...
...
@@ -27,7 +27,7 @@ Class heapG Σ := HeapG {
Definition
to_lock_stateR
(
x
:
lock_state
)
:
lock_stateR
:=
match
x
with
RSt
n
=>
Cinr
n
|
WSt
=>
Cinl
(
Excl
())
end
.
Definition
to_heap
:
state
→
heapUR
:=
fmap
(
λ
v
,
(
1
%
Qp
,
to_lock_stateR
(
v
.
1
),
DecA
gree
(
v
.
2
)))
.
fmap
(
λ
v
,
(
1
%
Qp
,
to_lock_stateR
(
v
.
1
),
to_a
gree
(
v
.
2
)))
.
Definition
heap_freeable_rel
(
σ
:
state
)
(
hF
:
heap_freeableUR
)
:
Prop
:=
∀
blk
qs
,
hF
!!
blk
=
Some
qs
→
qs
.
2
≠
∅
∧
∀
i
,
is_Some
(
σ
!!
(
blk
,
i
))
↔
is_Some
(
qs
.
2
!!
i
)
.
...
...
@@ -37,7 +37,7 @@ Section definitions.
Definition
heap_mapsto_st
(
st
:
lock_state
)
(
l
:
loc
)
(
q
:
Qp
)
(
v
:
val
)
:
iProp
Σ
:=
own
heap_name
(
◯
{[
l
:=
(
q
,
to_lock_stateR
st
,
DecA
gree
v
)
]})
.
own
heap_name
(
◯
{[
l
:=
(
q
,
to_lock_stateR
st
,
to_a
gree
v
)
]})
.
Definition
heap_mapsto_def
(
l
:
loc
)
(
q
:
Qp
)
(
v
:
val
)
:
iProp
Σ
:=
heap_mapsto_st
(
RSt
0
)
l
q
v
.
...
...
@@ -105,7 +105,7 @@ Section heap.
Lemma
to_heap_insert
σ
l
x
v
:
to_heap
(
<
[
l
:=(
x
,
v
)]
>
σ
)
=
<
[
l
:=(
1
%
Qp
,
to_lock_stateR
x
,
DecA
gree
v
)]
>
(
to_heap
σ
)
.
=
<
[
l
:=(
1
%
Qp
,
to_lock_stateR
x
,
to_a
gree
v
)]
>
(
to_heap
σ
)
.
Proof
.
by
rewrite
/
to_heap
fmap_insert
.
Qed
.
Lemma
to_heap_delete
σ
l
:
to_heap
(
delete
l
σ
)
=
delete
l
(
to_heap
σ
)
.
...
...
@@ -119,8 +119,8 @@ Section heap.
Global
Instance
heap_mapsto_fractional
l
v
:
Fractional
(
λ
q
,
l
↦
{
q
}
v
)
%
I
.
Proof
.
intros
p
q
.
by
rewrite
heap_mapsto_eq
-
own_op
-
auth_frag_op
op_singleton
pair_op
dec_
agree_idemp
.
intros
p
q
.
by
rewrite
heap_mapsto_eq
-
own_op
-
auth_frag_op
op_singleton
pair_op
agree_idemp
.
Qed
.
Global
Instance
heap_mapsto_as_fractional
l
q
v
:
AsFractional
(
l
↦
{
q
}
v
)
(
λ
q
,
l
↦
{
q
}
v
)
%
I
q
.
...
...
@@ -141,15 +141,13 @@ Section heap.
Global
Instance
heap_freeable_timeless
q
l
n
:
TimelessP
(
†
{
q
}
l
…
n
)
.
Proof
.
rewrite
heap_freeable_eq
/
heap_freeable_def
.
apply
_
.
Qed
.
Lemma
heap_mapsto_
op
l
q1
q2
v1
v2
:
l
↦
{
q1
}
v1
∗
l
↦
{
q2
}
v2
⊣
⊢
⌜
v1
=
v2
⌝
∧
l
↦
{
q1
+
q2
}
v1
.
Lemma
heap_mapsto_
agree
l
q1
q2
v1
v2
:
l
↦
{
q1
}
v1
∗
l
↦
{
q2
}
v2
⊢
⌜
v1
=
v2
⌝.
Proof
.
destruct
(
decide
(
v1
=
v2
))
as
[
->
|]
.
{
by
rewrite
-
(
fractional
(
Φ
:=
λ
q
,
l
↦
{
q
}
_)
%
I
)
pure_True
//
left_id
.
}
apply
(
anti_symm
(
⊢
));
last
by
apply
pure_elim_l
.
rewrite
heap_mapsto_eq
-
own_op
-
auth_frag_op
own_valid
discrete_valid
.
eapply
pure_elim
;
[
done
|]=>
/
auth_own_valid
/=.
rewrite
op_singleton
pair_op
dec_agree_ne
//
singleton_valid
.
by
intros
[]
.
rewrite
op_singleton
pair_op
singleton_valid
.
case
.
rewrite
/=
to_agree_comp_valid
=>?
Heq
.
fold_leibniz
.
eauto
.
Qed
.
Lemma
heap_mapsto_vec_nil
l
q
:
l
↦∗
{
q
}
[]
⊣⊢
True
.
...
...
@@ -181,7 +179,9 @@ Section heap.
rewrite
!
heap_mapsto_vec_cons
.
iIntros
"[[Hv1 Hvl1] [Hv2 Hvl2]]"
.
iDestruct
(
IH
(
shift_loc
l
1
)
with
"[Hvl1 Hvl2]"
)
as
"[% $]"
;
subst
;
first
by
iFrame
.
rewrite
(
inj_iff
(::
vl2
))
.
iApply
heap_mapsto_op
.
by
iFrame
.
rewrite
(
inj_iff
(::
vl2
))
.
iDestruct
(
heap_mapsto_agree
with
"[$Hv1 $Hv2]"
)
as
%<-.
iSplit
;
first
done
.
iFrame
.
-
by
iIntros
"[% [$ Hl2]]"
;
subst
.
Qed
.
...
...
@@ -203,10 +203,10 @@ Section heap.
Lemma
heap_mapsto_vec_combine
l
q
vl
:
vl
≠
[]
→
l
↦∗
{
q
}
vl
⊣⊢
own
heap_name
(
◯
[
⋅
list
]
i
↦
v
∈
vl
,
{[
shift_loc
l
i
:=
(
q
,
Cinr
0
%
nat
,
DecA
gree
v
)]})
.
{[
shift_loc
l
i
:=
(
q
,
Cinr
0
%
nat
,
to_a
gree
v
)]})
.
Proof
.
rewrite
/
heap_mapsto_vec
heap_mapsto_eq
/
heap_mapsto_def
/
heap_mapsto_st
=>?
.
by
rewrite
(
big_opL_commute
_L
(
Auth
None
))
big_opL_commute1
//.
by
rewrite
(
big_opL_commute
(
Auth
None
))
big_opL_commute1
//.
Qed
.
Lemma
inter_lookup_Some
i
j
(
n
:
nat
):
...
...
@@ -307,7 +307,7 @@ Section heap.
own
heap_name
(
●
to_heap
σ
)
==∗
own
heap_name
(
●
to_heap
(
init_mem
l
vl
σ
))
∗
own
heap_name
(
◯
[
⋅
list
]
i
↦
v
∈
vl
,
{[
shift_loc
l
i
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
DecA
gree
v
)]})
.
{[
shift_loc
l
i
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
to_a
gree
v
)]})
.
Proof
.
intros
FREE
.
rewrite
-
own_op
.
apply
own_update
,
auth_update_alloc
.
revert
l
FREE
.
induction
vl
as
[|
v
vl
IH
]=>
l
FRESH
;
[
done
|]
.
...
...
@@ -315,7 +315,7 @@ Section heap.
etrans
;
first
apply
(
IH
(
shift_loc
l
1
))
.
{
intros
.
by
rewrite
shift_loc_assoc
.
}
rewrite
shift_loc_0
-
insert_singleton_op
;
last
first
.
{
rewrite
big_opL_commute
_L
big_opL_None
=>
l'
v'
?
.
{
rewrite
-
equiv_None
big_opL_commute
equiv_None
big_opL_None
=>
l'
v'
?
.
rewrite
lookup_singleton_None
-
{
2
}(
shift_loc_0
l
)
.
apply
not_inj
;
lia
.
}
rewrite
to_heap_insert
.
setoid_rewrite
shift_loc_assoc
.
apply
alloc_local_update
;
last
done
.
apply
lookup_to_heap_None
.
...
...
@@ -348,7 +348,7 @@ Section heap.
Lemma
heap_free_vs
l
vl
σ
:
own
heap_name
(
●
to_heap
σ
)
∗
own
heap_name
(
◯
[
⋅
list
]
i
↦
v
∈
vl
,
{[
shift_loc
l
i
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
DecA
gree
v
)]})
{[
shift_loc
l
i
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
to_a
gree
v
)]})
==∗
own
heap_name
(
●
to_heap
(
free_mem
l
(
length
vl
)
σ
))
.
Proof
.
rewrite
-
own_op
.
apply
own_update
,
auth_update_dealloc
.
...
...
@@ -356,12 +356,12 @@ Section heap.
rewrite
(
big_opL_consZ_l
(
λ
k
_,
_
(_
k
)
_
))
/=
shift_loc_0
.
apply
local_update_total_valid
=>
_
Hvalid
_
.
assert
(([
⋅
list
]
k
↦
y
∈
vl
,
{[
shift_loc
l
(
1
+
k
)
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
DecA
gree
y
)]})
!!
l
=
@
None
(
frac
*
lock_stateR
*
dec_
agree
val
))
.
{[
shift_loc
l
(
1
+
k
)
:=
(
1
%
Qp
,
Cinr
0
%
nat
,
to_a
gree
y
)]})
!!
l
=
@
None
(
frac
*
lock_stateR
*
agree
val
C
))
.
{
move
:
(
Hvalid
l
)
.
rewrite
lookup_op
lookup_singleton
.
by
move
=>
/
(
cmra_discrete_valid_iff
0
)
/
exclusiveN_Some_l
.
}
rewrite
-
insert_singleton_op
//.
etrans
.
{
apply
(
delete_local_update
_
_
l
(
1
%
Qp
,
Cinr
0
%
nat
,
DecA
gree
v
))
.
{
apply
(
delete_local_update
_
_
l
(
1
%
Qp
,
Cinr
0
%
nat
,
to_a
gree
v
))
.
by
rewrite
lookup_insert
.
}
rewrite
delete_insert
//
-
to_heap_delete
delete_free_mem
.
setoid_rewrite
<-
shift_loc_assoc
.
apply
IH
.
...
...
@@ -396,17 +396,17 @@ Section heap.
Lemma
heap_mapsto_lookup
l
ls
q
v
σ
:
own
heap_name
(
●
to_heap
σ
)
-∗
own
heap_name
(
◯
{[
l
:=
(
q
,
to_lock_stateR
ls
,
DecA
gree
v
)
]})
-∗
own
heap_name
(
◯
{[
l
:=
(
q
,
to_lock_stateR
ls
,
to_a
gree
v
)
]})
-∗
⌜∃
n'
:
nat
,
σ
!!
l
=
Some
(
match
ls
with
RSt
n
=>
RSt
(
n
+
n'
)
|
WSt
=>
WSt
end
,
v
)
⌝.
Proof
.
iIntros
"H● H◯"
.
iDestruct
(
own_valid_2
with
"H● H◯"
)
as
%
[
Hl
?]
%
auth_valid_discrete_2
.
iPureIntro
.
move
:
Hl
=>
/
singleton_included
[[[
q'
ls'
]
dv
]]
.
rewrite
leibniz_equiv_iff
/
to_heap
lookup_fmap
fmap_Some
.
move
=>
[[[
ls''
v'
]
[?
?
]]];
simplify_eq
.
rewrite
/
to_heap
lookup_fmap
fmap_Some
_setoid
.
move
=>
[[[
ls''
v'
]
[?
[[
/=
??]
->
]
]]];
simplify_eq
.
move
=>
/
Some_pair_included_total_2
[
/
Some_pair_included
[_
Hincl
]
/
DecA
gree_included
->
]
.
[
/
Some_pair_included
[_
Hincl
]
/
to_a
gree_included
->
]
.
destruct
ls
as
[|
n
],
ls''
as
[|
n''
],
Hincl
as
[[[|
n'
|]|]
[
=
]
%
leibniz_equiv
];
subst
.
by
exists
O
.
eauto
.
exists
O
.
by
rewrite
Nat
.
add_0_r
.
...
...
@@ -414,16 +414,16 @@ Section heap.
Lemma
heap_mapsto_lookup_1
l
ls
v
σ
:
own
heap_name
(
●
to_heap
σ
)
-∗
own
heap_name
(
◯
{[
l
:=
(
1
%
Qp
,
to_lock_stateR
ls
,
DecA
gree
v
)
]})
-∗
own
heap_name
(
◯
{[
l
:=
(
1
%
Qp
,
to_lock_stateR
ls
,
to_a
gree
v
)
]})
-∗
⌜
σ
!!
l
=
Some
(
ls
,
v
)
⌝.
Proof
.
iIntros
"H● H◯"
.
iDestruct
(
own_valid_2
with
"H● H◯"
)
as
%
[
Hl
?]
%
auth_valid_discrete_2
.
iPureIntro
.
move
:
Hl
=>
/
singleton_included
[[[
q'
ls'
]
dv
]]
.
rewrite
leibniz_equiv_iff
/
to_heap
lookup_fmap
fmap_Some
.
move
=>
[[[
ls''
v'
]
[?
?
]]
Hincl
];
simplify_eq
.
apply
(
Some_included_exclusive
_
_)
in
Hincl
as
?
%
leibniz_equiv
;
last
by
destruct
ls''
.
rewrite
/
to_heap
lookup_fmap
fmap_Some
_setoid
.
move
=>
[[[
ls''
v'
]
[?
[[
/=
??]
->
]
]]
Hincl
];
simplify_eq
.
apply
(
Some_included_exclusive
_
_)
in
Hincl
as
[?
Hval
];
last
by
destruct
ls''
.
apply
(
inj
to_agree
)
in
Hval
.
fold_leibniz
.
subst
.
destruct
ls
,
ls''
;
rewrite
?Nat
.
add_0_r
;
naive_solver
.
Qed
.
...
...
@@ -582,9 +582,10 @@ Section heap.
iDestruct
(
heap_mapsto_lookup
with
"Hvalσ Hl1"
)
as
%
[
n1
Hσl1
]
.
iApply
(
wp_cas_pst
with
"[$Hσ]"
);
eauto
.
{
right
.
by
constructor
.
}
{
inversion
1
;
subst
;
simplify_option_eq
.
}
{
inversion
1
;
subst
;
(
by
destruct
(
σ
!!
l1
))
||
by
destruct
(
σ
!!
l'
)
.
}
iNext
.
iIntros
([|])
.
{
iIntros
"[Heq _]"
.
iDestruct
"Heq"
as
%
Heq
.
inversion
Heq
;
simplify_option_eq
.
}
{
iIntros
"[Heq _]"
.
iDestruct
"Heq"
as
%
Heq
.
inversion
Heq
;
subst
.
done
.
by
destruct
(
σ
!!
l1
)
.
by
destruct
(
σ
!!
l'
)
.
}
iIntros
"[_ Hσ]"
.
iMod
(
"Hclose"
with
"[-Hl Hl' Hl1 HΦ]"
)
as
"_"
;
last
by
iApply
"HΦ"
;
iFrame
.
iNext
.
iExists
_,
hF
.
by
iFrame
.
Qed
.
...
...
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