Library zoo.iris.base_logic.lib.twins
Require Import zoo.prelude.
Require Import zoo.iris.algebra.lib.twins.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.algebra.twins.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class TwinsG Σ F :=
{ #[local] twins۰G۰inG :: inG Σ (twins۰R $ oFunctor_apply F $ iPropO Σ)
}.
Definition twins۰Σ F `{!oFunctorContractive F} :=
#[GFunctor (twins۰RF F)
].
#[global] Instance subGーtwins۰Σ Σ F `{!oFunctorContractive F} :
subG (twins۰Σ F) Σ →
TwinsG Σ F.
Section twins۰G.
Context `{twins۰G : !TwinsG Σ F}.
Definition twins۰twin₁ γ dq a :=
own γ (twins۰twin₁ dq a).
Definition twins۰twin₂ γ a :=
own γ (twins۰twin₂ a).
#[global] Instance twins۰twin₁ーproper γ dq :
Proper ((≡) ==> (≡)) (twins۰twin₁ γ dq).
#[global] Instance twins۰twin₂ーproper γ :
Proper ((≡) ==> (≡)) (twins۰twin₂ γ).
#[global] Instance twins۰twin₁ーtimeless γ dq a :
Discrete a →
Timeless (twins۰twin₁ γ dq a).
#[global] Instance twins۰twin₂ーtimeless γ a :
Discrete a →
Timeless (twins۰twin₂ γ a).
#[global] Instance twins۰twin₁ーpersistent γ a :
Persistent (twins۰twin₁ γ DfracDiscarded a).
#[global] Instance twins۰twin₁ーfractional γ a :
Fractional (λ q, twins۰twin₁ γ (DfracOwn q) a).
#[global] Instance twins۰twin₁ーas_fractional γ q a :
AsFractional (twins۰twin₁ γ (DfracOwn q) a) (λ q, twins۰twin₁ γ (DfracOwn q) a) q.
Lemma twinsーalloc a b :
a ≡ b →
⊢ |==>
∃ γ,
twins۰twin₁ γ (DfracOwn 1) a ∗
twins۰twin₂ γ b.
Lemma twinsーalloc' a :
⊢ |==>
∃ γ,
twins۰twin₁ γ (DfracOwn 1) a ∗ twins۰twin₂ γ a.
Lemma twins۰twin₁ーvalid γ dq a :
twins۰twin₁ γ dq a ⊢
⌜✓ dq⌝.
Lemma twins۰twin₁ーcombine γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
a1 ≡ a2 ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2 γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
a1 ≡ a2.
Lemma twins۰twin₁ーagree γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
a1 ≡ a2.
Lemma twins۰twin₁ーdfracーne γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
twins۰twin₁ γ1 dq1 a1 -∗
twins۰twin₁ γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma twins۰twin₁ーne γ1 a1 γ2 dq2 a2 :
twins۰twin₁ γ1 (DfracOwn 1) a1 -∗
twins۰twin₁ γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma twins۰twin₁ーexclusive γ a1 dq2 a2 :
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₁ γ dq2 a2 -∗
False.
Lemma twins۰twin₁ーpersist γ dq a :
twins۰twin₁ γ dq a ⊢ |==>
twins۰twin₁ γ DfracDiscarded a.
Lemma twins۰twin₂ーexclusive γ a1 a2 :
twins۰twin₂ γ a1 -∗
twins۰twin₂ γ a2 -∗
False.
Lemma twinsーagree γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
a ≡ b.
Section ofe_discrete.
Context `{!OfeDiscrete $ oFunctor_apply F $ iPropO Σ}.
Lemma twins۰twin₁ーcombineーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 ≡ a2⌝ ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2ーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 ≡ a2⌝.
Lemma twins۰twin₁ーagreeーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 ≡ a2⌝.
Lemma twinsーagreeーdiscrete γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
⌜a ≡ b⌝.
Section leibniz_equiv.
Context `{!LeibnizEquiv $ oFunctor_apply F $ iPropO Σ}.
Lemma twins۰twin₁ーcombineーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2ーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma twins۰twin₁ーagreeーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma twinsーagreeーL γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
⌜a = b⌝.
End leibniz_equiv.
End ofe_discrete.
Lemma twinsーupdateーequivI {γ a1 b1} a2 b2 :
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₂ γ b1 -∗
a2 ≡ b2 ==∗
twins۰twin₁ γ (DfracOwn 1) a2 ∗
twins۰twin₂ γ b2.
Lemma twinsーupdateーequiv {γ a1 b1} a2 b2 :
a2 ≡ b2 →
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₂ γ b1 ==∗
twins۰twin₁ γ (DfracOwn 1) a2 ∗
twins۰twin₂ γ b2.
Lemma twinsーupdate {γ a b} a' :
twins۰twin₁ γ (DfracOwn 1) a -∗
twins۰twin₂ γ b ==∗
twins۰twin₁ γ (DfracOwn 1) a' ∗
twins۰twin₂ γ a'.
End twins۰G.
#[global] Opaque twins۰twin₁.
#[global] Opaque twins۰twin₂.
Require Import zoo.iris.algebra.lib.twins.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.algebra.twins.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class TwinsG Σ F :=
{ #[local] twins۰G۰inG :: inG Σ (twins۰R $ oFunctor_apply F $ iPropO Σ)
}.
Definition twins۰Σ F `{!oFunctorContractive F} :=
#[GFunctor (twins۰RF F)
].
#[global] Instance subGーtwins۰Σ Σ F `{!oFunctorContractive F} :
subG (twins۰Σ F) Σ →
TwinsG Σ F.
Section twins۰G.
Context `{twins۰G : !TwinsG Σ F}.
Definition twins۰twin₁ γ dq a :=
own γ (twins۰twin₁ dq a).
Definition twins۰twin₂ γ a :=
own γ (twins۰twin₂ a).
#[global] Instance twins۰twin₁ーproper γ dq :
Proper ((≡) ==> (≡)) (twins۰twin₁ γ dq).
#[global] Instance twins۰twin₂ーproper γ :
Proper ((≡) ==> (≡)) (twins۰twin₂ γ).
#[global] Instance twins۰twin₁ーtimeless γ dq a :
Discrete a →
Timeless (twins۰twin₁ γ dq a).
#[global] Instance twins۰twin₂ーtimeless γ a :
Discrete a →
Timeless (twins۰twin₂ γ a).
#[global] Instance twins۰twin₁ーpersistent γ a :
Persistent (twins۰twin₁ γ DfracDiscarded a).
#[global] Instance twins۰twin₁ーfractional γ a :
Fractional (λ q, twins۰twin₁ γ (DfracOwn q) a).
#[global] Instance twins۰twin₁ーas_fractional γ q a :
AsFractional (twins۰twin₁ γ (DfracOwn q) a) (λ q, twins۰twin₁ γ (DfracOwn q) a) q.
Lemma twinsーalloc a b :
a ≡ b →
⊢ |==>
∃ γ,
twins۰twin₁ γ (DfracOwn 1) a ∗
twins۰twin₂ γ b.
Lemma twinsーalloc' a :
⊢ |==>
∃ γ,
twins۰twin₁ γ (DfracOwn 1) a ∗ twins۰twin₂ γ a.
Lemma twins۰twin₁ーvalid γ dq a :
twins۰twin₁ γ dq a ⊢
⌜✓ dq⌝.
Lemma twins۰twin₁ーcombine γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
a1 ≡ a2 ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2 γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
a1 ≡ a2.
Lemma twins۰twin₁ーagree γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
a1 ≡ a2.
Lemma twins۰twin₁ーdfracーne γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
twins۰twin₁ γ1 dq1 a1 -∗
twins۰twin₁ γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma twins۰twin₁ーne γ1 a1 γ2 dq2 a2 :
twins۰twin₁ γ1 (DfracOwn 1) a1 -∗
twins۰twin₁ γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma twins۰twin₁ーexclusive γ a1 dq2 a2 :
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₁ γ dq2 a2 -∗
False.
Lemma twins۰twin₁ーpersist γ dq a :
twins۰twin₁ γ dq a ⊢ |==>
twins۰twin₁ γ DfracDiscarded a.
Lemma twins۰twin₂ーexclusive γ a1 a2 :
twins۰twin₂ γ a1 -∗
twins۰twin₂ γ a2 -∗
False.
Lemma twinsーagree γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
a ≡ b.
Section ofe_discrete.
Context `{!OfeDiscrete $ oFunctor_apply F $ iPropO Σ}.
Lemma twins۰twin₁ーcombineーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 ≡ a2⌝ ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2ーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 ≡ a2⌝.
Lemma twins۰twin₁ーagreeーdiscrete γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 ≡ a2⌝.
Lemma twinsーagreeーdiscrete γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
⌜a ≡ b⌝.
Section leibniz_equiv.
Context `{!LeibnizEquiv $ oFunctor_apply F $ iPropO Σ}.
Lemma twins۰twin₁ーcombineーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
twins۰twin₁ γ (dq1 ⋅ dq2) a1.
Lemma twins۰twin₁ーvalidー2ーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma twins۰twin₁ーagreeーL γ dq1 a1 dq2 a2 :
twins۰twin₁ γ dq1 a1 -∗
twins۰twin₁ γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma twinsーagreeーL γ dq a b :
twins۰twin₁ γ dq a -∗
twins۰twin₂ γ b -∗
⌜a = b⌝.
End leibniz_equiv.
End ofe_discrete.
Lemma twinsーupdateーequivI {γ a1 b1} a2 b2 :
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₂ γ b1 -∗
a2 ≡ b2 ==∗
twins۰twin₁ γ (DfracOwn 1) a2 ∗
twins۰twin₂ γ b2.
Lemma twinsーupdateーequiv {γ a1 b1} a2 b2 :
a2 ≡ b2 →
twins۰twin₁ γ (DfracOwn 1) a1 -∗
twins۰twin₂ γ b1 ==∗
twins۰twin₁ γ (DfracOwn 1) a2 ∗
twins۰twin₂ γ b2.
Lemma twinsーupdate {γ a b} a' :
twins۰twin₁ γ (DfracOwn 1) a -∗
twins۰twin₂ γ b ==∗
twins۰twin₁ γ (DfracOwn 1) a' ∗
twins۰twin₂ γ a'.
End twins۰G.
#[global] Opaque twins۰twin₁.
#[global] Opaque twins۰twin₂.