Library zoo_std.bqueue

Require Import zoo.prelude.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.bqueue__code.
Require Import zoo_std.bqueue__types.
Require Import zoo.options.

Implicit Type b : bool.
Implicit Type l : location.
Implicit Type front back : nat.
Implicit Type v t : val.
Implicit Type o : option val.

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

  Definition bqueue۰model t (cap : nat) vs : iProp Σ :=
     l data front back extra,
    t = #l
    l.[capacity] #cap
    l.[data] data
    l.[front] #front
    l.[back] #back
    array۰cslice data cap front (DfracOwn 1) vs
    array۰cslice data cap back (DfracOwn 1) (replicate extra ()%V)
    back = (front + length vs)%nat
    cap = (length vs + extra)%nat.
  #[local] Instance : CustomIpat "model" :=
    " ( %l & %data & %front & %back & %extra & -> & Hl_capacity & Hl_data & Hl_front & Hl_back & Hvs & Hextra & % & % ) ".

  #[global] Instance bqueue۰modeltimeless t cap vs :
    Timeless (bqueue۰model t cap vs).

  Lemma bqueue۰modelvalid t cap vs :
    bqueue۰model t cap vs
    length vs cap.
  Lemma bqueue۰modelexclusive t cap1 vs1 cap2 vs2 :
    bqueue۰model t cap1 vs1 -∗
    bqueue۰model t cap2 vs2 -∗
    False.

  Lemma bqueue٠createspec cap :
    (0 cap)%Z
    {{{
      True
    }}}
      bqueue٠create #cap
    {{{
      t
    , RET t;
      bqueue۰model t cap []
    }}}.

  Lemma bqueue٠sizespec t cap vs :
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠size t
    {{{
      RET #(length vs);
      bqueue۰model t cap vs
    }}}.

  Lemma bqueue٠is_emptyspec t cap vs :
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠is_empty t
    {{{
      RET #(bool_decide (vs = []%list));
      bqueue۰model t cap vs
    }}}.

  Lemma bqueue٠unsafe_getspec {t cap vs i} v :
    (0 i)%Z
    vs !! i = Some v
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠unsafe_get t #i
    {{{
      RET v;
      bqueue۰model t cap vs
    }}}.

  Lemma bqueue٠unsafe_setspec t cap vs i v :
    (0 i < length vs)%Z
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠unsafe_set t #i v
    {{{
      RET ();
      bqueue۰model t cap (<[i := v]> vs)
    }}}.

  Lemma bqueue٠pushspec t cap vs v :
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠push t v
    {{{
      b
    , RET #b;
      if b then True else length vs = cap
      bqueue۰model t cap (if b then vs ++ [v] else vs)
    }}}.

  Lemma bqueue٠pop_frontspec t cap vs :
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠pop_front t
    {{{
      RET head vs;
      bqueue۰model t cap (tail vs)
    }}}.

  Lemma bqueue٠pop_backspec t cap vs :
    {{{
      bqueue۰model t cap vs
    }}}
      bqueue٠pop_back t
    {{{
      o
    , RET o;
      match o with
      | None
          vs = []
          bqueue۰model t cap []
      | Some v
           vs',
          vs = vs' ++ [v]
          bqueue۰model t cap vs'
      end
    }}}.
End zoo۰G.

Require zoo_std.bqueue__opaque.

#[global] Opaque bqueue۰model.