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۰modelーtimeless t vs :
Timeless (deque۰model t vs).
Lemma deque۰modelーexclusive t vs1 vs2 :
deque۰model t vs1 -∗
deque۰model t vs2 -∗
False.
Lemma deque٠createーspec :
{{{
True
}}}
deque٠create ()
{{{
t
, RET t;
deque۰model t []
}}}.
Lemma deque٠is_emptyーspec t vs :
{{{
deque۰model t vs
}}}
deque٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
deque۰model t vs
}}}.
Lemma deque٠push_frontーspec t vs v :
{{{
deque۰model t vs
}}}
deque٠push_front t v
{{{
RET ();
deque۰model t (v :: vs)
}}}.
Lemma deque٠push_backーspec t vs v :
{{{
deque۰model t vs
}}}
deque٠push_back t v
{{{
RET ();
deque۰model t (vs ++ [v])
}}}.
Lemma deque٠pop_frontーspec t vs :
{{{
deque۰model t vs
}}}
deque٠pop_front t
{{{
RET head vs;
deque۰model t (tail vs)
}}}.
Lemma deque٠pop_backーspec 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٠iterーspec Ψ 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.
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۰modelーtimeless t vs :
Timeless (deque۰model t vs).
Lemma deque۰modelーexclusive t vs1 vs2 :
deque۰model t vs1 -∗
deque۰model t vs2 -∗
False.
Lemma deque٠createーspec :
{{{
True
}}}
deque٠create ()
{{{
t
, RET t;
deque۰model t []
}}}.
Lemma deque٠is_emptyーspec t vs :
{{{
deque۰model t vs
}}}
deque٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
deque۰model t vs
}}}.
Lemma deque٠push_frontーspec t vs v :
{{{
deque۰model t vs
}}}
deque٠push_front t v
{{{
RET ();
deque۰model t (v :: vs)
}}}.
Lemma deque٠push_backーspec t vs v :
{{{
deque۰model t vs
}}}
deque٠push_back t v
{{{
RET ();
deque۰model t (vs ++ [v])
}}}.
Lemma deque٠pop_frontーspec t vs :
{{{
deque۰model t vs
}}}
deque٠pop_front t
{{{
RET head vs;
deque۰model t (tail vs)
}}}.
Lemma deque٠pop_backーspec 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٠iterーspec Ψ 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.