Library zoo_saturn.bag_2
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Import zoo.common.fin_maps.
Require Import zoo.iris.bi.big_op.
Require Import zoo.iris.base_logic.lib.mono_gmap.
Require Import zoo.iris.base_logic.lib.twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Import zoo_std.xtchain.
Require Export zoo_saturn.bag_2__code.
Require Import zoo_saturn.bag_2__types.
Require Import zoo.options.
Implicit Type l node ππππ π’πππ : location.
Implicit Type nodes : list location.
Implicit Type v t producer consumer : val.
Implicit Type o : option val.
Implicit Type vs ws : list val.
Implicit Type vss wss : gmap val (list val).
Class Bag2G Ξ£ `{zooΫ°G : !ZooG Ξ£} :=
{ #[local] bag_2Ϋ°GΫ°queue_spmcΫ°G :: QueueSpmcG Ξ£
; #[local] bag_2Ϋ°GΫ°queuesΫ°G :: MonoGmapG Ξ£ location val
; #[local] bag_2Ϋ°GΫ°modelΫ°G :: TwinsG Ξ£ (leibnizO (gmap val (list val)))
}.
Definition bag_2Ϋ°Ξ£ :=
#[queue_spmcΫ°Ξ£
; mono_gmapΫ°Ξ£ location val
; twinsΫ°Ξ£ (leibnizO (gmap val (list val)))
].
#[global] Instance subGο½°bag_2Ϋ°Ξ£ Ξ£ `{zooΫ°G : !ZooG Ξ£} :
subG bag_2Ϋ°Ξ£ Ξ£ β
Bag2G Ξ£.
Record producer :=
{ producerΫ°queue : val
; producerΫ°node : location
}.
Implicit Type πππππ’πππ : producer.
#[local] Coercion producerΫ°to_val πππππ’πππ : val :=
( πππππ’πππ.(producerΫ°queue),
#πππππ’πππ.(producerΫ°node)
).
#[local] Lemma producerο½°eqο½°alt πππππ’πππ1 πππππ’πππ2 :
πππππ’πππ1.(producerΫ°queue) = πππππ’πππ2.(producerΫ°queue) β
πππππ’πππ1.(producerΫ°node) = πππππ’πππ2.(producerΫ°node) β
πππππ’πππ1 = πππππ’πππ2.
#[local] Instance producerΫ°to_valο½°inj :
Inj (=) (=) producerΫ°to_val.
Record descriptor :=
{ descriptorΫ°queue : val
; descriptorΫ°vals : list val
}.
Implicit Type descr : descriptor.
Implicit Type descrs : gmap location descriptor.
#[local] Definition descriptorΫ°update_vals descr f :=
{|descriptorΫ°queue := descr.(descriptorΫ°queue)
; descriptorΫ°vals := f descr.(descriptorΫ°vals)
|}.
#[local] Definition descriptorΫ°to_producer descr node :=
{|producerΫ°queue := descr.(descriptorΫ°queue)
; producerΫ°node := node
|}.
#[local] Lemma descriptorΫ°to_producerο½°inj descr1 node1 descr2 node2 :
descriptorΫ°to_producer descr1 node1 = descriptorΫ°to_producer descr2 node2 β
node1 = node2.
Section bag_2Ϋ°G.
Context `{bag_2Ϋ°G : Bag2G Ξ£}.
Record metadata :=
{ metadataΫ°inv : namespace
; metadataΫ°model : gname
; metadataΫ°queues : gname
}.
Implicit Type Ξ³ : metadata.
#[local] Instance metadataο½°eq_dec : EqDecision metadata :=
ltac:(solve_decision).
#[local] Instance metadataο½°countable :
Countable metadata.
#[local] Definition queuesΫ°auth' Ξ³_queues nodes descrs wss : iProp Ξ£ :=
mono_gmapΫ°auth Ξ³_queues (DfracOwn 1) (descriptorΫ°queue <$> descrs) β
βdom descrs = list_to_set nodesβ β
β map_Forall (Ξ» node descr,
wss !! (descriptorΫ°to_producer descr node : val) = Some descr.(descriptorΫ°vals)
) descrs
β.
#[local] Instance : CustomIpat "queuesΫ°auth" :=
" ( Hauth & %Hnodes & %Hdescrs ) ".
#[local] Definition queuesΫ°auth Ξ³ :=
queuesΫ°auth' Ξ³.(metadataΫ°queues).
#[local] Definition queuesΫ°at' :=
mono_gmapΫ°at.
#[local] Definition queuesΫ°at Ξ³ :=
queuesΫ°at' Ξ³.(metadataΫ°queues).
#[local] Definition queuesΫ°elem Ξ³ queue : iProp Ξ£ :=
match queue with
| None β
True
| Some queue β
β node,
queuesΫ°at Ξ³ node queue β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer")
end.
#[local] Instance : CustomIpat "queuesΫ°elem" :=
" ( %node & #Hqueues_at & #Hqueue_inv ) ".
#[local] Definition modelβ' Ξ³_model vss :=
twinsΫ°twinβ Ξ³_model (DfracOwn 1) vss.
#[local] Definition modelβ Ξ³ :=
modelβ' Ξ³.(metadataΫ°model).
#[local] Definition modelβ' Ξ³_model vss :=
twinsΫ°twinβ Ξ³_model vss.
#[local] Definition modelβ Ξ³ :=
modelβ' Ξ³.(metadataΫ°model).
#[local] Definition descriptorΫ°model Ξ³ node descr : iProp Ξ£ :=
β o,
node.[queue] β¦ o β
βfrom_option (.= descr.(descriptorΫ°queue)) True oβ β
queue_spmcΫ°inv descr.(descriptorΫ°queue) (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model descr.(descriptorΫ°queue) descr.(descriptorΫ°vals).
#[local] Instance : CustomIpat "descriptorΫ°model" :=
" ( %o{} & Hnode{}_queue & {>;}%Ho{} & {{inv}#Hqueue{}_inv;{inv}#Hqueue_inv;_} & {>;}Hqueue{}_model ) ".
#[local] Definition invΫ°inner l Ξ³ : iProp Ξ£ :=
β nodes descrs wss,
l.[producers] β¦ from_option #@{location} Β§Null (head nodes) β
xtchain (Header Β§Node 2) DfracDiscarded nodes Β§Null β
queuesΫ°auth Ξ³ nodes descrs wss β
modelβ Ξ³ wss β
[β map] node β¦ descr β descrs,
descriptorΫ°model Ξ³ node descr.
#[local] Instance : CustomIpat "invΫ°inner" :=
" ( %nodes{} & %descrs{} & %wss & Hl_producers & Hnodes{} & >Hqueues_auth & >Hmodelβ & Hdescrs ) ".
#[local] Definition inv' l Ξ³ :=
inv (Ξ³.(metadataΫ°inv).@"inv") (invΫ°inner l Ξ³).
Definition bag_2Ϋ°inv t ΞΉ : iProp Ξ£ :=
β l Ξ³,
βt = #lβ β
βΞΉ = Ξ³.(metadataΫ°inv)β β
l βͺ Ξ³ β
inv' l Ξ³.
#[local] Instance : CustomIpat "inv" :=
" ( %l & %Ξ³ & -> & -> & #Hmeta & #Hinv ) ".
Definition bag_2Ϋ°model t vss : iProp Ξ£ :=
β l Ξ³,
βt = #lβ β
l βͺ Ξ³ β
modelβ Ξ³ vss.
#[local] Instance : CustomIpat "model" :=
" ( %l{;_} & %Ξ³{;_} & %Heq{} & #Hmeta_{} & Hmodelβ{_{}} ) ".
Definition bag_2Ϋ°producer t producer ws : iProp Ξ£ :=
β l Ξ³ πππππ’πππ,
βt = #lβ β
βproducer = πππππ’πππβ β
l βͺ Ξ³ β
πππππ’πππ.(producerΫ°node) β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ πππππ’πππ.(producerΫ°node) πππππ’πππ.(producerΫ°queue) β
queue_spmcΫ°inv πππππ’πππ.(producerΫ°queue) (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°producer πππππ’πππ.(producerΫ°queue) ws.
#[local] Instance : CustomIpat "producer" :=
" ( %l{;_} & %Ξ³{;_} & %πππππ’πππ{} & %Ht_eq{} & {%Hproducer_eq{};->} & #Hmeta{_{};_} & #Hnode_header{_{}} & #Hqueues_at{_{}} & #Hqueue_inv{_{}} & Hqueue_producer{_{}} ) ".
Definition bag_2Ϋ°consumer t consumer : iProp Ξ£ :=
β l Ξ³ ππππ π’πππ (queue : option val),
βt = #lβ β
l βͺ Ξ³ β
βconsumer = #ππππ π’πππβ β
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue.
#[local] Instance : CustomIpat "consumer" :=
" ( %l{;_} & %Ξ³{;_} & %ππππ π’πππ{} & %queue{} & %Heq{} & Hmeta_{} & {%Hconsumer_eq{};->} & Hconsumer_queue{_{}} & #Hqueues_elem{_{}} ) ".
#[local] Instance queuesΫ°authο½°timeless Ξ³ nodes descrs wss :
Timeless (queuesΫ°auth Ξ³ nodes descrs wss).
#[global] Instance bag_2Ϋ°modelο½°timeless t vss :
Timeless (bag_2Ϋ°model t vss).
#[global] Instance bag_2Ϋ°invο½°persistent t ΞΉ :
Persistent (bag_2Ϋ°inv t ΞΉ).
#[local] Lemma queuesο½°alloc :
β’ |==>
β Ξ³_queues,
queuesΫ°auth' Ξ³_queues [] β β .
#[local] Lemma queuesΫ°atο½°get {Ξ³ nodes descrs wss} i node :
nodes !! i = Some node β
queuesΫ°auth Ξ³ nodes descrs wss β’
β descr,
βdescrs !! node = Some descrβ β
queuesΫ°at Ξ³ node descr.(descriptorΫ°queue).
#[local] Lemma queuesΫ°atο½°valid Ξ³ nodes descrs wss node queue :
queuesΫ°auth Ξ³ nodes descrs wss -β
queuesΫ°at Ξ³ node queue -β
β descr,
βdescrs !! node = Some descrβ β
βdescr.(descriptorΫ°queue) = queueβ β
βwss !! (descriptorΫ°to_producer descr node : val) = Some descr.(descriptorΫ°vals)β.
#[local] Lemma queuesΫ°atο½°validο½°producer Ξ³ nodes descrs wss πππππ’πππ :
queuesΫ°auth Ξ³ nodes descrs wss -β
queuesΫ°at Ξ³ πππππ’πππ.(producerΫ°node) πππππ’πππ.(producerΫ°queue) -β
β descr,
βdescrs !! πππππ’πππ.(producerΫ°node) = Some descrβ β
βdescr.(descriptorΫ°queue) = πππππ’πππ.(producerΫ°queue)β β
βwss !! (πππππ’πππ : val) = Some descr.(descriptorΫ°vals)β.
#[local] Lemma queuesο½°insert {Ξ³ nodes descrs wss} node descr :
descrs !! node = None β
queuesΫ°auth Ξ³ nodes descrs wss β’ |==>
queuesΫ°auth Ξ³
(node :: nodes)
(<[node := descr]> descrs)
(<[descriptorΫ°to_producer descr node : val := descr.(descriptorΫ°vals)]> wss) β
queuesΫ°at Ξ³ node descr.(descriptorΫ°queue).
#[local] Lemma queuesο½°update {Ξ³ nodes descrs wss} node descr f :
descrs !! node = Some descr β
queuesΫ°auth Ξ³ nodes descrs wss β’
queuesΫ°auth Ξ³
nodes
(<[node := descriptorΫ°update_vals descr f]> descrs)
(<[descriptorΫ°to_producer descr node : val := f descr.(descriptorΫ°vals)]> wss).
#[local] Lemma queuesο½°updateο½°producer {Ξ³ nodes descrs wss} πππππ’πππ descr f :
descrs !! πππππ’πππ.(producerΫ°node) = Some descr β
descr.(descriptorΫ°queue) = πππππ’πππ.(producerΫ°queue) β
queuesΫ°auth Ξ³ nodes descrs wss β’
queuesΫ°auth Ξ³
nodes
(<[πππππ’πππ.(producerΫ°node) := descriptorΫ°update_vals descr f]> descrs)
(<[πππππ’πππ : val := f descr.(descriptorΫ°vals)]> wss).
#[local] Lemma modelο½°alloc :
β’ |==>
β Ξ³_model,
modelβ' Ξ³_model β β
modelβ' Ξ³_model β .
#[local] Lemma modelβο½°exclusive Ξ³ vss1 vss2 :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 -β
False.
#[local] Lemma modelο½°agree Ξ³ vss1 vss2 :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 -β
βvss1 = vss2β.
#[local] Lemma modelο½°update {Ξ³ vss1 vss2} vss :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 ==β
modelβ Ξ³ vss β
modelβ Ξ³ vss.
Opaque queuesΫ°auth'.
Lemma bag_2Ϋ°modelο½°exclusive t vss1 vss2 :
bag_2Ϋ°model t vss1 -β
bag_2Ϋ°model t vss2 -β
False.
Lemma bag_2Ϋ°producerο½°valid t ΞΉ vss producer ws E :
βΞΉ β E β
bag_2Ϋ°inv t ΞΉ -β
bag_2Ϋ°model t vss -β
bag_2Ϋ°producer t producer ws ={E}=β
β vs,
βvss !! producer = Some vsβ β
βvs `suffix_of` wsβ.
Lemma bag_2Ϋ°producerο½°exclusive t1 t2 producer ws1 ws2 :
bag_2Ϋ°producer t1 producer ws1 -β
bag_2Ϋ°producer t2 producer ws2 -β
False.
Lemma bag_2Ϋ°consumerο½°exclusive t1 t2 consumer :
bag_2Ϋ°consumer t1 consumer -β
bag_2Ϋ°consumer t2 consumer -β
False.
Lemma bag_2Ω createο½°spec ΞΉ :
{{{
True
}}}
bag_2Ω create ()
{{{
t
, RET t;
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°model t β
}}}.
#[local] Lemma bag_2Ω add_producerβο½°spec l Ξ³ (queue : val) :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model queue []
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω add_producerβ #l (Some queue) @ βΞ³.(metadataΫ°inv)
<<<
ββ node,
let πππππ’πππ :=
{|producerΫ°queue := queue
; producerΫ°node := node
|}
in
modelβ Ξ³ (<[πππππ’πππ : val := []]> vss)
| RET #node;
node β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ node queue
>>>.
#[local] Lemma bag_2Ω add_producerο½°spec l Ξ³ (queue : val) :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model queue []
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω add_producer #l queue @ βΞ³.(metadataΫ°inv)
<<<
ββ node,
let πππππ’πππ :=
{|producerΫ°queue := queue
; producerΫ°node := node
|}
in
modelβ Ξ³ (<[πππππ’πππ : val := []]> vss)
| RET #node;
node β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ node queue
>>>.
Lemma bag_2Ω create_producerο½°spec t ΞΉ :
<<<
bag_2Ϋ°inv t ΞΉ
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω create_producer t @ βΞΉ
<<<
ββ producer,
bag_2Ϋ°model t (<[producer := []]> vss)
| RET producer;
bag_2Ϋ°producer t producer []
>>>.
Lemma bag_2Ω close_producerο½°spec t ΞΉ producer ws :
{{{
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°producer t producer ws
}}}
bag_2Ω close_producer producer
{{{
RET ();
bag_2Ϋ°producer t producer ws
}}}.
Lemma bag_2Ω create_consumerο½°spec t ΞΉ :
{{{
bag_2Ϋ°inv t ΞΉ
}}}
bag_2Ω create_consumer t
{{{
consumer
, RET consumer;
bag_2Ϋ°consumer t consumer
}}}.
Lemma bag_2Ω pushο½°spec t ΞΉ producer ws v :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°producer t producer ws
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω push producer v @ βΞΉ
<<<
ββ vs,
βvss !! producer = Some vsβ β
bag_2Ϋ°model t (<[producer := vs ++ [v]]> vss)
| RET ();
bag_2Ϋ°producer t producer (vs ++ [v])
>>>.
#[local] Lemma bag_2Ω popβο½°spec l Ξ³ ππππ π’πππ (queue : option val) nodes :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue β
xtchain (Header Β§Node 2) DfracDiscarded nodes Β§Null β
[β list] node β nodes,
β queue,
queuesΫ°at Ξ³ node queue
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω popβ #ππππ π’πππ (from_option #@{location} Β§Null%V $ head nodes) @ βΞ³.(metadataΫ°inv)
<<<
ββ o,
match o with
| None β
modelβ Ξ³ vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
modelβ Ξ³ (<[producer := vs]> vss)
end
| queue : option val,
RET o;
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue
>>>.
#[local] Lemma bag_2Ω popβο½°spec t ΞΉ consumer :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°consumer t consumer
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω popβ t consumer @ βΞΉ
<<<
ββ o,
match o with
| None β
bag_2Ϋ°model t vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
bag_2Ϋ°model t (<[producer := vs]> vss)
end
| RET o;
bag_2Ϋ°consumer t consumer
>>>.
Lemma bag_2Ω popο½°spec t ΞΉ consumer :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°consumer t consumer
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω pop t consumer @ βΞΉ
<<<
ββ o,
match o with
| None β
bag_2Ϋ°model t vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
bag_2Ϋ°model t (<[producer := vs]> vss)
end
| RET o;
bag_2Ϋ°consumer t consumer
>>>.
End bag_2Ϋ°G.
Require zoo_saturn.bag_2__opaque.
#[global] Opaque bag_2Ϋ°inv.
#[global] Opaque bag_2Ϋ°model.
#[global] Opaque bag_2Ϋ°producer.
#[global] Opaque bag_2Ϋ°consumer.
Require Import zoo.common.countable.
Require Import zoo.common.fin_maps.
Require Import zoo.iris.bi.big_op.
Require Import zoo.iris.base_logic.lib.mono_gmap.
Require Import zoo.iris.base_logic.lib.twins.
Require Import zoo.base.
Require Import zoo_std.option.
Require Import zoo_std.xtchain.
Require Export zoo_saturn.bag_2__code.
Require Import zoo_saturn.bag_2__types.
Require Import zoo.options.
Implicit Type l node ππππ π’πππ : location.
Implicit Type nodes : list location.
Implicit Type v t producer consumer : val.
Implicit Type o : option val.
Implicit Type vs ws : list val.
Implicit Type vss wss : gmap val (list val).
Class Bag2G Ξ£ `{zooΫ°G : !ZooG Ξ£} :=
{ #[local] bag_2Ϋ°GΫ°queue_spmcΫ°G :: QueueSpmcG Ξ£
; #[local] bag_2Ϋ°GΫ°queuesΫ°G :: MonoGmapG Ξ£ location val
; #[local] bag_2Ϋ°GΫ°modelΫ°G :: TwinsG Ξ£ (leibnizO (gmap val (list val)))
}.
Definition bag_2Ϋ°Ξ£ :=
#[queue_spmcΫ°Ξ£
; mono_gmapΫ°Ξ£ location val
; twinsΫ°Ξ£ (leibnizO (gmap val (list val)))
].
#[global] Instance subGο½°bag_2Ϋ°Ξ£ Ξ£ `{zooΫ°G : !ZooG Ξ£} :
subG bag_2Ϋ°Ξ£ Ξ£ β
Bag2G Ξ£.
Record producer :=
{ producerΫ°queue : val
; producerΫ°node : location
}.
Implicit Type πππππ’πππ : producer.
#[local] Coercion producerΫ°to_val πππππ’πππ : val :=
( πππππ’πππ.(producerΫ°queue),
#πππππ’πππ.(producerΫ°node)
).
#[local] Lemma producerο½°eqο½°alt πππππ’πππ1 πππππ’πππ2 :
πππππ’πππ1.(producerΫ°queue) = πππππ’πππ2.(producerΫ°queue) β
πππππ’πππ1.(producerΫ°node) = πππππ’πππ2.(producerΫ°node) β
πππππ’πππ1 = πππππ’πππ2.
#[local] Instance producerΫ°to_valο½°inj :
Inj (=) (=) producerΫ°to_val.
Record descriptor :=
{ descriptorΫ°queue : val
; descriptorΫ°vals : list val
}.
Implicit Type descr : descriptor.
Implicit Type descrs : gmap location descriptor.
#[local] Definition descriptorΫ°update_vals descr f :=
{|descriptorΫ°queue := descr.(descriptorΫ°queue)
; descriptorΫ°vals := f descr.(descriptorΫ°vals)
|}.
#[local] Definition descriptorΫ°to_producer descr node :=
{|producerΫ°queue := descr.(descriptorΫ°queue)
; producerΫ°node := node
|}.
#[local] Lemma descriptorΫ°to_producerο½°inj descr1 node1 descr2 node2 :
descriptorΫ°to_producer descr1 node1 = descriptorΫ°to_producer descr2 node2 β
node1 = node2.
Section bag_2Ϋ°G.
Context `{bag_2Ϋ°G : Bag2G Ξ£}.
Record metadata :=
{ metadataΫ°inv : namespace
; metadataΫ°model : gname
; metadataΫ°queues : gname
}.
Implicit Type Ξ³ : metadata.
#[local] Instance metadataο½°eq_dec : EqDecision metadata :=
ltac:(solve_decision).
#[local] Instance metadataο½°countable :
Countable metadata.
#[local] Definition queuesΫ°auth' Ξ³_queues nodes descrs wss : iProp Ξ£ :=
mono_gmapΫ°auth Ξ³_queues (DfracOwn 1) (descriptorΫ°queue <$> descrs) β
βdom descrs = list_to_set nodesβ β
β map_Forall (Ξ» node descr,
wss !! (descriptorΫ°to_producer descr node : val) = Some descr.(descriptorΫ°vals)
) descrs
β.
#[local] Instance : CustomIpat "queuesΫ°auth" :=
" ( Hauth & %Hnodes & %Hdescrs ) ".
#[local] Definition queuesΫ°auth Ξ³ :=
queuesΫ°auth' Ξ³.(metadataΫ°queues).
#[local] Definition queuesΫ°at' :=
mono_gmapΫ°at.
#[local] Definition queuesΫ°at Ξ³ :=
queuesΫ°at' Ξ³.(metadataΫ°queues).
#[local] Definition queuesΫ°elem Ξ³ queue : iProp Ξ£ :=
match queue with
| None β
True
| Some queue β
β node,
queuesΫ°at Ξ³ node queue β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer")
end.
#[local] Instance : CustomIpat "queuesΫ°elem" :=
" ( %node & #Hqueues_at & #Hqueue_inv ) ".
#[local] Definition modelβ' Ξ³_model vss :=
twinsΫ°twinβ Ξ³_model (DfracOwn 1) vss.
#[local] Definition modelβ Ξ³ :=
modelβ' Ξ³.(metadataΫ°model).
#[local] Definition modelβ' Ξ³_model vss :=
twinsΫ°twinβ Ξ³_model vss.
#[local] Definition modelβ Ξ³ :=
modelβ' Ξ³.(metadataΫ°model).
#[local] Definition descriptorΫ°model Ξ³ node descr : iProp Ξ£ :=
β o,
node.[queue] β¦ o β
βfrom_option (.= descr.(descriptorΫ°queue)) True oβ β
queue_spmcΫ°inv descr.(descriptorΫ°queue) (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model descr.(descriptorΫ°queue) descr.(descriptorΫ°vals).
#[local] Instance : CustomIpat "descriptorΫ°model" :=
" ( %o{} & Hnode{}_queue & {>;}%Ho{} & {{inv}#Hqueue{}_inv;{inv}#Hqueue_inv;_} & {>;}Hqueue{}_model ) ".
#[local] Definition invΫ°inner l Ξ³ : iProp Ξ£ :=
β nodes descrs wss,
l.[producers] β¦ from_option #@{location} Β§Null (head nodes) β
xtchain (Header Β§Node 2) DfracDiscarded nodes Β§Null β
queuesΫ°auth Ξ³ nodes descrs wss β
modelβ Ξ³ wss β
[β map] node β¦ descr β descrs,
descriptorΫ°model Ξ³ node descr.
#[local] Instance : CustomIpat "invΫ°inner" :=
" ( %nodes{} & %descrs{} & %wss & Hl_producers & Hnodes{} & >Hqueues_auth & >Hmodelβ & Hdescrs ) ".
#[local] Definition inv' l Ξ³ :=
inv (Ξ³.(metadataΫ°inv).@"inv") (invΫ°inner l Ξ³).
Definition bag_2Ϋ°inv t ΞΉ : iProp Ξ£ :=
β l Ξ³,
βt = #lβ β
βΞΉ = Ξ³.(metadataΫ°inv)β β
l βͺ Ξ³ β
inv' l Ξ³.
#[local] Instance : CustomIpat "inv" :=
" ( %l & %Ξ³ & -> & -> & #Hmeta & #Hinv ) ".
Definition bag_2Ϋ°model t vss : iProp Ξ£ :=
β l Ξ³,
βt = #lβ β
l βͺ Ξ³ β
modelβ Ξ³ vss.
#[local] Instance : CustomIpat "model" :=
" ( %l{;_} & %Ξ³{;_} & %Heq{} & #Hmeta_{} & Hmodelβ{_{}} ) ".
Definition bag_2Ϋ°producer t producer ws : iProp Ξ£ :=
β l Ξ³ πππππ’πππ,
βt = #lβ β
βproducer = πππππ’πππβ β
l βͺ Ξ³ β
πππππ’πππ.(producerΫ°node) β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ πππππ’πππ.(producerΫ°node) πππππ’πππ.(producerΫ°queue) β
queue_spmcΫ°inv πππππ’πππ.(producerΫ°queue) (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°producer πππππ’πππ.(producerΫ°queue) ws.
#[local] Instance : CustomIpat "producer" :=
" ( %l{;_} & %Ξ³{;_} & %πππππ’πππ{} & %Ht_eq{} & {%Hproducer_eq{};->} & #Hmeta{_{};_} & #Hnode_header{_{}} & #Hqueues_at{_{}} & #Hqueue_inv{_{}} & Hqueue_producer{_{}} ) ".
Definition bag_2Ϋ°consumer t consumer : iProp Ξ£ :=
β l Ξ³ ππππ π’πππ (queue : option val),
βt = #lβ β
l βͺ Ξ³ β
βconsumer = #ππππ π’πππβ β
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue.
#[local] Instance : CustomIpat "consumer" :=
" ( %l{;_} & %Ξ³{;_} & %ππππ π’πππ{} & %queue{} & %Heq{} & Hmeta_{} & {%Hconsumer_eq{};->} & Hconsumer_queue{_{}} & #Hqueues_elem{_{}} ) ".
#[local] Instance queuesΫ°authο½°timeless Ξ³ nodes descrs wss :
Timeless (queuesΫ°auth Ξ³ nodes descrs wss).
#[global] Instance bag_2Ϋ°modelο½°timeless t vss :
Timeless (bag_2Ϋ°model t vss).
#[global] Instance bag_2Ϋ°invο½°persistent t ΞΉ :
Persistent (bag_2Ϋ°inv t ΞΉ).
#[local] Lemma queuesο½°alloc :
β’ |==>
β Ξ³_queues,
queuesΫ°auth' Ξ³_queues [] β β .
#[local] Lemma queuesΫ°atο½°get {Ξ³ nodes descrs wss} i node :
nodes !! i = Some node β
queuesΫ°auth Ξ³ nodes descrs wss β’
β descr,
βdescrs !! node = Some descrβ β
queuesΫ°at Ξ³ node descr.(descriptorΫ°queue).
#[local] Lemma queuesΫ°atο½°valid Ξ³ nodes descrs wss node queue :
queuesΫ°auth Ξ³ nodes descrs wss -β
queuesΫ°at Ξ³ node queue -β
β descr,
βdescrs !! node = Some descrβ β
βdescr.(descriptorΫ°queue) = queueβ β
βwss !! (descriptorΫ°to_producer descr node : val) = Some descr.(descriptorΫ°vals)β.
#[local] Lemma queuesΫ°atο½°validο½°producer Ξ³ nodes descrs wss πππππ’πππ :
queuesΫ°auth Ξ³ nodes descrs wss -β
queuesΫ°at Ξ³ πππππ’πππ.(producerΫ°node) πππππ’πππ.(producerΫ°queue) -β
β descr,
βdescrs !! πππππ’πππ.(producerΫ°node) = Some descrβ β
βdescr.(descriptorΫ°queue) = πππππ’πππ.(producerΫ°queue)β β
βwss !! (πππππ’πππ : val) = Some descr.(descriptorΫ°vals)β.
#[local] Lemma queuesο½°insert {Ξ³ nodes descrs wss} node descr :
descrs !! node = None β
queuesΫ°auth Ξ³ nodes descrs wss β’ |==>
queuesΫ°auth Ξ³
(node :: nodes)
(<[node := descr]> descrs)
(<[descriptorΫ°to_producer descr node : val := descr.(descriptorΫ°vals)]> wss) β
queuesΫ°at Ξ³ node descr.(descriptorΫ°queue).
#[local] Lemma queuesο½°update {Ξ³ nodes descrs wss} node descr f :
descrs !! node = Some descr β
queuesΫ°auth Ξ³ nodes descrs wss β’
queuesΫ°auth Ξ³
nodes
(<[node := descriptorΫ°update_vals descr f]> descrs)
(<[descriptorΫ°to_producer descr node : val := f descr.(descriptorΫ°vals)]> wss).
#[local] Lemma queuesο½°updateο½°producer {Ξ³ nodes descrs wss} πππππ’πππ descr f :
descrs !! πππππ’πππ.(producerΫ°node) = Some descr β
descr.(descriptorΫ°queue) = πππππ’πππ.(producerΫ°queue) β
queuesΫ°auth Ξ³ nodes descrs wss β’
queuesΫ°auth Ξ³
nodes
(<[πππππ’πππ.(producerΫ°node) := descriptorΫ°update_vals descr f]> descrs)
(<[πππππ’πππ : val := f descr.(descriptorΫ°vals)]> wss).
#[local] Lemma modelο½°alloc :
β’ |==>
β Ξ³_model,
modelβ' Ξ³_model β β
modelβ' Ξ³_model β .
#[local] Lemma modelβο½°exclusive Ξ³ vss1 vss2 :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 -β
False.
#[local] Lemma modelο½°agree Ξ³ vss1 vss2 :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 -β
βvss1 = vss2β.
#[local] Lemma modelο½°update {Ξ³ vss1 vss2} vss :
modelβ Ξ³ vss1 -β
modelβ Ξ³ vss2 ==β
modelβ Ξ³ vss β
modelβ Ξ³ vss.
Opaque queuesΫ°auth'.
Lemma bag_2Ϋ°modelο½°exclusive t vss1 vss2 :
bag_2Ϋ°model t vss1 -β
bag_2Ϋ°model t vss2 -β
False.
Lemma bag_2Ϋ°producerο½°valid t ΞΉ vss producer ws E :
βΞΉ β E β
bag_2Ϋ°inv t ΞΉ -β
bag_2Ϋ°model t vss -β
bag_2Ϋ°producer t producer ws ={E}=β
β vs,
βvss !! producer = Some vsβ β
βvs `suffix_of` wsβ.
Lemma bag_2Ϋ°producerο½°exclusive t1 t2 producer ws1 ws2 :
bag_2Ϋ°producer t1 producer ws1 -β
bag_2Ϋ°producer t2 producer ws2 -β
False.
Lemma bag_2Ϋ°consumerο½°exclusive t1 t2 consumer :
bag_2Ϋ°consumer t1 consumer -β
bag_2Ϋ°consumer t2 consumer -β
False.
Lemma bag_2Ω createο½°spec ΞΉ :
{{{
True
}}}
bag_2Ω create ()
{{{
t
, RET t;
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°model t β
}}}.
#[local] Lemma bag_2Ω add_producerβο½°spec l Ξ³ (queue : val) :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model queue []
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω add_producerβ #l (Some queue) @ βΞ³.(metadataΫ°inv)
<<<
ββ node,
let πππππ’πππ :=
{|producerΫ°queue := queue
; producerΫ°node := node
|}
in
modelβ Ξ³ (<[πππππ’πππ : val := []]> vss)
| RET #node;
node β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ node queue
>>>.
#[local] Lemma bag_2Ω add_producerο½°spec l Ξ³ (queue : val) :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
queue_spmcΫ°inv queue (Ξ³.(metadataΫ°inv).@"producer") β
queue_spmcΫ°model queue []
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω add_producer #l queue @ βΞ³.(metadataΫ°inv)
<<<
ββ node,
let πππππ’πππ :=
{|producerΫ°queue := queue
; producerΫ°node := node
|}
in
modelβ Ξ³ (<[πππππ’πππ : val := []]> vss)
| RET #node;
node β¦β Header Β§Node 2 β
queuesΫ°at Ξ³ node queue
>>>.
Lemma bag_2Ω create_producerο½°spec t ΞΉ :
<<<
bag_2Ϋ°inv t ΞΉ
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω create_producer t @ βΞΉ
<<<
ββ producer,
bag_2Ϋ°model t (<[producer := []]> vss)
| RET producer;
bag_2Ϋ°producer t producer []
>>>.
Lemma bag_2Ω close_producerο½°spec t ΞΉ producer ws :
{{{
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°producer t producer ws
}}}
bag_2Ω close_producer producer
{{{
RET ();
bag_2Ϋ°producer t producer ws
}}}.
Lemma bag_2Ω create_consumerο½°spec t ΞΉ :
{{{
bag_2Ϋ°inv t ΞΉ
}}}
bag_2Ω create_consumer t
{{{
consumer
, RET consumer;
bag_2Ϋ°consumer t consumer
}}}.
Lemma bag_2Ω pushο½°spec t ΞΉ producer ws v :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°producer t producer ws
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω push producer v @ βΞΉ
<<<
ββ vs,
βvss !! producer = Some vsβ β
bag_2Ϋ°model t (<[producer := vs ++ [v]]> vss)
| RET ();
bag_2Ϋ°producer t producer (vs ++ [v])
>>>.
#[local] Lemma bag_2Ω popβο½°spec l Ξ³ ππππ π’πππ (queue : option val) nodes :
<<<
l βͺ Ξ³ β
inv' l Ξ³ β
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue β
xtchain (Header Β§Node 2) DfracDiscarded nodes Β§Null β
[β list] node β nodes,
β queue,
queuesΫ°at Ξ³ node queue
| ββ vss,
modelβ Ξ³ vss
>>>
bag_2Ω popβ #ππππ π’πππ (from_option #@{location} Β§Null%V $ head nodes) @ βΞ³.(metadataΫ°inv)
<<<
ββ o,
match o with
| None β
modelβ Ξ³ vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
modelβ Ξ³ (<[producer := vs]> vss)
end
| queue : option val,
RET o;
ππππ π’πππ.[consumer_queue] β¦ queue β
queuesΫ°elem Ξ³ queue
>>>.
#[local] Lemma bag_2Ω popβο½°spec t ΞΉ consumer :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°consumer t consumer
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω popβ t consumer @ βΞΉ
<<<
ββ o,
match o with
| None β
bag_2Ϋ°model t vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
bag_2Ϋ°model t (<[producer := vs]> vss)
end
| RET o;
bag_2Ϋ°consumer t consumer
>>>.
Lemma bag_2Ω popο½°spec t ΞΉ consumer :
<<<
bag_2Ϋ°inv t ΞΉ β
bag_2Ϋ°consumer t consumer
| ββ vss,
bag_2Ϋ°model t vss
>>>
bag_2Ω pop t consumer @ βΞΉ
<<<
ββ o,
match o with
| None β
bag_2Ϋ°model t vss
| Some v β
β producer vs,
βvss !! producer = Some (v :: vs)β β
bag_2Ϋ°model t (<[producer := vs]> vss)
end
| RET o;
bag_2Ϋ°consumer t consumer
>>>.
End bag_2Ϋ°G.
Require zoo_saturn.bag_2__opaque.
#[global] Opaque bag_2Ϋ°inv.
#[global] Opaque bag_2Ϋ°model.
#[global] Opaque bag_2Ϋ°producer.
#[global] Opaque bag_2Ϋ°consumer.