Skip to content
Snippets Groups Projects
Commit 3b210fe7 authored by Ralf Jung's avatar Ralf Jung
Browse files

add lemmas for combining CAS and Resolve

parent d1d67a37
No related branches found
No related tags found
No related merge requests found
...@@ -8,34 +8,6 @@ Section tests. ...@@ -8,34 +8,6 @@ Section tests.
Implicit Types P Q : iProp Σ. Implicit Types P Q : iProp Σ.
Implicit Types Φ : val iProp Σ. Implicit Types Φ : val iProp Σ.
Definition CAS_resolve e1 e2 e3 p v :=
Resolve (CAS e1 e2 e3) p v.
Lemma wp_cas_suc_resolve s E (l : loc) (p : proph_id) (vs : list (val * val)) (v1 v2 v : val) :
vals_cas_compare_safe v1 v1
{{{ proph p vs l v1 }}}
CAS_resolve #l v1 v2 #p v @ s; E
{{{ RET v1 ; vs', vs = (v1, v)::vs' proph p vs' l v2 }}}.
Proof.
iIntros (Hcmp Φ) "[Hp Hl] HΦ".
wp_apply (wp_resolve with "Hp"); first done.
assert (val_is_unboxed v1) as Hv1; first by destruct Hcmp.
wp_cas_suc. iIntros (vs' ->) "Hp".
iApply "HΦ". eauto with iFrame.
Qed.
Lemma wp_cas_fail_resolve s E (l : loc) (p : proph_id) (vs : list (val * val)) (v' v1 v2 v : val) :
val_for_compare v' val_for_compare v1 vals_cas_compare_safe v' v1
{{{ proph p vs l v' }}}
CAS_resolve #l v1 v2 #p v @ s; E
{{{ RET v' ; vs', vs = (v', v)::vs' proph p vs' l v' }}}.
Proof.
iIntros (NEq Hcmp Φ) "[Hp Hl] HΦ".
wp_apply (wp_resolve with "Hp"); first done.
wp_cas_fail. iIntros (vs' ->) "Hp".
iApply "HΦ". eauto with iFrame.
Qed.
Lemma test_resolve1 E (l : loc) (n : Z) (p : proph_id) (vs : list (val * val)) (v : val) : Lemma test_resolve1 E (l : loc) (n : Z) (p : proph_id) (vs : list (val * val)) (v : val) :
l #n -∗ l #n -∗
proph p vs -∗ proph p vs -∗
......
...@@ -518,6 +518,7 @@ Proof. ...@@ -518,6 +518,7 @@ Proof.
iMod "HΦ". iModIntro. by iApply "HΦ". iMod "HΦ". iModIntro. by iApply "HΦ".
Qed. Qed.
(** Lemmas for some particular expression inside the [Resolve]. *)
Lemma wp_resolve_proph s E p pvs v : Lemma wp_resolve_proph s E p pvs v :
{{{ proph p pvs }}} {{{ proph p pvs }}}
ResolveProph (Val $ LitV $ LitProphecy p) (Val v) @ s; E ResolveProph (Val $ LitV $ LitProphecy p) (Val v) @ s; E
...@@ -528,6 +529,32 @@ Proof. ...@@ -528,6 +529,32 @@ Proof.
iIntros "!>" (vs') "HEq Hp". iApply "HΦ". iFrame. iIntros "!>" (vs') "HEq Hp". iApply "HΦ". iFrame.
Qed. Qed.
Lemma wp_resolve_cas_suc s E (l : loc) (p : proph_id) (pvs : list (val * val)) (v1 v2 v : val) :
vals_cas_compare_safe v1 v1
{{{ proph p pvs l v1 }}}
Resolve (CAS #l v1 v2) #p v @ s; E
{{{ RET v1 ; pvs', pvs = (v1, v)::pvs' proph p pvs' l v2 }}}.
Proof.
iIntros (Hcmp Φ) "[Hp Hl] HΦ".
iApply (wp_resolve with "Hp"); first done.
assert (val_is_unboxed v1) as Hv1; first by destruct Hcmp.
iApply (wp_cas_suc with "Hl"); [done..|]. iIntros "!> Hl".
iIntros (pvs' ->) "Hp". iApply "HΦ". eauto with iFrame.
Qed.
Lemma wp_resolve_cas_fail s E (l : loc) (p : proph_id) (pvs : list (val * val)) q (v' v1 v2 v : val) :
val_for_compare v' val_for_compare v1 vals_cas_compare_safe v' v1
{{{ proph p pvs l {q} v' }}}
Resolve (CAS #l v1 v2) #p v @ s; E
{{{ RET v' ; pvs', pvs = (v', v)::pvs' proph p pvs' l {q} v' }}}.
Proof.
iIntros (NEq Hcmp Φ) "[Hp Hl] HΦ".
iApply (wp_resolve with "Hp"); first done.
iApply (wp_cas_fail with "Hl"); [done..|]. iIntros "!> Hl".
iIntros (pvs' ->) "Hp". iApply "HΦ". eauto with iFrame.
Qed.
(** Array lemmas *)
Lemma wp_allocN_vec s E v n : Lemma wp_allocN_vec s E v n :
0 < n 0 < n
{{{ True }}} {{{ True }}}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment