From 405f577cd8c6927e5a05c6bce6f3636bac4259c8 Mon Sep 17 00:00:00 2001 From: Jonas Kastberg Hinrichsen <jkas@itu.dk> Date: Fri, 12 Apr 2019 11:38:29 +0200 Subject: [PATCH] Update to semantic let's --- theories/channel.v | 70 ++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/theories/channel.v b/theories/channel.v index 82114d3..9950245 100644 --- a/theories/channel.v +++ b/theories/channel.v @@ -33,20 +33,20 @@ Definition get_side c s := Definition send : val := λ: "c" "s" "v", - let lk := get_lock "c" in - acquire lk;; - let l := get_side "c" "s" in - l <- lsnoc !l "v";; - release lk. + let: "lk" := get_lock "c" in + acquire "lk";; + let: "l" := get_side "c" "s" in + "l" <- lsnoc !"l" "v";; + release "lk". Definition try_recv : val := λ: "c" "s", - let lk := get_lock "c" in - acquire lk;; - let l := (get_side "c" (dual_side "s")) in - match: !l with - SOME "p" => l <- Snd "p";; release lk;; SOME (Fst "p") - | NONE => release lk;; NONE + let: "lk" := get_lock "c" in + acquire "lk";; + let: "l" := (get_side "c" (dual_side "s")) in + match: !"l" with + SOME "p" => "l" <- Snd "p";; release "lk";; SOME (Fst "p") + | NONE => release "lk";; NONE end. Definition recv : val := @@ -142,7 +142,7 @@ Section channel. destruct Hside as [-> | ->]. - wp_pures. iDestruct "Hl" as (ll lhd ->) "(Hl & Hll)". wp_load. wp_apply (lsnoc_spec with "Hll"). - iIntros (hd') "Hll". wp_pures. + iIntros (hd' Hll). wp_pures. wp_bind (_ <- _)%E. iMod "HΦ" as (ls' rs') "[Hchan HΦ]". wp_store. iDestruct "Hchan" as (l' r' lk' [= <- <- <-]) "[Hls' Hrs']". @@ -151,12 +151,11 @@ Section channel. iMod ("HΦ" with "[Hls' Hrs']") as "HΦ". { rewrite /= /chan_frag. eauto with iFrame. } iModIntro. - wp_apply (release_spec with "[-HΦ $Hlock $Hlocked]"). + wp_apply (release_spec with "[-HΦ $Hlock $Hlocked]"); last eauto. { rewrite /is_list_ref. eauto 10 with iFrame. } - iIntros "_ //". - wp_pures. iDestruct "Hr" as (lr rhd ->) "(Hr & Hlr)". wp_load. wp_apply (lsnoc_spec with "Hlr"). - iIntros (hd') "Hlr". wp_pures. + iIntros (hd' Hlr). wp_pures. wp_bind (_ <- _)%E. iMod "HΦ" as (ls' rs') "[Hchan HΦ]". wp_store. iDestruct "Hchan" as (l' r' lk' [= <- <- <-]) "[Hls' Hrs']". @@ -165,41 +164,37 @@ Section channel. iMod ("HΦ" with "[Hls' Hrs']") as "HΦ". { rewrite /= /chan_frag. eauto with iFrame. } iModIntro. - wp_apply (release_spec with "[-HΦ $Hlock $Hlocked]"). + wp_apply (release_spec with "[-HΦ $Hlock $Hlocked]"); last eauto. { rewrite /is_list_ref. eauto 10 with iFrame. } - iIntros "_ //". Qed. - Definition try_recv_upd_fail γ c ls rs s : iProp Σ := + Definition try_recv_fail γ c ls rs s : iProp Σ := match s with | left => (chan_frag γ c ls rs ∧ ⌜rs = []âŒ)%I | right => (chan_frag γ c ls rs ∧ ⌜ls = []âŒ)%I | _ => ⌜FalseâŒ%I end. - Definition try_recv_upd_succ γ c ls rs s v : iProp Σ := + Definition try_recv_succ γ c ls rs s v : iProp Σ := match s with | left => (∃ rs', chan_frag γ c ls rs' ∧ ⌜rs = v::rs'âŒ)%I | right => (∃ ls', chan_frag γ c ls' rs ∧ ⌜ls = v::ls'âŒ)%I | _ => ⌜FalseâŒ%I end. - Definition try_recv_upd γ c ls rs s v : iProp Σ := + Definition try_recv_get γ c ls rs s v : iProp Σ := match v with - | NONEV => try_recv_upd_fail γ c ls rs s - | SOMEV w => try_recv_upd_succ γ c ls rs s w + | NONEV => try_recv_fail γ c ls rs s + | SOMEV w => try_recv_succ γ c ls rs s w | _ => ⌜FalseâŒ%I end. - Definition try_recv_vs E γ c s Φ := - (|={⊤,E}=> ∃ ls rs, - chan_frag γ c ls rs ∗ - (∀ v, try_recv_upd γ c ls rs s v ={E,⊤}=∗ Φ v))%I. - Lemma try_recv_spec Φ E γ (c s : val) : is_side s → chan_ctx γ c -∗ - try_recv_vs E γ c s Φ -∗ + (|={⊤,E}=> ∃ ls rs, + chan_frag γ c ls rs ∗ + (∀ v, try_recv_get γ c ls rs s v ={E,⊤}=∗ Φ v)) -∗ WP try_recv c s {{ Φ }}. Proof. iIntros (Hside) "Hc HΦ". wp_lam; wp_pures. @@ -219,7 +214,7 @@ Section channel. iDestruct (excl_eq with "Hrsa Hrsf") as %->. iSpecialize ("HΦ" $!(InjLV #())). iMod ("HΦ" with "[Hlsf Hrsf]") as "HΦ". - { rewrite /try_recv_upd /try_recv_upd_fail /chan_frag. + { rewrite /try_recv_get /try_recv_fail /chan_frag. eauto 10 with iFrame. } iModIntro. wp_apply (release_spec with "[-HΦ $Hlocked $Hlock]"). @@ -237,7 +232,7 @@ Section channel. iDestruct (excl_update _ _ _ (rs) with "Hrsa Hrsf") as ">[Hrsa Hrsf]". iSpecialize ("HΦ" $!(InjRV (v))). iMod ("HΦ" with "[Hlsf Hrsf]") as "HΦ". - { rewrite /try_recv_upd /try_recv_upd_succ /chan_frag. + { rewrite /try_recv_get /try_recv_succ /chan_frag. eauto 10 with iFrame. } iModIntro. wp_store. @@ -258,7 +253,7 @@ Section channel. iDestruct (excl_eq with "Hrsa Hrsf") as %->. iSpecialize ("HΦ" $!(InjLV #())). iMod ("HΦ" with "[Hlsf Hrsf]") as "HΦ". - { rewrite /try_recv_upd /try_recv_upd_fail /chan_frag. + { rewrite /try_recv_get /try_recv_fail /chan_frag. eauto 10 with iFrame. } iModIntro. wp_apply (release_spec with "[-HΦ $Hlocked $Hlock]"). @@ -276,7 +271,7 @@ Section channel. iDestruct (excl_update _ _ _ (ls) with "Hlsa Hlsf") as ">[Hlsa Hlsf]". iSpecialize ("HΦ" $!(InjRV (v))). iMod ("HΦ" with "[Hlsf Hrsf]") as "HΦ". - { rewrite /try_recv_upd /try_recv_upd_succ /chan_frag. + { rewrite /try_recv_get /try_recv_succ /chan_frag. eauto 10 with iFrame. } iModIntro. wp_store. @@ -287,16 +282,13 @@ Section channel. by iApply "HΦ". Qed. - Definition recv_vs E γ c s Φ := - (â–¡ (|={⊤,E}=> ∃ ls rs, - chan_frag γ c ls rs ∗ - ((try_recv_upd_fail γ c ls rs s ={E,⊤}=∗ True) ∗ - (∀ v, try_recv_upd_succ γ c ls rs s v ={E,⊤}=∗ Φ v))))%I. - Lemma recv_spec Φ E γ c s : is_side s → chan_ctx γ c -∗ - recv_vs E γ c s Φ -∗ + (â–¡ (|={⊤,E}=> ∃ ls rs, + chan_frag γ c ls rs ∗ + ((try_recv_fail γ c ls rs s ={E,⊤}=∗ True) ∗ + (∀ v, try_recv_succ γ c ls rs s v ={E,⊤}=∗ Φ v)))) -∗ WP recv c s {{ Φ }}. Proof. iIntros (Hside) "#Hc #HΦ". -- GitLab