Library zoo_persistent.pqueue
Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_persistent.pqueue__code.
Require Import zoo_persistent.pqueue__types.
Require Import zoo.options.
Implicit Type v t : val.
Implicit Type back front : list val.
Section zoo۰G.
Context `{zoo۰G : !ZooG Σ}.
Definition pqueue۰model t vs : iProp Σ :=
∃ front back,
⌜t = (list۰to_val front, list۰to_val back)%V ∧ vs = front ++ reverse back⌝.
#[global] Instance pqueue۰modelーtimeless t vs :
Timeless (pqueue۰model t vs).
#[global] Instance pqueue۰modelーpersistent t vs :
Persistent (pqueue۰model t vs).
Lemma pqueue۰modelーnil :
⊢ pqueue۰model pqueue٠empty [].
Lemma pqueue٠is_emptyーspec t vs :
{{{
pqueue۰model t vs
}}}
pqueue٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
True
}}}.
Lemma pqueue٠pushーspec t vs v :
{{{
pqueue۰model t vs
}}}
pqueue٠push t v
{{{
t'
, RET t';
pqueue۰model t' (vs ++ [v])
}}}.
Lemma pqueue٠popーspec t vs :
{{{
pqueue۰model t vs
}}}
pqueue٠pop t
{{{
o
, RET o;
match o with
| None ⇒
⌜vs = []⌝
| Some p ⇒
∃ v vs' t',
⌜vs = v :: vs'⌝ ∗
⌜p = (v, t')%V⌝ ∗
pqueue۰model t' vs'
end
}}}.
End zoo۰G.
Require zoo_persistent.pqueue__opaque.
#[global] Opaque pqueue۰model.
Require Import zoo.common.list.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_persistent.pqueue__code.
Require Import zoo_persistent.pqueue__types.
Require Import zoo.options.
Implicit Type v t : val.
Implicit Type back front : list val.
Section zoo۰G.
Context `{zoo۰G : !ZooG Σ}.
Definition pqueue۰model t vs : iProp Σ :=
∃ front back,
⌜t = (list۰to_val front, list۰to_val back)%V ∧ vs = front ++ reverse back⌝.
#[global] Instance pqueue۰modelーtimeless t vs :
Timeless (pqueue۰model t vs).
#[global] Instance pqueue۰modelーpersistent t vs :
Persistent (pqueue۰model t vs).
Lemma pqueue۰modelーnil :
⊢ pqueue۰model pqueue٠empty [].
Lemma pqueue٠is_emptyーspec t vs :
{{{
pqueue۰model t vs
}}}
pqueue٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
True
}}}.
Lemma pqueue٠pushーspec t vs v :
{{{
pqueue۰model t vs
}}}
pqueue٠push t v
{{{
t'
, RET t';
pqueue۰model t' (vs ++ [v])
}}}.
Lemma pqueue٠popーspec t vs :
{{{
pqueue۰model t vs
}}}
pqueue٠pop t
{{{
o
, RET o;
match o with
| None ⇒
⌜vs = []⌝
| Some p ⇒
∃ v vs' t',
⌜vs = v :: vs'⌝ ∗
⌜p = (v, t')%V⌝ ∗
pqueue۰model t' vs'
end
}}}.
End zoo۰G.
Require zoo_persistent.pqueue__opaque.
#[global] Opaque pqueue۰model.