Library zoo_std.queue_2

Require Import zoo.prelude.
Require Import zoo.base.
Require Import zoo_std.option.
Require Import zoo_std.chain.
Require Export zoo_std.queue_2__code.
Require Import zoo_std.queue_2__types.
Require Import zoo.options.

Implicit Type l : location.
Implicit Type t v front back : val.
Implicit Type vs : list val.

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

  Definition queue_2۰model t vs : iProp Σ :=
     l front back,
    t = #l
    l.[front] front
    l.[back] back
    chain۰model (Some §Node) front vs back
    chain۰model (Some §Node) back [()%V] ().
  #[local] Instance : CustomIpat "model" :=
    " ( %l & %front & %back & -> & Hl_front & Hl_back & Hfront & Hback ) ".

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

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

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

  Lemma queue_2٠pushspec t vs v :
    {{{
      queue_2۰model t vs
    }}}
      queue_2٠push t v
    {{{
      RET ();
      queue_2۰model t (vs ++ [v])
    }}}.

  Lemma queue_2٠popspec t vs :
    {{{
      queue_2۰model t vs
    }}}
      queue_2٠pop t
    {{{
      RET head vs;
      queue_2۰model t (tail vs)
    }}}.
End zoo۰G.

Require zoo_std.queue_2__opaque.

#[global] Opaque queue_2۰model.