Library zoo.iris.base_logic.lib.auth_monoi
Require Import zoo.prelude.
Require Export zoo.common.relations.
Require Import zoo.iris.algebra.lib.auth_monoi.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class AuthMonoiG Σ {A : ofe} (R : relation A) `{!Initial R} :=
{ #[local] auth_monoi۰G۰inG :: inG Σ (auth_monoi۰UR R)
}.
Definition auth_monoi۰Σ {A : ofe} (R : relation A) `{!Initial R} :=
#[GFunctor (auth_monoi۰UR R)
].
#[global] Instance subGーauth_monoi۰Σ Σ {A : ofe} (R : relation A) `{!Initial R} :
subG (auth_monoi۰Σ R) Σ →
AuthMonoiG Σ R.
Section auth_monoi۰G.
Context {A : ofe} (R : relation A) `{!Initial R}.
Context `{auth_monoi۰G : !AuthMonoiG Σ R}.
Implicit Type a : A.
Notation Rs := (
rtc R
).
Definition auth_monoi۰auth γ dq a :=
own γ (auth_monoi۰auth R dq a).
Definition auth_monoi۰lb γ a :=
own γ (auth_monoi۰lb R a).
#[global] Instance auth_monoi۰authーtimeless γ dq a :
Timeless (auth_monoi۰auth γ dq a).
#[global] Instance auth_monoi۰lbーtimeless γ a :
Timeless (auth_monoi۰lb γ a).
#[global] Instance auth_monoi۰authーpersistent γ a :
Persistent (auth_monoi۰auth γ DfracDiscarded a).
#[global] Instance auth_monoi۰lbーpersistent γ a :
Persistent (auth_monoi۰lb γ a).
#[global] Instance auth_monoi۰authーfractional γ a :
Fractional (λ q, auth_monoi۰auth γ (DfracOwn q) a).
#[global] Instance auth_monoi۰authーas_fractional γ q a :
AsFractional (auth_monoi۰auth γ (DfracOwn q) a) (λ q, auth_monoi۰auth γ (DfracOwn q) a) q.
Lemma auth_monoiーalloc a :
⊢ |==>
∃ γ,
auth_monoi۰auth γ (DfracOwn 1) a.
Lemma auth_monoi۰authーvalid γ dq a :
auth_monoi۰auth γ dq a ⊢
⌜✓ dq⌝.
Lemma auth_monoi۰authーcombine `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
auth_monoi۰auth γ (dq1 ⋅ dq2) a1.
Lemma auth_monoi۰authーvalidー2 `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 ≡ a2⌝.
Lemma auth_monoi۰authーvalidー2ーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma auth_monoi۰authーagree `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 ≡ a2⌝.
Lemma auth_monoi۰authーagreeーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma auth_monoi۰authーdfracーne `{!AntiSymm (≡) Rs} γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_monoi۰auth γ1 dq1 a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーdfracーneーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_monoi۰auth γ1 dq1 a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーne `{!AntiSymm (≡) Rs} γ1 a1 γ2 dq2 a2 :
auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーneーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 a1 γ2 dq2 a2 :
auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーexclusive `{!AntiSymm (≡) Rs} γ a1 dq2 a2 :
auth_monoi۰auth γ (DfracOwn 1) a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
False.
Lemma auth_monoi۰authーexclusiveーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ a1 dq2 a2 :
auth_monoi۰auth γ (DfracOwn 1) a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
False.
Lemma auth_monoi۰authーpersist γ dq a :
auth_monoi۰auth γ dq a ⊢ |==>
auth_monoi۰auth γ DfracDiscarded a.
Lemma auth_monoi۰lbーinitial γ :
⊢ |==>
auth_monoi۰lb γ initial.
Lemma auth_monoi۰lbーmono {γ a} a' :
Rs a' a →
auth_monoi۰lb γ a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーmono' {γ a} a' :
R a' a →
auth_monoi۰lb γ a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーget γ q a :
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a.
Lemma auth_monoi۰lbーgetーmono' γ q a a' :
R a' a →
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーgetーmono γ q a a' :
Rs a' a →
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーvalid γ dq a a' :
auth_monoi۰auth γ dq a -∗
auth_monoi۰lb γ a' -∗
⌜Rs a' a⌝.
Lemma auth_monoi۰lbーagree γ a1 a2 :
auth_monoi۰lb γ a1 -∗
auth_monoi۰lb γ a2 -∗
∃ a,
⌜Rs a1 a⌝ ∧
⌜Rs a2 a⌝.
Lemma auth_monoiーupdate {γ a} a' :
Rs a a' →
auth_monoi۰auth γ (DfracOwn 1) a ⊢ |==>
auth_monoi۰auth γ (DfracOwn 1) a'.
Lemma auth_monoiーupdate' {γ a} a' :
R a a' →
auth_monoi۰auth γ (DfracOwn 1) a ⊢ |==>
auth_monoi۰auth γ (DfracOwn 1) a'.
End auth_monoi۰G.
#[global] Opaque auth_monoi۰auth.
#[global] Opaque auth_monoi۰lb.
Require Export zoo.common.relations.
Require Import zoo.iris.algebra.lib.auth_monoi.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class AuthMonoiG Σ {A : ofe} (R : relation A) `{!Initial R} :=
{ #[local] auth_monoi۰G۰inG :: inG Σ (auth_monoi۰UR R)
}.
Definition auth_monoi۰Σ {A : ofe} (R : relation A) `{!Initial R} :=
#[GFunctor (auth_monoi۰UR R)
].
#[global] Instance subGーauth_monoi۰Σ Σ {A : ofe} (R : relation A) `{!Initial R} :
subG (auth_monoi۰Σ R) Σ →
AuthMonoiG Σ R.
Section auth_monoi۰G.
Context {A : ofe} (R : relation A) `{!Initial R}.
Context `{auth_monoi۰G : !AuthMonoiG Σ R}.
Implicit Type a : A.
Notation Rs := (
rtc R
).
Definition auth_monoi۰auth γ dq a :=
own γ (auth_monoi۰auth R dq a).
Definition auth_monoi۰lb γ a :=
own γ (auth_monoi۰lb R a).
#[global] Instance auth_monoi۰authーtimeless γ dq a :
Timeless (auth_monoi۰auth γ dq a).
#[global] Instance auth_monoi۰lbーtimeless γ a :
Timeless (auth_monoi۰lb γ a).
#[global] Instance auth_monoi۰authーpersistent γ a :
Persistent (auth_monoi۰auth γ DfracDiscarded a).
#[global] Instance auth_monoi۰lbーpersistent γ a :
Persistent (auth_monoi۰lb γ a).
#[global] Instance auth_monoi۰authーfractional γ a :
Fractional (λ q, auth_monoi۰auth γ (DfracOwn q) a).
#[global] Instance auth_monoi۰authーas_fractional γ q a :
AsFractional (auth_monoi۰auth γ (DfracOwn q) a) (λ q, auth_monoi۰auth γ (DfracOwn q) a) q.
Lemma auth_monoiーalloc a :
⊢ |==>
∃ γ,
auth_monoi۰auth γ (DfracOwn 1) a.
Lemma auth_monoi۰authーvalid γ dq a :
auth_monoi۰auth γ dq a ⊢
⌜✓ dq⌝.
Lemma auth_monoi۰authーcombine `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 = a2⌝ ∗
auth_monoi۰auth γ (dq1 ⋅ dq2) a1.
Lemma auth_monoi۰authーvalidー2 `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 ≡ a2⌝.
Lemma auth_monoi۰authーvalidー2ーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜a1 = a2⌝.
Lemma auth_monoi۰authーagree `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 ≡ a2⌝.
Lemma auth_monoi۰authーagreeーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
auth_monoi۰auth γ dq1 a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
⌜a1 = a2⌝.
Lemma auth_monoi۰authーdfracーne `{!AntiSymm (≡) Rs} γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_monoi۰auth γ1 dq1 a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーdfracーneーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 dq1 a1 γ2 dq2 a2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_monoi۰auth γ1 dq1 a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーne `{!AntiSymm (≡) Rs} γ1 a1 γ2 dq2 a2 :
auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーneーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 a1 γ2 dq2 a2 :
auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
auth_monoi۰auth γ2 dq2 a2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_monoi۰authーexclusive `{!AntiSymm (≡) Rs} γ a1 dq2 a2 :
auth_monoi۰auth γ (DfracOwn 1) a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
False.
Lemma auth_monoi۰authーexclusiveーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ a1 dq2 a2 :
auth_monoi۰auth γ (DfracOwn 1) a1 -∗
auth_monoi۰auth γ dq2 a2 -∗
False.
Lemma auth_monoi۰authーpersist γ dq a :
auth_monoi۰auth γ dq a ⊢ |==>
auth_monoi۰auth γ DfracDiscarded a.
Lemma auth_monoi۰lbーinitial γ :
⊢ |==>
auth_monoi۰lb γ initial.
Lemma auth_monoi۰lbーmono {γ a} a' :
Rs a' a →
auth_monoi۰lb γ a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーmono' {γ a} a' :
R a' a →
auth_monoi۰lb γ a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーget γ q a :
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a.
Lemma auth_monoi۰lbーgetーmono' γ q a a' :
R a' a →
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーgetーmono γ q a a' :
Rs a' a →
auth_monoi۰auth γ q a ⊢
auth_monoi۰lb γ a'.
Lemma auth_monoi۰lbーvalid γ dq a a' :
auth_monoi۰auth γ dq a -∗
auth_monoi۰lb γ a' -∗
⌜Rs a' a⌝.
Lemma auth_monoi۰lbーagree γ a1 a2 :
auth_monoi۰lb γ a1 -∗
auth_monoi۰lb γ a2 -∗
∃ a,
⌜Rs a1 a⌝ ∧
⌜Rs a2 a⌝.
Lemma auth_monoiーupdate {γ a} a' :
Rs a a' →
auth_monoi۰auth γ (DfracOwn 1) a ⊢ |==>
auth_monoi۰auth γ (DfracOwn 1) a'.
Lemma auth_monoiーupdate' {γ a} a' :
R a a' →
auth_monoi۰auth γ (DfracOwn 1) a ⊢ |==>
auth_monoi۰auth γ (DfracOwn 1) a'.
End auth_monoi۰G.
#[global] Opaque auth_monoi۰auth.
#[global] Opaque auth_monoi۰lb.