Library zoo_std.queue_1
Require Import zoo.prelude.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.queue_1__code.
Require Import zoo_std.queue_1__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_1۰model t vs : iProp Σ :=
∃ l front back,
⌜t = #l⌝ ∗
l.[front] ↦ front ∗
l.[back] ↦ back ∗
chain۰model None front vs back ∗
chain۰model None back [()%V] ().
#[local] Instance : CustomIpat "model" :=
" ( %l & %front & %back & -> & Hl_front & Hl_back & Hfront & Hback ) ".
#[global] Instance queue_1۰modelーtimeless t vs :
Timeless (queue_1۰model t vs).
Lemma queue_1٠createーspec :
{{{
True
}}}
queue_1٠create ()
{{{
t
, RET t;
queue_1۰model t []
}}}.
Lemma queue_1٠is_emptyーspec t vs :
{{{
queue_1۰model t vs
}}}
queue_1٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
queue_1۰model t vs
}}}.
Lemma queue_1٠pushーspec t vs v :
{{{
queue_1۰model t vs
}}}
queue_1٠push t v
{{{
RET ();
queue_1۰model t (vs ++ [v])
}}}.
Lemma queue_1٠popーspec t vs :
{{{
queue_1۰model t vs
}}}
queue_1٠pop t
{{{
RET head vs;
queue_1۰model t (tail vs)
}}}.
End zoo۰G.
Require zoo_std.queue_1__opaque.
#[global] Opaque queue_1۰model.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.queue_1__code.
Require Import zoo_std.queue_1__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_1۰model t vs : iProp Σ :=
∃ l front back,
⌜t = #l⌝ ∗
l.[front] ↦ front ∗
l.[back] ↦ back ∗
chain۰model None front vs back ∗
chain۰model None back [()%V] ().
#[local] Instance : CustomIpat "model" :=
" ( %l & %front & %back & -> & Hl_front & Hl_back & Hfront & Hback ) ".
#[global] Instance queue_1۰modelーtimeless t vs :
Timeless (queue_1۰model t vs).
Lemma queue_1٠createーspec :
{{{
True
}}}
queue_1٠create ()
{{{
t
, RET t;
queue_1۰model t []
}}}.
Lemma queue_1٠is_emptyーspec t vs :
{{{
queue_1۰model t vs
}}}
queue_1٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
queue_1۰model t vs
}}}.
Lemma queue_1٠pushーspec t vs v :
{{{
queue_1۰model t vs
}}}
queue_1٠push t v
{{{
RET ();
queue_1۰model t (vs ++ [v])
}}}.
Lemma queue_1٠popーspec t vs :
{{{
queue_1۰model t vs
}}}
queue_1٠pop t
{{{
RET head vs;
queue_1۰model t (tail vs)
}}}.
End zoo۰G.
Require zoo_std.queue_1__opaque.
#[global] Opaque queue_1۰model.