Library zoo.iris.base_logic.lib.prop_spsc
Require Import iris.base_logic.lib.invariants.
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.lib.excl.
Require Import zoo.iris.base_logic.lib.oneshot.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class PropSpscG Σ `{inv۰G : !invGS Σ} :=
{ #[local] prop_spsc۰G۰state۰G :: OneshotG Σ () ()
; #[local] prop_spsc۰G۰consumer۰G :: ExclG Σ unitO
}.
Definition prop_spsc۰Σ :=
#[oneshot۰Σ () ()
; excl۰Σ unitO
].
#[global] Instance subGーprop_spsc۰Σ Σ `{inv۰G : !invGS Σ} :
subG prop_spsc۰Σ Σ →
PropSpscG Σ.
Section prop_spsc۰G.
Context `{prop_spsc۰G : PropSpscG Σ}.
Implicit Type P : iProp Σ.
Record prop_spsc۰name :=
{ prop_spsc۰name۰state : gname
; prop_spsc۰name۰consumer : gname
}.
Implicit Type γ : prop_spsc۰name.
#[global] Instance prop_spsc۰nameーeq_dec : EqDecision prop_spsc۰name :=
ltac:(solve_decision).
#[global] Instance prop_spsc۰nameーcountable :
Countable prop_spsc۰name.
#[local] Definition state۰unset₁' γ_state :=
oneshot۰pending γ_state (DfracOwn (2/3)) ().
#[local] Definition state۰unset₁ γ :=
state۰unset₁' γ.(prop_spsc۰name۰state).
#[local] Definition state۰unset₂' γ_state :=
oneshot۰pending γ_state (DfracOwn (1/3)) ().
#[local] Definition state۰unset₂ γ :=
state۰unset₂' γ.(prop_spsc۰name۰state).
#[local] Definition state۰set' γ_state :=
oneshot۰shot γ_state ().
#[local] Definition state۰set γ :=
state۰set' γ.(prop_spsc۰name۰state).
#[local] Definition consumer' γ_consumer :=
excl γ_consumer ().
#[local] Definition consumer γ :=
consumer' γ.(prop_spsc۰name۰consumer).
#[local] Definition inv۰consumer γ P : iProp Σ :=
P ∨ consumer γ.
#[local] Instance : CustomIpat "inv۰consumer" :=
" [ HP{_{!}} | >Hconsumer{_{!}} ] ".
#[local] Definition inv۰inner γ P : iProp Σ :=
( state۰unset₂ γ
) ∨ (
state۰set γ ∗
inv۰consumer γ P
).
#[local] Instance : CustomIpat "inv۰inner" :=
" [ >Hstate_unset₂ | ( >Hstate_set{_{!}} & Hinv_consumer ) ] ".
Definition prop_spsc۰inv γ ι P :=
inv ι (inv۰inner γ P).
#[local] Instance : CustomIpat "inv" :=
" #Hinv ".
Definition prop_spsc۰producer :=
state۰unset₁.
#[local] Instance : CustomIpat "producer" :=
" Hstate_unset₁ ".
Definition prop_spsc۰consumer :=
consumer.
#[local] Instance : CustomIpat "consumer" :=
" Hconsumer ".
Definition prop_spsc۰resolved :=
state۰set.
#[local] Instance : CustomIpat "resolved" :=
" #Hstate_set ".
#[global] Instance prop_spsc۰invーcontractive γ ι :
Contractive (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰invーne γ ι :
NonExpansive (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰invーproper γ ι :
Proper ((≡) ==> (≡)) (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰producerーtimeless γ :
Timeless (prop_spsc۰producer γ).
#[global] Instance prop_spsc۰consumerーtimeless γ :
Timeless (prop_spsc۰consumer γ).
#[global] Instance prop_spsc۰resolvedーtimeless γ :
Timeless (prop_spsc۰resolved γ).
#[global] Instance prop_spsc۰invーpersistent γ ι P :
Persistent (prop_spsc۰inv γ ι P).
#[global] Instance prop_spsc۰resolvedーpersistent γ :
Persistent (prop_spsc۰resolved γ).
#[local] Lemma stateーalloc :
⊢ |==>
∃ γ_state,
state۰unset₁' γ_state ∗
state۰unset₂' γ_state.
#[local] Lemma state۰unset₁ーexclusive γ :
state۰unset₁ γ -∗
state۰unset₁ γ -∗
False.
#[local] Lemma state۰unset₁ーset γ :
state۰unset₁ γ -∗
state۰set γ -∗
False.
#[local] Lemma state۰unset₂ーset γ :
state۰unset₂ γ -∗
state۰set γ -∗
False.
#[local] Lemma stateーupdate γ :
state۰unset₁ γ -∗
state۰unset₂ γ ==∗
state۰set γ.
#[local] Lemma consumerーalloc :
⊢ |==>
∃ γ_consumer,
consumer' γ_consumer.
#[local] Lemma consumerーexclusive γ :
consumer γ -∗
consumer γ -∗
False.
Lemma prop_spscーalloc ι P E :
⊢ |={E}=>
∃ γ,
prop_spsc۰inv γ ι P ∗
prop_spsc۰producer γ ∗
prop_spsc۰consumer γ.
Lemma prop_spsc۰producerーexclusive γ :
prop_spsc۰producer γ -∗
prop_spsc۰producer γ -∗
False.
Lemma spcc_prop۰producerーresolved γ :
prop_spsc۰producer γ -∗
prop_spsc۰resolved γ -∗
False.
Lemma prop_spsc۰consumerーexclusive γ :
prop_spsc۰consumer γ -∗
prop_spsc۰consumer γ -∗
False.
Lemma prop_spscーproduce γ ι P E :
↑ι ⊆ E →
prop_spsc۰inv γ ι P -∗
prop_spsc۰producer γ -∗
▷ P ={E}=∗
prop_spsc۰resolved γ.
Lemma prop_spscーconsume γ ι P E :
↑ι ⊆ E →
prop_spsc۰inv γ ι P -∗
prop_spsc۰consumer γ -∗
prop_spsc۰resolved γ ={E}=∗
▷ P.
End prop_spsc۰G.
#[global] Opaque prop_spsc۰inv.
#[global] Opaque prop_spsc۰producer.
#[global] Opaque prop_spsc۰consumer.
#[global] Opaque prop_spsc۰resolved.
Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.lib.excl.
Require Import zoo.iris.base_logic.lib.oneshot.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class PropSpscG Σ `{inv۰G : !invGS Σ} :=
{ #[local] prop_spsc۰G۰state۰G :: OneshotG Σ () ()
; #[local] prop_spsc۰G۰consumer۰G :: ExclG Σ unitO
}.
Definition prop_spsc۰Σ :=
#[oneshot۰Σ () ()
; excl۰Σ unitO
].
#[global] Instance subGーprop_spsc۰Σ Σ `{inv۰G : !invGS Σ} :
subG prop_spsc۰Σ Σ →
PropSpscG Σ.
Section prop_spsc۰G.
Context `{prop_spsc۰G : PropSpscG Σ}.
Implicit Type P : iProp Σ.
Record prop_spsc۰name :=
{ prop_spsc۰name۰state : gname
; prop_spsc۰name۰consumer : gname
}.
Implicit Type γ : prop_spsc۰name.
#[global] Instance prop_spsc۰nameーeq_dec : EqDecision prop_spsc۰name :=
ltac:(solve_decision).
#[global] Instance prop_spsc۰nameーcountable :
Countable prop_spsc۰name.
#[local] Definition state۰unset₁' γ_state :=
oneshot۰pending γ_state (DfracOwn (2/3)) ().
#[local] Definition state۰unset₁ γ :=
state۰unset₁' γ.(prop_spsc۰name۰state).
#[local] Definition state۰unset₂' γ_state :=
oneshot۰pending γ_state (DfracOwn (1/3)) ().
#[local] Definition state۰unset₂ γ :=
state۰unset₂' γ.(prop_spsc۰name۰state).
#[local] Definition state۰set' γ_state :=
oneshot۰shot γ_state ().
#[local] Definition state۰set γ :=
state۰set' γ.(prop_spsc۰name۰state).
#[local] Definition consumer' γ_consumer :=
excl γ_consumer ().
#[local] Definition consumer γ :=
consumer' γ.(prop_spsc۰name۰consumer).
#[local] Definition inv۰consumer γ P : iProp Σ :=
P ∨ consumer γ.
#[local] Instance : CustomIpat "inv۰consumer" :=
" [ HP{_{!}} | >Hconsumer{_{!}} ] ".
#[local] Definition inv۰inner γ P : iProp Σ :=
( state۰unset₂ γ
) ∨ (
state۰set γ ∗
inv۰consumer γ P
).
#[local] Instance : CustomIpat "inv۰inner" :=
" [ >Hstate_unset₂ | ( >Hstate_set{_{!}} & Hinv_consumer ) ] ".
Definition prop_spsc۰inv γ ι P :=
inv ι (inv۰inner γ P).
#[local] Instance : CustomIpat "inv" :=
" #Hinv ".
Definition prop_spsc۰producer :=
state۰unset₁.
#[local] Instance : CustomIpat "producer" :=
" Hstate_unset₁ ".
Definition prop_spsc۰consumer :=
consumer.
#[local] Instance : CustomIpat "consumer" :=
" Hconsumer ".
Definition prop_spsc۰resolved :=
state۰set.
#[local] Instance : CustomIpat "resolved" :=
" #Hstate_set ".
#[global] Instance prop_spsc۰invーcontractive γ ι :
Contractive (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰invーne γ ι :
NonExpansive (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰invーproper γ ι :
Proper ((≡) ==> (≡)) (prop_spsc۰inv γ ι).
#[global] Instance prop_spsc۰producerーtimeless γ :
Timeless (prop_spsc۰producer γ).
#[global] Instance prop_spsc۰consumerーtimeless γ :
Timeless (prop_spsc۰consumer γ).
#[global] Instance prop_spsc۰resolvedーtimeless γ :
Timeless (prop_spsc۰resolved γ).
#[global] Instance prop_spsc۰invーpersistent γ ι P :
Persistent (prop_spsc۰inv γ ι P).
#[global] Instance prop_spsc۰resolvedーpersistent γ :
Persistent (prop_spsc۰resolved γ).
#[local] Lemma stateーalloc :
⊢ |==>
∃ γ_state,
state۰unset₁' γ_state ∗
state۰unset₂' γ_state.
#[local] Lemma state۰unset₁ーexclusive γ :
state۰unset₁ γ -∗
state۰unset₁ γ -∗
False.
#[local] Lemma state۰unset₁ーset γ :
state۰unset₁ γ -∗
state۰set γ -∗
False.
#[local] Lemma state۰unset₂ーset γ :
state۰unset₂ γ -∗
state۰set γ -∗
False.
#[local] Lemma stateーupdate γ :
state۰unset₁ γ -∗
state۰unset₂ γ ==∗
state۰set γ.
#[local] Lemma consumerーalloc :
⊢ |==>
∃ γ_consumer,
consumer' γ_consumer.
#[local] Lemma consumerーexclusive γ :
consumer γ -∗
consumer γ -∗
False.
Lemma prop_spscーalloc ι P E :
⊢ |={E}=>
∃ γ,
prop_spsc۰inv γ ι P ∗
prop_spsc۰producer γ ∗
prop_spsc۰consumer γ.
Lemma prop_spsc۰producerーexclusive γ :
prop_spsc۰producer γ -∗
prop_spsc۰producer γ -∗
False.
Lemma spcc_prop۰producerーresolved γ :
prop_spsc۰producer γ -∗
prop_spsc۰resolved γ -∗
False.
Lemma prop_spsc۰consumerーexclusive γ :
prop_spsc۰consumer γ -∗
prop_spsc۰consumer γ -∗
False.
Lemma prop_spscーproduce γ ι P E :
↑ι ⊆ E →
prop_spsc۰inv γ ι P -∗
prop_spsc۰producer γ -∗
▷ P ={E}=∗
prop_spsc۰resolved γ.
Lemma prop_spscーconsume γ ι P E :
↑ι ⊆ E →
prop_spsc۰inv γ ι P -∗
prop_spsc۰consumer γ -∗
prop_spsc۰resolved γ ={E}=∗
▷ P.
End prop_spsc۰G.
#[global] Opaque prop_spsc۰inv.
#[global] Opaque prop_spsc۰producer.
#[global] Opaque prop_spsc۰consumer.
#[global] Opaque prop_spsc۰resolved.