Library zoo.iris.base_logic.lib.oneshot
Require Import zoo.prelude.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.lib.ghost_var.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class OneshotG Σ A B :=
{ #[local] oneshot۰G۰var۰G :: GhostVarG Σ (leibnizO (A + B))
}.
Definition oneshot۰Σ A B :=
#[ghost_var۰Σ (leibnizO (A + B))
].
#[global] Instance subGーoneshot۰Σ Σ A B :
subG (oneshot۰Σ A B) Σ →
OneshotG Σ A B.
Section oneshot۰G.
Context `{oneshot۰G : !OneshotG Σ A B}.
Implicit Type a : A.
Implicit Type b : B.
Definition oneshot۰pending γ dq a :=
ghost_var γ dq (inl a).
Definition oneshot۰shot γ b :=
ghost_var γ DfracDiscarded (inr b).
#[global] Instance oneshot۰pendingーtimeless γ dq a :
Timeless (oneshot۰pending γ dq a).
#[global] Instance oneshot۰shotーtimeless γ b :
Timeless (oneshot۰shot γ b).
#[global] Instance oneshot۰shotーpersistent γ b :
Persistent (oneshot۰shot γ b).
#[global] Instance oneshot۰pendingーfractional γ a :
Fractional (λ q, oneshot۰pending γ (DfracOwn q) a).
#[global] Instance oneshot۰pendingーas_fractional γ q a :
AsFractional (oneshot۰pending γ (DfracOwn q) a) (λ q, oneshot۰pending γ (DfracOwn q) a) q.
Lemma oneshotーalloc a :
⊢ |==>
∃ γ,
oneshot۰pending γ (DfracOwn 1) a.
Lemma oneshot۰pendingーvalid γ dq a :
oneshot۰pending γ dq a ⊢
⌜✓ dq⌝.
Lemma oneshot۰pendingーcombine γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
oneshot۰pending γ (dq1 ⋅ dq2) a1.
Lemma oneshot۰pendingーvalidー2 γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma oneshot۰pendingーagree γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma oneshot۰pendingーdfracーne γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
oneshot۰pending γ1 dq1 a1 -∗
oneshot۰pending γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma oneshot۰pendingーne γ1 a1 γ2 dq2 a2 :
oneshot۰pending γ1 (DfracOwn 1) a1 -∗
oneshot۰pending γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma oneshot۰pendingーexclusive γ a1 dq2 a2 :
oneshot۰pending γ (DfracOwn 1) a1 -∗
oneshot۰pending γ dq2 a2 -∗
False.
Lemma oneshot۰pendingーpersist γ dq a :
oneshot۰pending γ dq a ⊢ |==>
oneshot۰pending γ DfracDiscarded a.
Lemma oneshot۰shotーagree γ b1 b2 :
oneshot۰shot γ b1 -∗
oneshot۰shot γ b2 -∗
⌜b1 = b2⌝.
Lemma oneshotーpendingーshot γ dq a b :
oneshot۰pending γ dq a -∗
oneshot۰shot γ b -∗
False.
Lemma oneshotーupdateーpending γ a a' :
oneshot۰pending γ (DfracOwn 1) a ⊢ |==>
oneshot۰pending γ (DfracOwn 1) a'.
Lemma oneshotーupdateーshot {γ a} b :
oneshot۰pending γ (DfracOwn 1) a ⊢ |==>
oneshot۰shot γ b.
End oneshot۰G.
#[global] Opaque oneshot۰pending.
#[global] Opaque oneshot۰shot.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.lib.ghost_var.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class OneshotG Σ A B :=
{ #[local] oneshot۰G۰var۰G :: GhostVarG Σ (leibnizO (A + B))
}.
Definition oneshot۰Σ A B :=
#[ghost_var۰Σ (leibnizO (A + B))
].
#[global] Instance subGーoneshot۰Σ Σ A B :
subG (oneshot۰Σ A B) Σ →
OneshotG Σ A B.
Section oneshot۰G.
Context `{oneshot۰G : !OneshotG Σ A B}.
Implicit Type a : A.
Implicit Type b : B.
Definition oneshot۰pending γ dq a :=
ghost_var γ dq (inl a).
Definition oneshot۰shot γ b :=
ghost_var γ DfracDiscarded (inr b).
#[global] Instance oneshot۰pendingーtimeless γ dq a :
Timeless (oneshot۰pending γ dq a).
#[global] Instance oneshot۰shotーtimeless γ b :
Timeless (oneshot۰shot γ b).
#[global] Instance oneshot۰shotーpersistent γ b :
Persistent (oneshot۰shot γ b).
#[global] Instance oneshot۰pendingーfractional γ a :
Fractional (λ q, oneshot۰pending γ (DfracOwn q) a).
#[global] Instance oneshot۰pendingーas_fractional γ q a :
AsFractional (oneshot۰pending γ (DfracOwn q) a) (λ q, oneshot۰pending γ (DfracOwn q) a) q.
Lemma oneshotーalloc a :
⊢ |==>
∃ γ,
oneshot۰pending γ (DfracOwn 1) a.
Lemma oneshot۰pendingーvalid γ dq a :
oneshot۰pending γ dq a ⊢
⌜✓ dq⌝.
Lemma oneshot۰pendingーcombine γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
oneshot۰pending γ (dq1 ⋅ dq2) a1.
Lemma oneshot۰pendingーvalidー2 γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma oneshot۰pendingーagree γ dq1 a1 dq2 a2 :
oneshot۰pending γ dq1 a1 -∗
oneshot۰pending γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma oneshot۰pendingーdfracーne γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
oneshot۰pending γ1 dq1 a1 -∗
oneshot۰pending γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma oneshot۰pendingーne γ1 a1 γ2 dq2 a2 :
oneshot۰pending γ1 (DfracOwn 1) a1 -∗
oneshot۰pending γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma oneshot۰pendingーexclusive γ a1 dq2 a2 :
oneshot۰pending γ (DfracOwn 1) a1 -∗
oneshot۰pending γ dq2 a2 -∗
False.
Lemma oneshot۰pendingーpersist γ dq a :
oneshot۰pending γ dq a ⊢ |==>
oneshot۰pending γ DfracDiscarded a.
Lemma oneshot۰shotーagree γ b1 b2 :
oneshot۰shot γ b1 -∗
oneshot۰shot γ b2 -∗
⌜b1 = b2⌝.
Lemma oneshotーpendingーshot γ dq a b :
oneshot۰pending γ dq a -∗
oneshot۰shot γ b -∗
False.
Lemma oneshotーupdateーpending γ a a' :
oneshot۰pending γ (DfracOwn 1) a ⊢ |==>
oneshot۰pending γ (DfracOwn 1) a'.
Lemma oneshotーupdateーshot {γ a} b :
oneshot۰pending γ (DfracOwn 1) a ⊢ |==>
oneshot۰shot γ b.
End oneshot۰G.
#[global] Opaque oneshot۰pending.
#[global] Opaque oneshot۰shot.