From 30b963ae613b3c98ea45a147c091c751e8e0a231 Mon Sep 17 00:00:00 2001
From: Ralf Jung <jung@mpi-sws.org>
Date: Wed, 7 Mar 2018 09:24:07 +0100
Subject: [PATCH] update concurrent_stack4

---
 .../concurrent_stacks/concurrent_stack4.v     | 102 +++++++++++-------
 1 file changed, 64 insertions(+), 38 deletions(-)

diff --git a/theories/concurrent_stacks/concurrent_stack4.v b/theories/concurrent_stacks/concurrent_stack4.v
index b15a36d5..544aae0c 100644
--- a/theories/concurrent_stacks/concurrent_stack4.v
+++ b/theories/concurrent_stacks/concurrent_stack4.v
@@ -2,7 +2,7 @@ From iris.program_logic Require Export weakestpre hoare.
 From iris.heap_lang Require Export lang proofmode notation.
 From iris.algebra Require Import excl.
 
-(** Stack 4: With helping, (weak) view-shift spec. *)
+(** Stack 3: Helping, view-shift spec. *)
 
 Definition mk_offer : val :=
   λ: "v", ("v", ref #0).
@@ -67,7 +67,7 @@ Section side_channel.
   Implicit Types l : loc.
 
   Definition stages γ (P : list val → iProp Σ) (Q : iProp Σ) l (v : val):=
-    ((l ↦ #0 ∗ (∀ vs, P vs ==∗ P (v :: vs) ∗ Q))
+    ((l ↦ #0 ∗ (∀ vs, P vs ={⊤ ∖ ↑N}=∗ P (v :: vs) ∗ Q))
      ∨ (l ↦ #1 ∗ Q)
      ∨ (l ↦ #1 ∗ own γ (Excl ()))
      ∨ (l ↦ #2 ∗ own γ (Excl ())))%I.
@@ -79,7 +79,7 @@ Section side_channel.
     (∃ l, ⌜v = #l⌝ ∗ (l ↦ NONEV ∨ (∃ v' γ, l ↦ SOMEV v' ∗ is_offer γ P Q v')))%I.
 End side_channel.
 Section stack_works.
-  Context `{!heapG Σ} (N : namespace).
+  Context `{!heapG Σ}.
 
   Implicit Types l : loc.
 
@@ -141,29 +141,19 @@ Section stack_works.
       injection H; intros; subst; auto.
   Qed.
 
-  (* View-shift based hole-stack invariant (P). However:
-     - The resources for the successful and failing pop must be disjoint.
-       Instead, there should be a normal conjunction between them.
-     - The updating view shifts have the empty mask.
-     Open question: How does this relate to a logically atomic spec? *)
-  Theorem stack_works {channelG0 : channelG Σ} P Q Q' Q'' Φ :
+  (* Whole-stack invariant (P). *)
+  Theorem stack_works {channelG0 : channelG Σ} N P Q Q' Q'' Φ :
     (∀ (f₁ f₂ : val),
-        (□((∀ v vs, P (v :: vs) ==∗ Q v ∗ P vs) -∗
-            (P [] ==∗ Q' ∗ P []) -∗
+        (□(((∀ v vs, P (v :: vs) ={⊤ ∖ ↑ N}=∗ Q v ∗ P vs)
+            ∧ (P [] ={⊤ ∖ ↑ N}=∗ Q' ∗ P []) -∗
             WP f₁ #() {{ v, (∃ (v' : val), v ≡ SOMEV v' ∗ Q v') ∨ (v ≡ NONEV ∗ Q')}}))
-         -∗ (∀ (v : val),
-               □ ((∀ vs, P vs ==∗ P (v :: vs) ∗ Q'') -∗ WP f₂ v {{ v, Q'' }}))
+         ∧ (∀ (v : val),
+               □ ((∀ vs, P vs ={⊤ ∖ ↑ N}=∗ P (v :: vs) ∗ Q'') -∗ WP f₂ v {{ v, Q'' }})))
          -∗ Φ (f₁, f₂)%V)%I
     -∗ P []
     -∗ WP mk_stack #()  {{ Φ }}.
   Proof.
     iIntros "HΦ HP".
-    (* assert (exists n : namespace, hidden_eq n (nroot .@ "N")) as H *)
-    (*     by (exists (nroot .@ "N"); unfold hidden_eq; auto). *)
-    (* destruct H as (N, Neq). *)
-    (* assert (exists n : namespace, hidden_eq n (nroot .@ "N'")) as H *)
-    (*     by (exists (nroot .@ "N'"); unfold hidden_eq; auto). *)
-    (* destruct H as (N', N'eq). *)
     wp_let.
     wp_let.
     wp_alloc m as "Hm".
@@ -179,8 +169,8 @@ Section stack_works.
     iMod (inv_alloc (N .@ "stack_inv") _ (stack_inv P #l) with "[Hl HP]") as "#Istack".
     { iNext; iExists l, (InjLV #()), []; iSplit; iFrame; auto. }
     wp_let.
-    iApply "HΦ".
-    - iIntros "!# Hsucc Hfail".
+    iApply "HΦ"; iSplit.
+    - iIntros "!# Hcont".
       iLöb as "IH".
       wp_rec.
       wp_rec.
@@ -206,7 +196,10 @@ Section stack_works.
         + subst.
           iDestruct (is_stack_empty with "Hstack") as "%".
           subst.
-          iMod ("Hfail" with "HP") as "[HQ' HP]".
+          iDestruct "Hcont" as "[_ Hfail]".
+          iDestruct ("Hfail" with "HP") as "Hfail".
+          iDestruct (fupd_mask_mono with "Hfail") as "Hfail";
+          last iMod "Hfail" as "[HQ' HP]"; first by solve_ndisj.
           iMod ("Hclose" with "[Hl' Hstack HP]").
           { iExists l', (InjLV #()), []; iSplit; iFrame; auto. }
           iModIntro.
@@ -236,7 +229,10 @@ Section stack_works.
              iDestruct "H" as (ys') "%"; subst.
              iDestruct "Hstack" as (t') "[% Hstack]".
              injection H4; intros; subst.
-             iDestruct ("Hsucc" with "[HP]") as "> [HQ HP]"; auto.
+             iDestruct "Hcont" as "[Hsucc _]".
+             iDestruct ("Hsucc" with "HP") as "Hsucc".
+             iDestruct (fupd_mask_mono with "Hsucc") as "Hsucc";
+               last iMod "Hsucc" as "[HQ HP]"; first by solve_ndisj.
              iMod ("Hclose" with "[Hl'' Hstack HP]").
              { iExists l'', t', ys'; iSplit; iFrame; auto. }
              iModIntro.
@@ -248,7 +244,7 @@ Section stack_works.
              { iExists l'', v', ys; iSplit; iFrame; auto. }
              iModIntro.
              wp_if.
-             iApply ("IH" with "Hsucc Hfail").
+             iApply ("IH" with "Hcont").
       * iDestruct "H" as (v' γ') "[Hm' Hstages]".
         wp_load.
         iDestruct "Hstages" as (v'' l') "[% #Hstages]".
@@ -268,8 +264,15 @@ Section stack_works.
           iInv (N .@ "stack_inv") as "Hstack" "Hclose2".
           wp_cas_suc.
           iDestruct "Hstack" as (l'' v' xs) "[% [Hl'' [Hstack HP]]]".
-          iDestruct ("Hmove" with "HP") as "> [HP HQ'']".
-          iDestruct ("Hsucc" with "HP") as "> [HQ HP]".
+          iDestruct ("Hmove" with "HP") as "Hmove".
+          iDestruct (fupd_mask_mono with "Hmove") as "Hmove";
+            last iMod "Hmove" as "[HP HQ'']".
+          { apply ndisj_subseteq_difference; try solve_ndisj. }
+          iDestruct "Hcont" as "[Hsucc _]".
+          iDestruct ("Hsucc" with "HP") as "Hsucc".
+          iDestruct (fupd_mask_mono with "Hsucc") as "Hsucc";
+            last (iMod "Hsucc" as "[HQ HP]").
+          { apply ndisj_subseteq_difference; try solve_ndisj. }
           iMod ("Hclose2" with "[Hl'' Hstack HP]").
           { iExists l'', v', xs; iSplit; iFrame; auto. }
           iModIntro.
@@ -301,7 +304,11 @@ Section stack_works.
           ** subst.
              iDestruct (is_stack_empty with "Hstack") as "%".
              subst.
-             iMod ("Hfail" with "HP") as "[HQ' HP]".
+             iDestruct "Hcont" as "[_ Hfail]".
+             iDestruct ("Hfail" with "HP") as "Hfail".
+             iDestruct (fupd_mask_mono with "Hfail") as "Hfail";
+               last iMod "Hfail" as "[HQ' HP]"; first by solve_ndisj.
+
              iMod ("Hclose" with "[Hl' Hstack HP]").
              { iExists l'', (InjLV #()), []; iSplit; iFrame; auto. }
              iModIntro.
@@ -328,7 +335,10 @@ Section stack_works.
                 iDestruct (is_stack_cons with "Hstack") as "[Hstack H]".
                 iDestruct "H" as (ys') "%"; subst.
                 iDestruct "Hstack" as (t') "[% Hstack]"; simplify_eq.
-                iDestruct ("Hsucc" with "[HP]") as "> [HQ HP]"; auto.
+                iDestruct "Hcont" as "[Hsucc _]".
+                iDestruct ("Hsucc" with "HP") as "Hsucc".
+                iDestruct (fupd_mask_mono with "Hsucc") as "Hsucc";
+                  last iMod "Hsucc" as "[HQ HP]"; first by solve_ndisj.
                 iMod ("Hclose" with "[Hl''' Hstack HP]").
                 { iExists l''', t', ys'; iSplit; iFrame; auto. }
                 iModIntro.
@@ -340,7 +350,7 @@ Section stack_works.
                 { iExists l''', v''', ys; iSplit; iFrame; auto. }
                 iModIntro.
                 wp_if.
-                iApply ("IH" with "Hsucc Hfail").
+                iApply ("IH" with "Hcont").
         + iDestruct "H" as "[Hl' Hγ']".
           wp_cas_fail.
           iMod ("Hclose" with "[Hl' Hγ']").
@@ -357,7 +367,10 @@ Section stack_works.
           ** subst.
              iDestruct (is_stack_empty with "Hstack") as "%".
              subst.
-             iMod ("Hfail" with "HP") as "[HQ' HP]".
+             iDestruct "Hcont" as "[_ Hfail]".
+             iDestruct ("Hfail" with "HP") as "Hfail".
+             iDestruct (fupd_mask_mono with "Hfail") as "Hfail";
+               last iMod "Hfail" as "[HQ HP]"; first by solve_ndisj.
              iMod ("Hclose" with "[Hl' Hstack HP]").
              { iExists l'', (InjLV #()), []; iSplit; iFrame; auto. }
              iModIntro.
@@ -384,7 +397,10 @@ Section stack_works.
                 iDestruct (is_stack_cons with "Hstack") as "[Hstack H]".
                 iDestruct "H" as (ys') "%"; subst.
                 iDestruct "Hstack" as (t') "[% Hstack]"; simplify_eq.
-                iDestruct ("Hsucc" with "[HP]") as "> [HQ HP]"; auto.
+                iDestruct "Hcont" as "[Hsucc _]".
+                iDestruct ("Hsucc" with "HP") as "Hsucc".
+                iDestruct (fupd_mask_mono with "Hsucc") as "Hsucc";
+                  last iMod "Hsucc" as "[HQ HP]"; first by solve_ndisj.
                 iMod ("Hclose" with "[Hl''' Hstack HP]").
                 { iExists l''', t', ys'; iSplit; iFrame; auto. }
                 iModIntro.
@@ -396,7 +412,7 @@ Section stack_works.
                 { iExists l''', v''', ys; iSplit; iFrame; auto. }
                 iModIntro.
                 wp_if.
-                iApply ("IH" with "Hsucc Hfail").
+                iApply ("IH" with "Hcont").
 
         + iDestruct "H" as "[Hl' Hγ']".
           wp_cas_fail.
@@ -414,7 +430,10 @@ Section stack_works.
           ** subst.
              iDestruct (is_stack_empty with "Hstack") as "%".
              subst.
-             iMod ("Hfail" with "HP") as "[HQ' HP]".
+             iDestruct "Hcont" as "[_ Hfail]".
+             iDestruct ("Hfail" with "HP") as "Hfail".
+             iDestruct (fupd_mask_mono with "Hfail") as "Hfail";
+               last iMod "Hfail" as "[HQ HP]"; first by solve_ndisj.
              iMod ("Hclose" with "[Hl' Hstack HP]").
              { iExists l'', (InjLV #()), []; iSplit; iFrame; auto. }
              iModIntro.
@@ -441,7 +460,10 @@ Section stack_works.
                 iDestruct (is_stack_cons with "Hstack") as "[Hstack H]".
                 iDestruct "H" as (ys') "%"; subst.
                 iDestruct "Hstack" as (t') "[% Hstack]"; simplify_eq.
-                iDestruct ("Hsucc" with "[HP]") as "> [HQ HP]"; auto.
+                iDestruct "Hcont" as "[Hsucc _]".
+                iDestruct ("Hsucc" with "HP") as "Hsucc".
+                iDestruct (fupd_mask_mono with "Hsucc") as "Hsucc";
+                  last iMod "Hsucc" as "[HQ HP]"; first by solve_ndisj.
                 iMod ("Hclose" with "[Hl''' Hstack HP]").
                 { iExists l''', t', ys'; iSplit; iFrame; auto. }
                 iModIntro.
@@ -453,7 +475,7 @@ Section stack_works.
                 { iExists l''', v''', ys; iSplit; iFrame; auto. }
                 iModIntro.
                 wp_if.
-                iApply ("IH" with "Hsucc Hfail").
+                iApply ("IH" with "Hcont").
     - iIntros (v) "!# Hpush".
       iLöb as "IH".
       wp_rec.
@@ -465,7 +487,7 @@ Section stack_works.
       iInv (N .@ "mailbox_inv") as "Hmail" "Hclose".
       iDestruct "Hmail" as (m') "[>% Hmail]"; simplify_eq.
       iMod (own_alloc (Excl ())) as (γ) "Hγ". done.
-      iMod (inv_alloc (N .@ "offer_inv") _ (stages γ P Q'' s v) with "[Hs Hpush]") as "#Istages".
+      iMod (inv_alloc (N .@ "offer_inv") _ (stages N γ P Q'' s v) with "[Hs Hpush]") as "#Istages".
       { iLeft; iFrame; auto. }
       iDestruct "Hmail" as "[H | H]".
       * wp_store.
@@ -502,7 +524,9 @@ Section stack_works.
           iDestruct "Hstack" as (l'' v'' xs) "[>% [Hl'' [Hstack HP]]]"; simplify_eq.
           destruct (decide (v' = v''%V)).
           ++ wp_cas_suc.
-             iDestruct ("Hpush" with "[HP]") as "> [HP HQ]"; auto.
+             iDestruct ("Hpush" with "HP") as "Hpush".
+             iDestruct (fupd_mask_mono with "Hpush") as "Hpush";
+               last iMod "Hpush" as "[HP HQ]"; first by solve_ndisj.
              iMod ("Hclose" with "[Hl'' Hstack HP]").
              { iExists l'', (InjRV (v, v')), (v :: xs); iSplit; iFrame; auto.
                iExists v'; iSplit; subst; auto. }
@@ -564,7 +588,9 @@ Section stack_works.
         iDestruct "Hstack" as (l'' v''' xs) "[>% [Hl'' [Hstack HP]]]"; simplify_eq.
         destruct (decide (v'' = v'''%V)).
         ++ wp_cas_suc.
-           iDestruct ("Hpush" with "[HP]") as "> [HP HQ]"; auto.
+           iDestruct ("Hpush" with "HP") as "Hpush".
+           iDestruct (fupd_mask_mono with "Hpush") as "Hpush";
+             last iMod "Hpush" as "[HP HQ]"; first by solve_ndisj.
            iMod ("Hclose" with "[Hl'' Hstack HP]").
            { iExists l'', (InjRV (v, v'')), (v :: xs); iSplit; iFrame; auto.
              iExists v''; iSplit; subst; auto. }
-- 
GitLab