Library zoo_persistent.pqueue
From zoo Require Import
prelude.
From zoo.common Require Import
list.
From zoo.language Require Import
notations.
From zoo.diaframe Require Import
diaframe.
From zoo_std Require Import
option
list.
From zoo_persistent Require Export
base
pqueue__code.
From zoo_persistent Require Import
pqueue__types.
From zoo Require Import
options.
Implicit Types v t : val.
Implicit Types 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.
From zoo_persistent Require
pqueue__opaque.
#[global] Opaque pqueue_model.
prelude.
From zoo.common Require Import
list.
From zoo.language Require Import
notations.
From zoo.diaframe Require Import
diaframe.
From zoo_std Require Import
option
list.
From zoo_persistent Require Export
base
pqueue__code.
From zoo_persistent Require Import
pqueue__types.
From zoo Require Import
options.
Implicit Types v t : val.
Implicit Types 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.
From zoo_persistent Require
pqueue__opaque.
#[global] Opaque pqueue_model.