Library zoo_std.bqueue
Require Import zoo.prelude.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.bqueue__code.
Require Import zoo_std.bqueue__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type l : location.
Implicit Type front back : nat.
Implicit Type v t : val.
Implicit Type o : option val.
Section zoo۰G.
Context `{zoo۰G : !ZooG Σ}.
Definition bqueue۰model t (cap : nat) vs : iProp Σ :=
∃ l data front back extra,
⌜t = #l⌝ ∗
l.[capacity] ↦□ #cap ∗
l.[data] ↦□ data ∗
l.[front] ↦ #front ∗
l.[back] ↦ #back ∗
array۰cslice data cap front (DfracOwn 1) vs ∗
array۰cslice data cap back (DfracOwn 1) (replicate extra ()%V) ∗
⌜back = (front + length vs)%nat⌝ ∗
⌜cap = (length vs + extra)%nat⌝.
#[local] Instance : CustomIpat "model" :=
" ( %l & %data & %front & %back & %extra & -> & Hl_capacity & Hl_data & Hl_front & Hl_back & Hvs & Hextra & % & % ) ".
#[global] Instance bqueue۰modelーtimeless t cap vs :
Timeless (bqueue۰model t cap vs).
Lemma bqueue۰modelーvalid t cap vs :
bqueue۰model t cap vs ⊢
⌜length vs ≤ cap⌝.
Lemma bqueue۰modelーexclusive t cap1 vs1 cap2 vs2 :
bqueue۰model t cap1 vs1 -∗
bqueue۰model t cap2 vs2 -∗
False.
Lemma bqueue٠createーspec cap :
(0 ≤ cap)%Z →
{{{
True
}}}
bqueue٠create #cap
{{{
t
, RET t;
bqueue۰model t ₊cap []
}}}.
Lemma bqueue٠sizeーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠size t
{{{
RET #(length vs);
bqueue۰model t cap vs
}}}.
Lemma bqueue٠is_emptyーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
bqueue۰model t cap vs
}}}.
Lemma bqueue٠unsafe_getーspec {t cap vs i} v :
(0 ≤ i)%Z →
vs !! ₊i = Some v →
{{{
bqueue۰model t cap vs
}}}
bqueue٠unsafe_get t #i
{{{
RET v;
bqueue۰model t cap vs
}}}.
Lemma bqueue٠unsafe_setーspec t cap vs i v :
(0 ≤ i < length vs)%Z →
{{{
bqueue۰model t cap vs
}}}
bqueue٠unsafe_set t #i v
{{{
RET ();
bqueue۰model t cap (<[₊i := v]> vs)
}}}.
Lemma bqueue٠pushーspec t cap vs v :
{{{
bqueue۰model t cap vs
}}}
bqueue٠push t v
{{{
b
, RET #b;
⌜if b then True else length vs = cap⌝ ∗
bqueue۰model t cap (if b then vs ++ [v] else vs)
}}}.
Lemma bqueue٠pop_frontーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠pop_front t
{{{
RET head vs;
bqueue۰model t cap (tail vs)
}}}.
Lemma bqueue٠pop_backーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠pop_back t
{{{
o
, RET o;
match o with
| None ⇒
⌜vs = []⌝ ∗
bqueue۰model t cap []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
bqueue۰model t cap vs'
end
}}}.
End zoo۰G.
Require zoo_std.bqueue__opaque.
#[global] Opaque bqueue۰model.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_std.bqueue__code.
Require Import zoo_std.bqueue__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type l : location.
Implicit Type front back : nat.
Implicit Type v t : val.
Implicit Type o : option val.
Section zoo۰G.
Context `{zoo۰G : !ZooG Σ}.
Definition bqueue۰model t (cap : nat) vs : iProp Σ :=
∃ l data front back extra,
⌜t = #l⌝ ∗
l.[capacity] ↦□ #cap ∗
l.[data] ↦□ data ∗
l.[front] ↦ #front ∗
l.[back] ↦ #back ∗
array۰cslice data cap front (DfracOwn 1) vs ∗
array۰cslice data cap back (DfracOwn 1) (replicate extra ()%V) ∗
⌜back = (front + length vs)%nat⌝ ∗
⌜cap = (length vs + extra)%nat⌝.
#[local] Instance : CustomIpat "model" :=
" ( %l & %data & %front & %back & %extra & -> & Hl_capacity & Hl_data & Hl_front & Hl_back & Hvs & Hextra & % & % ) ".
#[global] Instance bqueue۰modelーtimeless t cap vs :
Timeless (bqueue۰model t cap vs).
Lemma bqueue۰modelーvalid t cap vs :
bqueue۰model t cap vs ⊢
⌜length vs ≤ cap⌝.
Lemma bqueue۰modelーexclusive t cap1 vs1 cap2 vs2 :
bqueue۰model t cap1 vs1 -∗
bqueue۰model t cap2 vs2 -∗
False.
Lemma bqueue٠createーspec cap :
(0 ≤ cap)%Z →
{{{
True
}}}
bqueue٠create #cap
{{{
t
, RET t;
bqueue۰model t ₊cap []
}}}.
Lemma bqueue٠sizeーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠size t
{{{
RET #(length vs);
bqueue۰model t cap vs
}}}.
Lemma bqueue٠is_emptyーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠is_empty t
{{{
RET #(bool_decide (vs = []%list));
bqueue۰model t cap vs
}}}.
Lemma bqueue٠unsafe_getーspec {t cap vs i} v :
(0 ≤ i)%Z →
vs !! ₊i = Some v →
{{{
bqueue۰model t cap vs
}}}
bqueue٠unsafe_get t #i
{{{
RET v;
bqueue۰model t cap vs
}}}.
Lemma bqueue٠unsafe_setーspec t cap vs i v :
(0 ≤ i < length vs)%Z →
{{{
bqueue۰model t cap vs
}}}
bqueue٠unsafe_set t #i v
{{{
RET ();
bqueue۰model t cap (<[₊i := v]> vs)
}}}.
Lemma bqueue٠pushーspec t cap vs v :
{{{
bqueue۰model t cap vs
}}}
bqueue٠push t v
{{{
b
, RET #b;
⌜if b then True else length vs = cap⌝ ∗
bqueue۰model t cap (if b then vs ++ [v] else vs)
}}}.
Lemma bqueue٠pop_frontーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠pop_front t
{{{
RET head vs;
bqueue۰model t cap (tail vs)
}}}.
Lemma bqueue٠pop_backーspec t cap vs :
{{{
bqueue۰model t cap vs
}}}
bqueue٠pop_back t
{{{
o
, RET o;
match o with
| None ⇒
⌜vs = []⌝ ∗
bqueue۰model t cap []
| Some v ⇒
∃ vs',
⌜vs = vs' ++ [v]⌝ ∗
bqueue۰model t cap vs'
end
}}}.
End zoo۰G.
Require zoo_std.bqueue__opaque.
#[global] Opaque bqueue۰model.