Library zoo.program_logic.bwp_adequacy

Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.iris.bi.big_op.
Require Import zoo.iris.diaframe.
Require Export zoo.program_logic.bwp.
Require Import zoo.options.

Implicit Type e : expr.
Implicit Type es : list expr.

Section zoo۰G.
  Context `{zoo۰G : !ZooG Σ}.

  Implicit Type Φ : val iProp Σ.
  Implicit Type Φs : list (val iProp Σ).

  Definition bwps nt es Φs : iProp Σ :=
    [∗ list] i e; Φ es; Φs,
      BWP e nt + i {{ Φ }}.

  #[local] Lemma bwpstep tid e1 σ1 e2 σ2 κ κs es ns nt Φ :
    prim_step tid e1 σ1 κ e2 σ2 es
    state_interp ns nt σ1 (κ ++ κs) -∗
    £ (later۰function ns) -∗
    BWP e1 tid {{ Φ }} -∗
      |={}[]▷=>
      state_interp ˖ns (nt + length es) σ2 κs
      BWP e2 tid {{ Φ }}
      bwps nt es (replicate (length es) fork_post).
  #[local] Lemma bwpsstep es1 σ1 es2 σ2 κ κs ns Φs :
    step (es1, σ1) κ (es2, σ2)
    state_interp ns (length es1) σ1 (κ ++ κs) -∗
    £ (later۰function ns) -∗
    bwps 0 es1 Φs -∗
      |={}[]▷=>
      state_interp ˖ns (length es2) σ2 κs
      bwps 0 es2 (Φs ++ replicate (length es2 - length es1) fork_post).
  #[local] Lemma bwpssteps n es1 σ1 es2 σ2 κs1 κs2 ns Φs :
    nsteps n (es1, σ1) κs1 (es2, σ2)
    state_interp ns (length es1) σ1 (κs1 ++ κs2) -∗
    £ (later۰sum ns n) -∗
    bwps 0 es1 Φs -∗
      |={,}=> |={}▷=>^n |={,}=>
      state_interp (ns + n) (length es2) σ2 κs2
      bwps 0 es2 (Φs ++ replicate (length es2 - length es1) fork_post).

  #[local] Lemma bwpnotstuck e tid ns nt σ κs Φ :
    state_interp ns nt σ κs -∗
    BWP e tid {{ Φ }} -∗
      |={, }=>
      not_stuck tid e σ.

  #[local] Lemma bwpsprogress n es1 σ1 tid e2 es2 σ2 κs1 κs2 ns Φs :
    nsteps n (es1, σ1) κs1 (es2, σ2)
    es2 !! tid = Some e2
    state_interp ns (length es1) σ1 (κs1 ++ κs2) -∗
    £ (later۰sum ns n) -∗
    bwps 0 es1 Φs -∗
      |={, }=> |={}▷=>^n |={}=>
      not_stuck tid e2 σ2.
End zoo۰G.

Lemma bwpprogress `{inv_Gpre : !invGpreS Σ} n es1 σ1 es2 σ2 κs :
  ( `{inv۰G : !invGS Σ},
     |={}=>
       (zoo۰G : ZooG Σ) Φs,
      zoo۰G.(zoo۰G۰inv۰G) = inv۰G
      state_interp 0 (length es1) σ1 κs
      bwps 0 es1 Φs
  )
  nsteps n (es1, σ1) κs (es2, σ2)
  Foralli (λ tid e2, not_stuck tid e2 σ2) es2.

Lemma bwpadequacy' `{inv_Gpre : !invGpreS Σ} e σ :
  ( `{inv۰G : !invGS Σ} κs,
     |={}=>
       (zoo۰G : ZooG Σ) Φ,
      zoo۰G.(zoo۰G۰inv۰G) = inv۰G
      state_interp 0 1 σ κs
      BWP e 0 {{ Φ }}
  )
  safe ([e], σ).
Lemma bwpadequacy `{zoo۰Gpre : !ZooGpre Σ} {e σ} v :
  state۰wf σ v
  ( `{zoo۰G : !ZooG Σ},
     Φ,
      ([∗ map] l v state۰heap۰initial σ, l v) -∗
      0 ↦ₗ v -∗
      BWP e 0 {{ Φ }}
  )
  safe ([e], σ).