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