Library zoo_std.deque

Require Import zoo.prelude.
Require Import zoo.iris.bi.big_op.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.deque__code.
Require Import zoo_std.deque__types.
Require Import zoo.options.

Implicit Type fn : val.

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

  Definition deque۰model t vs : iProp Σ :=
     nodes,
    xdeque۰model t nodes
    [∗ list] node; v nodes; vs, node.[xdeque٠data] v.

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

  Lemma deque۰modelexclusive t vs1 vs2 :
    deque۰model t vs1 -∗
    deque۰model t vs2 -∗
    False.

  Lemma deque٠createspec :
    {{{
      True
    }}}
      deque٠create ()
    {{{
      t
    , RET t;
      deque۰model t []
    }}}.

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

  Lemma deque٠push_frontspec t vs v :
    {{{
      deque۰model t vs
    }}}
      deque٠push_front t v
    {{{
      RET ();
      deque۰model t (v :: vs)
    }}}.

  Lemma deque٠push_backspec t vs v :
    {{{
      deque۰model t vs
    }}}
      deque٠push_back t v
    {{{
      RET ();
      deque۰model t (vs ++ [v])
    }}}.

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

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

  Lemma deque٠iterspec Ψ fn t vs :
    {{{
       Ψ []
      deque۰model t vs
       (
         vs_done v vs_todo,
        vs = vs_done ++ v :: vs_todo -∗
        Ψ vs_done -∗
        WP fn v {{ res,
          res = ()%V
           Ψ (vs_done ++ [v])
        }}
      )
    }}}
      deque٠iter fn t
    {{{
      RET ();
      deque۰model t vs
      Ψ vs
    }}}.
End zoo۰G.

Require zoo_std.deque__opaque.

#[global] Opaque deque۰model.