diff --git a/theories/heap_lang/lib/increment.v b/theories/heap_lang/lib/increment.v index f1d5e98ff44ca401f492ca5a5e7b93cbd0467009..77ff95e303d2381b2fdb5d200afd58e8cb5e89e1 100644 --- a/theories/heap_lang/lib/increment.v +++ b/theories/heap_lang/lib/increment.v @@ -2,12 +2,12 @@ From iris.base_logic.lib Require Export invariants. From iris.program_logic Require Export atomic. From iris.proofmode Require Import tactics. From iris.heap_lang Require Import proofmode notation atomic_heap par. +From iris.bi.lib Require Import fractional. Set Default Proof Using "Type". (** Show that implementing fetch-and-add on top of CAS preserves logical atomicity. *) -(* TODO: Move this to iris-examples once gen_proofmode is merged. *) Section increment. Context `{!heapG Σ} {aheap: atomic_heap Σ}. @@ -25,7 +25,7 @@ Section increment. Proof. iIntros (Q Φ) "HQ AU". iLöb as "IH". wp_let. wp_apply (load_spec with "[HQ]"); first by iAccu. - (* Prove the atomic shift for load *) + (* Prove the atomic update for load *) iAuIntro. iApply (aacc_aupd_abort with "AU"); first done. iIntros (x) "H↦". (* FIXME: Oh wow this is bad. *) @@ -35,7 +35,7 @@ Section increment. (* Now go on *) wp_let. wp_op. wp_bind (CAS _ _ _)%I. wp_apply (cas_spec with "[HQ]"); [done|iAccu|]. - (* Prove the atomic shift for CAS *) + (* Prove the atomic update for CAS *) iAuIntro. iApply (aacc_aupd with "AU"); first done. iIntros (x') "H↦". (* FIXME: Oh wow this is bad. *) @@ -51,6 +51,36 @@ Section increment. wp_if. iApply ("IH" with "HQ"). done. Qed. + Definition weak_incr: val := + rec: "weak_incr" "l" := + let: "oldv" := !"l" in + "l" <- ("oldv" + #1);; + "oldv" (* return old value *). + + (* TODO: Generalize to q and 1-q, based on some theory for a "maybe-mapsto" + connective that works on [option Qp] (the type of 1-q). *) + Lemma weak_incr_spec (l: loc) (v : Z) : + l ↦{1/2} #v -∗ + <<< ∀ (v' : Z), l ↦{1/2} #v' >>> + weak_incr #l @ ⊤ + <<< ⌜v = v'⌠∗ l ↦ #(v + 1), RET #v >>>. + Proof. + iIntros "Hl" (Q Φ) "HQ AU". wp_let. + wp_apply (atomic_wp_seq $! (load_spec _) with "Hl"). + iIntros "Hl". wp_let. wp_op. + wp_apply (store_spec with "[HQ]"); first by iAccu. + (* Prove the atomic update for store *) + iAuIntro. iApply (aacc_aupd_commit with "AU"); first done. + iIntros (x) "H↦". + iDestruct (mapsto_agree with "Hl H↦") as %[= <-]. + iCombine "Hl" "H↦" as "Hl". + (* FIXME: Oh wow this is bad. *) + iApply (aacc_intro $! ([tele_arg _] : [tele (_:val)]) with "[Hl]"); [solve_ndisj|done|simpl; iSplit]. + { simpl. iIntros "[$ $] !> $ !> //". } + iIntros "$ !>". iSplit; first done. + iIntros "HΦ !> HQ". wp_seq. iApply "HΦ". done. + Qed. + End increment. Section increment_client.