Library zoo_saturn.queue_mpsc_2
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Import zoo.common.list.
Require Import zoo.iris.base_logic.lib.twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_saturn.queue_mpsc_2__code.
Require Import zoo_saturn.queue_mpsc_2__types.
Require Import zoo.options.
Implicit Type l : location.
Implicit Type v t : val.
Implicit Type vs front back : list val.
Implicit Type o : option val.
Class QueueMpsc2G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] queue_mpsc_2۰G۰twins۰G :: TwinsG Σ (leibnizO (list val))
}.
Definition queue_mpsc_2۰Σ :=
#[twins۰Σ (leibnizO (list val))
].
#[global] Instance subGーqueue_mpsc_2۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG queue_mpsc_2۰Σ Σ →
QueueMpsc2G Σ.
Section queue_mpsc_2۰G.
Context `{queue_mpsc_2۰G : QueueMpsc2G Σ}.
Record metadata :=
{ metadata۰model : gname
; metadata۰front : gname
}.
Implicit Type γ : metadata.
#[local] Instance metadataーeq_dec : EqDecision metadata :=
ltac:(solve_decision).
#[local] Instance metadataーcountable :
Countable metadata.
#[local] Definition model₁' γ_model vs :=
twins۰twin₁ γ_model (DfracOwn 1) vs.
#[local] Definition model₁ γ vs :=
model₁' γ.(metadata۰model) vs.
#[local] Definition model₂' γ_model vs :=
twins۰twin₂ γ_model vs.
#[local] Definition model₂ γ vs :=
model₂' γ.(metadata۰model) vs.
#[local] Definition front₁' γ_front front :=
twins۰twin₁ γ_front (DfracOwn 1) front.
#[local] Definition front₁ γ front :=
front₁' γ.(metadata۰front) front.
#[local] Definition front₂' γ_model front :=
twins۰twin₂ γ_model front.
#[local] Definition front₂ γ front :=
front₂' γ.(metadata۰front) front.
#[local] Definition inv۰inner l γ : iProp Σ :=
∃ front back,
front₂ γ front ∗
l.[back] ↦ glist۰to_val back ∗
model₂ γ (front ++ reverse back).
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %front{} & %back{} & >Hfront₂ & >Hl_back & >Hmodel₂ ) ".
Definition queue_mpsc_2۰inv t ι : iProp Σ :=
∃ l γ,
⌜t = #l⌝ ∗
l ↪ γ ∗
inv ι (inv۰inner l γ).
#[local] Instance : CustomIpat "inv" :=
" ( %l & %γ & -> & #Hmeta & #Hinv ) ".
Definition queue_mpsc_2۰model t vs : iProp Σ :=
∃ l γ,
⌜t = #l⌝ ∗
l ↪ γ ∗
model₁ γ vs.
#[local] Instance : CustomIpat "model" :=
" ( %l{;_} & %γ{;_} & %Heq{} & Hmeta_{} & Hmodel₁{_{}} ) ".
Definition queue_mpsc_2۰consumer t : iProp Σ :=
∃ l γ front,
⌜t = #l⌝ ∗
l ↪ γ ∗
l.[front] ↦ glist۰to_val front ∗
front₁ γ front.
#[local] Instance : CustomIpat "consumer" :=
" ( %l_ & %γ_ & %front & %Heq & Hmeta_ & Hl_front & Hfront₁ ) ".
#[global] Instance queue_mpsc_2۰modelーtimeless t vs :
Timeless (queue_mpsc_2۰model t vs).
#[global] Instance queue_mpsc_2۰consumerーtimeless t :
Timeless (queue_mpsc_2۰consumer t ).
#[global] Instance queue_mpsc_2۰invーpersistent t ι :
Persistent (queue_mpsc_2۰inv t ι).
#[local] Lemma modelーalloc :
⊢ |==>
∃ γ_model,
model₁' γ_model [] ∗
model₂' γ_model [].
#[local] Lemma model₁ーexclusive γ vs1 vs2 :
model₁ γ vs1 -∗
model₁ γ vs2 -∗
False.
#[local] Lemma modelーagree γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーupdate {γ vs1 vs2} vs :
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
model₁ γ vs ∗
model₂ γ vs.
#[local] Lemma frontーalloc :
⊢ |==>
∃ γ_front,
front₁' γ_front [] ∗
front₂' γ_front [].
#[local] Lemma frontーagree γ front1 front2 :
front₁ γ front1 -∗
front₂ γ front2 -∗
⌜front1 = front2⌝.
#[local] Lemma frontーupdate {γ front1 front2} front :
front₁ γ front1 -∗
front₂ γ front2 ==∗
front₁ γ front ∗
front₂ γ front.
Lemma queue_mpsc_2۰modelーexclusive t vs1 vs2 :
queue_mpsc_2۰model t vs1 -∗
queue_mpsc_2۰model t vs2 -∗
False.
Lemma queue_mpsc_2۰consumerーexclusive t :
queue_mpsc_2۰consumer t -∗
queue_mpsc_2۰consumer t -∗
False.
Lemma queue_mpsc_2٠createーspec ι :
{{{
True
}}}
queue_mpsc_2٠create ()
{{{
t
, RET t;
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰model t [] ∗
queue_mpsc_2۰consumer t
}}}.
Lemma queue_mpsc_2٠is_emptyーspec t ι :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠is_empty t @ ↑ι
<<<
queue_mpsc_2۰model t vs
| RET #(bool_decide (vs = []%list));
queue_mpsc_2۰consumer t
>>>.
Lemma queue_mpsc_2٠push_frontーspec t ι v :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠push_front t v @ ↑ι
<<<
queue_mpsc_2۰model t (v :: vs)
| RET ();
queue_mpsc_2۰consumer t
>>>.
Lemma queue_mpsc_2٠push_backーspec t ι v :
<<<
queue_mpsc_2۰inv t ι
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠push_back t v @ ↑ι
<<<
queue_mpsc_2۰model t (vs ++ [v])
| RET ();
True
>>>.
Lemma queue_mpsc_2٠popーspec t ι :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠pop t @ ↑ι
<<<
queue_mpsc_2۰model t (tail vs)
| RET head vs;
queue_mpsc_2۰consumer t
>>>.
End queue_mpsc_2۰G.
Require zoo_saturn.queue_mpsc_2__opaque.
#[global] Opaque queue_mpsc_2۰inv.
#[global] Opaque queue_mpsc_2۰model.
#[global] Opaque queue_mpsc_2۰consumer.
Require Import zoo.common.countable.
Require Import zoo.common.list.
Require Import zoo.iris.base_logic.lib.twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_saturn.queue_mpsc_2__code.
Require Import zoo_saturn.queue_mpsc_2__types.
Require Import zoo.options.
Implicit Type l : location.
Implicit Type v t : val.
Implicit Type vs front back : list val.
Implicit Type o : option val.
Class QueueMpsc2G Σ `{zoo۰G : !ZooG Σ} :=
{ #[local] queue_mpsc_2۰G۰twins۰G :: TwinsG Σ (leibnizO (list val))
}.
Definition queue_mpsc_2۰Σ :=
#[twins۰Σ (leibnizO (list val))
].
#[global] Instance subGーqueue_mpsc_2۰Σ Σ `{zoo۰G : !ZooG Σ} :
subG queue_mpsc_2۰Σ Σ →
QueueMpsc2G Σ.
Section queue_mpsc_2۰G.
Context `{queue_mpsc_2۰G : QueueMpsc2G Σ}.
Record metadata :=
{ metadata۰model : gname
; metadata۰front : gname
}.
Implicit Type γ : metadata.
#[local] Instance metadataーeq_dec : EqDecision metadata :=
ltac:(solve_decision).
#[local] Instance metadataーcountable :
Countable metadata.
#[local] Definition model₁' γ_model vs :=
twins۰twin₁ γ_model (DfracOwn 1) vs.
#[local] Definition model₁ γ vs :=
model₁' γ.(metadata۰model) vs.
#[local] Definition model₂' γ_model vs :=
twins۰twin₂ γ_model vs.
#[local] Definition model₂ γ vs :=
model₂' γ.(metadata۰model) vs.
#[local] Definition front₁' γ_front front :=
twins۰twin₁ γ_front (DfracOwn 1) front.
#[local] Definition front₁ γ front :=
front₁' γ.(metadata۰front) front.
#[local] Definition front₂' γ_model front :=
twins۰twin₂ γ_model front.
#[local] Definition front₂ γ front :=
front₂' γ.(metadata۰front) front.
#[local] Definition inv۰inner l γ : iProp Σ :=
∃ front back,
front₂ γ front ∗
l.[back] ↦ glist۰to_val back ∗
model₂ γ (front ++ reverse back).
#[local] Instance : CustomIpat "inv۰inner" :=
" ( %front{} & %back{} & >Hfront₂ & >Hl_back & >Hmodel₂ ) ".
Definition queue_mpsc_2۰inv t ι : iProp Σ :=
∃ l γ,
⌜t = #l⌝ ∗
l ↪ γ ∗
inv ι (inv۰inner l γ).
#[local] Instance : CustomIpat "inv" :=
" ( %l & %γ & -> & #Hmeta & #Hinv ) ".
Definition queue_mpsc_2۰model t vs : iProp Σ :=
∃ l γ,
⌜t = #l⌝ ∗
l ↪ γ ∗
model₁ γ vs.
#[local] Instance : CustomIpat "model" :=
" ( %l{;_} & %γ{;_} & %Heq{} & Hmeta_{} & Hmodel₁{_{}} ) ".
Definition queue_mpsc_2۰consumer t : iProp Σ :=
∃ l γ front,
⌜t = #l⌝ ∗
l ↪ γ ∗
l.[front] ↦ glist۰to_val front ∗
front₁ γ front.
#[local] Instance : CustomIpat "consumer" :=
" ( %l_ & %γ_ & %front & %Heq & Hmeta_ & Hl_front & Hfront₁ ) ".
#[global] Instance queue_mpsc_2۰modelーtimeless t vs :
Timeless (queue_mpsc_2۰model t vs).
#[global] Instance queue_mpsc_2۰consumerーtimeless t :
Timeless (queue_mpsc_2۰consumer t ).
#[global] Instance queue_mpsc_2۰invーpersistent t ι :
Persistent (queue_mpsc_2۰inv t ι).
#[local] Lemma modelーalloc :
⊢ |==>
∃ γ_model,
model₁' γ_model [] ∗
model₂' γ_model [].
#[local] Lemma model₁ーexclusive γ vs1 vs2 :
model₁ γ vs1 -∗
model₁ γ vs2 -∗
False.
#[local] Lemma modelーagree γ vs1 vs2 :
model₁ γ vs1 -∗
model₂ γ vs2 -∗
⌜vs1 = vs2⌝.
#[local] Lemma modelーupdate {γ vs1 vs2} vs :
model₁ γ vs1 -∗
model₂ γ vs2 ==∗
model₁ γ vs ∗
model₂ γ vs.
#[local] Lemma frontーalloc :
⊢ |==>
∃ γ_front,
front₁' γ_front [] ∗
front₂' γ_front [].
#[local] Lemma frontーagree γ front1 front2 :
front₁ γ front1 -∗
front₂ γ front2 -∗
⌜front1 = front2⌝.
#[local] Lemma frontーupdate {γ front1 front2} front :
front₁ γ front1 -∗
front₂ γ front2 ==∗
front₁ γ front ∗
front₂ γ front.
Lemma queue_mpsc_2۰modelーexclusive t vs1 vs2 :
queue_mpsc_2۰model t vs1 -∗
queue_mpsc_2۰model t vs2 -∗
False.
Lemma queue_mpsc_2۰consumerーexclusive t :
queue_mpsc_2۰consumer t -∗
queue_mpsc_2۰consumer t -∗
False.
Lemma queue_mpsc_2٠createーspec ι :
{{{
True
}}}
queue_mpsc_2٠create ()
{{{
t
, RET t;
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰model t [] ∗
queue_mpsc_2۰consumer t
}}}.
Lemma queue_mpsc_2٠is_emptyーspec t ι :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠is_empty t @ ↑ι
<<<
queue_mpsc_2۰model t vs
| RET #(bool_decide (vs = []%list));
queue_mpsc_2۰consumer t
>>>.
Lemma queue_mpsc_2٠push_frontーspec t ι v :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠push_front t v @ ↑ι
<<<
queue_mpsc_2۰model t (v :: vs)
| RET ();
queue_mpsc_2۰consumer t
>>>.
Lemma queue_mpsc_2٠push_backーspec t ι v :
<<<
queue_mpsc_2۰inv t ι
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠push_back t v @ ↑ι
<<<
queue_mpsc_2۰model t (vs ++ [v])
| RET ();
True
>>>.
Lemma queue_mpsc_2٠popーspec t ι :
<<<
queue_mpsc_2۰inv t ι ∗
queue_mpsc_2۰consumer t
| ∀∀ vs,
queue_mpsc_2۰model t vs
>>>
queue_mpsc_2٠pop t @ ↑ι
<<<
queue_mpsc_2۰model t (tail vs)
| RET head vs;
queue_mpsc_2۰consumer t
>>>.
End queue_mpsc_2۰G.
Require zoo_saturn.queue_mpsc_2__opaque.
#[global] Opaque queue_mpsc_2۰inv.
#[global] Opaque queue_mpsc_2۰model.
#[global] Opaque queue_mpsc_2۰consumer.