mirror of
https://github.com/achlipala/frap.git
synced 2024-11-10 00:07:51 +00:00
ConcurrentSeparationLogic: 3-stage producer-consumer
This commit is contained in:
parent
6e80356fed
commit
320eb45126
1 changed files with 120 additions and 0 deletions
|
@ -627,6 +627,126 @@ Proof.
|
|||
Qed.
|
||||
|
||||
|
||||
(** ** A length-3 producer-consumer chain *)
|
||||
|
||||
Example stage1 :=
|
||||
_ <- for i := 0 loop
|
||||
cell <- Alloc 2;
|
||||
_ <- Write cell i;
|
||||
_ <- Lock 0;
|
||||
head <- Read 0;
|
||||
_ <- Write (cell+1) head;
|
||||
_ <- Write 0 cell;
|
||||
_ <- Unlock 0;
|
||||
Return (Again (2 + i))
|
||||
done;
|
||||
Return tt.
|
||||
|
||||
Example stage2 :=
|
||||
for i := tt loop
|
||||
_ <- Lock 0;
|
||||
head <- Read 0;
|
||||
if head ==n 0 then
|
||||
_ <- Unlock 0;
|
||||
Return (Again tt)
|
||||
else
|
||||
tail <- Read (head+1);
|
||||
_ <- Write 0 tail;
|
||||
_ <- Unlock 0;
|
||||
|
||||
_ <- Lock 1;
|
||||
head' <- Read 1;
|
||||
_ <- Write (head+1) head';
|
||||
_ <- Write 1 head;
|
||||
_ <- Unlock 1;
|
||||
|
||||
Return (Again tt)
|
||||
done.
|
||||
|
||||
Example stage3 :=
|
||||
for i := tt loop
|
||||
_ <- Lock 1;
|
||||
head <- Read 1;
|
||||
if head ==n 0 then
|
||||
_ <- Unlock 1;
|
||||
Return (Again tt)
|
||||
else
|
||||
tail <- Read (head+1);
|
||||
_ <- Write 1 tail;
|
||||
_ <- Unlock 1;
|
||||
data <- Read head;
|
||||
_ <- Free head 2;
|
||||
if isEven data then
|
||||
Return (Again tt)
|
||||
else
|
||||
Fail
|
||||
done.
|
||||
|
||||
Definition stages_inv root :=
|
||||
(exists ls p, root |-> p * linkedList p ls * [| forallb isEven ls = true |])%sep.
|
||||
|
||||
Theorem stages_ok :
|
||||
[stages_inv 0; stages_inv 1] ||- {{emp}} stage1 || stage2 || stage3 {{_ ~> emp}}.
|
||||
Proof.
|
||||
unfold stages_inv, stage1, stage2, stage3.
|
||||
fork (emp%sep) (emp%sep); ht.
|
||||
fork (emp%sep) (emp%sep); ht.
|
||||
|
||||
loop_inv (fun o => [| isEven (valueOf o) = true |]%sep).
|
||||
erewrite (linkedList_nonnull _ H0).
|
||||
cancel.
|
||||
simp.
|
||||
rewrite H1, H4.
|
||||
simp.
|
||||
simp.
|
||||
cancel.
|
||||
cancel.
|
||||
cancel.
|
||||
|
||||
loop_inv (fun _ : loop_outcome unit => emp%sep).
|
||||
simp.
|
||||
cases (r0 ==n 0).
|
||||
ht.
|
||||
cancel.
|
||||
setoid_rewrite (linkedList_nonnull _ n).
|
||||
ht.
|
||||
apply andb_true_iff in H.
|
||||
simp.
|
||||
erewrite (linkedList_nonnull _ H1).
|
||||
cancel.
|
||||
simp.
|
||||
apply andb_true_iff in H0.
|
||||
apply andb_true_iff.
|
||||
simp.
|
||||
cancel.
|
||||
cancel.
|
||||
cancel.
|
||||
|
||||
loop_inv (fun _ : loop_outcome unit => emp%sep).
|
||||
simp.
|
||||
cases (r0 ==n 0).
|
||||
ht.
|
||||
cancel.
|
||||
setoid_rewrite (linkedList_nonnull _ n).
|
||||
ht.
|
||||
apply andb_true_iff in H.
|
||||
simp.
|
||||
simp.
|
||||
cases (isEven r4); ht.
|
||||
cancel.
|
||||
cancel.
|
||||
simp.
|
||||
rewrite Heq in H2.
|
||||
simp.
|
||||
equality.
|
||||
cancel.
|
||||
cancel.
|
||||
cancel.
|
||||
|
||||
cancel.
|
||||
Qed.
|
||||
|
||||
|
||||
(** * Soundness proof *)
|
||||
|
||||
Hint Resolve himp_refl.
|
||||
|
|
Loading…
Reference in a new issue