Library zoo.iris.algebra.lib.auth_monoi
Require Import iris.algebra.proofmode_classes.
Require Import zoo.prelude.
Require Export zoo.common.relations.
Require Export zoo.iris.algebra.base.
Require Import zoo.iris.algebra.auth.
Require Import zoo.iris.algebra.monopoi.
Require Import zoo.options.
#[local] Hint Resolve monopoi۰principalーvalid : core.
Section relation.
Context {SI : sidx}.
Context {A : ofe} (R : relation A).
Context `{!Initial R}.
Implicit Type a b : A.
Notation Rs := (
rtc R
).
#[local] Instance Rsーantisymm `{!AntiSymm (=) Rs} :
AntiSymm (≡) Rs.
Definition auth_monoi :=
auth (monopoi Rs).
Definition auth_monoi۰R :=
authR (monopoi۰UR Rs).
Definition auth_monoi۰UR :=
authUR (monopoi۰UR Rs).
Definition auth_monoi۰auth dq a : auth_monoi۰UR :=
●{dq} monopoi۰principal Rs a ⋅ ◯ monopoi۰principal Rs a.
Definition auth_monoi۰lb a : auth_monoi۰UR :=
◯ monopoi۰principal Rs a.
#[global] Instance auth_monoi۰authーinj `{!AntiSymm (≡) Rs} :
Inj2 (=) (≡) (≡) auth_monoi۰auth
| 10.
#[global] Instance auth_monoi۰authーinjーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
Inj2 (=) (=) (≡) auth_monoi۰auth
| 9.
#[global] Instance auth_monoi۰lbーinj `{!AntiSymm (≡) Rs} :
Inj (≡) (≡) auth_monoi۰lb
| 10.
#[global] Instance auth_monoi۰lbーinjーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
Inj (=) (≡) auth_monoi۰lb
| 9.
#[global] Instance auth_monoiーcmra_discrete :
CmraDiscrete auth_monoi۰R.
#[global] Instance auth_monoi۰authーcore_id a :
CoreId (auth_monoi۰auth DfracDiscarded a).
#[global] Instance auth_monoi۰lbーcore_id a :
CoreId (auth_monoi۰lb a).
Lemma auth_monoi۰authーdfracーop dq1 dq2 a :
auth_monoi۰auth (dq1 ⋅ dq2) a ≡ auth_monoi۰auth dq1 a ⋅ auth_monoi۰auth dq2 a.
#[global] Instance auth_monoi۰authーdfracーis_op dq dq1 dq2 a :
IsOp dq dq1 dq2 →
IsOp' (auth_monoi۰auth dq a) (auth_monoi۰auth dq1 a) (auth_monoi۰auth dq2 a).
Lemma auth_monoi۰lbーop a a' :
Rs a a' →
auth_monoi۰lb a' ≡ auth_monoi۰lb a ⋅ auth_monoi۰lb a'.
Lemma auth_monoi۰authーlbーop dq a :
auth_monoi۰auth dq a ≡ auth_monoi۰auth dq a ⋅ auth_monoi۰lb a.
Lemma auth_monoi۰authーdfracーvalid dq a :
✓ auth_monoi۰auth dq a ↔
✓ dq.
Lemma auth_monoi۰authーvalid a :
✓ auth_monoi۰auth (DfracOwn 1) a.
Lemma auth_monoi۰authーdfracーopーvalid `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
✓ (auth_monoi۰auth dq1 a1 ⋅ auth_monoi۰auth dq2 a2) →
✓ (dq1 ⋅ dq2) ∧
a1 ≡ a2.
Lemma auth_monoi۰authーdfracーopーvalidー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ーopーvalid `{!AntiSymm (≡) Rs} a1 a2 :
✓ (auth_monoi۰auth (DfracOwn 1) a1 ⋅ auth_monoi۰auth (DfracOwn 1) a2) →
False.
Lemma auth_monoi۰authーopーvalidーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
✓ (auth_monoi۰auth (DfracOwn 1) a1 ⋅ auth_monoi۰auth (DfracOwn 1) a2) ↔
False.
Lemma auth_monoi۰lbーopーvalid a1 a2 :
✓ (auth_monoi۰lb a1 ⋅ auth_monoi۰lb a2) →
∃ a,
Rs a1 a ∧
Rs a2 a.
Lemma auth_monoiーbothーdfracーvalid dq a b :
✓ (auth_monoi۰auth dq a ⋅ auth_monoi۰lb b) ↔
✓ dq ∧
Rs b a.
Lemma auth_monoiーbothーvalid a b :
✓ (auth_monoi۰auth (DfracOwn 1) a ⋅ auth_monoi۰lb b) ↔
Rs b a.
Lemma auth_monoi۰lbーmono a1 a2 :
Rs a1 a2 →
auth_monoi۰lb a1 ≼ auth_monoi۰lb a2.
Lemma auth_monoi۰authーdfracーincluded `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
auth_monoi۰auth dq1 a1 ≼ auth_monoi۰auth dq2 a2 →
(dq1 ≼ dq2 ∨ dq1 = dq2) ∧
a1 ≡ a2.
Lemma auth_monoi۰authーdfracーincludedーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} dq1 a1 dq2 a2 :
auth_monoi۰auth dq1 a1 ≼ auth_monoi۰auth dq2 a2 ↔
(dq1 ≼ dq2 ∨ dq1 = dq2) ∧
a1 = a2.
Lemma auth_monoi۰authーincluded `{!AntiSymm (≡) Rs} a1 a2 :
auth_monoi۰auth (DfracOwn 1) a1 ≼ auth_monoi۰auth (DfracOwn 1) a2 →
a1 ≡ a2.
Lemma auth_monoi۰authーincludedーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
auth_monoi۰auth (DfracOwn 1) a1 ≼ auth_monoi۰auth (DfracOwn 1) a2 ↔
a1 = a2.
Lemma auth_monoi۰lbーincluded a1 dq a2 :
auth_monoi۰lb a1 ≼ auth_monoi۰auth dq a2 ↔
Rs a1 a2.
Lemma auth_monoi۰lbーincluded' a dq :
auth_monoi۰lb a ≼ auth_monoi۰auth dq a.
Lemma auth_monoi۰authーpersist dq a :
auth_monoi۰auth dq a ~~> auth_monoi۰auth DfracDiscarded a.
Lemma auth_monoi۰authーupdate {a} a' :
Rs a a' →
auth_monoi۰auth (DfracOwn 1) a ~~> auth_monoi۰auth (DfracOwn 1) a'.
Lemma auth_monoi۰authーlocal_update a a' :
Rs a a' →
(auth_monoi۰auth (DfracOwn 1) a, auth_monoi۰auth (DfracOwn 1) a) ¬l~>
(auth_monoi۰auth (DfracOwn 1) a', auth_monoi۰auth (DfracOwn 1) a').
End relation.
#[global] Opaque auth_monoi۰auth.
#[global] Opaque auth_monoi۰lb.
Require Import zoo.prelude.
Require Export zoo.common.relations.
Require Export zoo.iris.algebra.base.
Require Import zoo.iris.algebra.auth.
Require Import zoo.iris.algebra.monopoi.
Require Import zoo.options.
#[local] Hint Resolve monopoi۰principalーvalid : core.
Section relation.
Context {SI : sidx}.
Context {A : ofe} (R : relation A).
Context `{!Initial R}.
Implicit Type a b : A.
Notation Rs := (
rtc R
).
#[local] Instance Rsーantisymm `{!AntiSymm (=) Rs} :
AntiSymm (≡) Rs.
Definition auth_monoi :=
auth (monopoi Rs).
Definition auth_monoi۰R :=
authR (monopoi۰UR Rs).
Definition auth_monoi۰UR :=
authUR (monopoi۰UR Rs).
Definition auth_monoi۰auth dq a : auth_monoi۰UR :=
●{dq} monopoi۰principal Rs a ⋅ ◯ monopoi۰principal Rs a.
Definition auth_monoi۰lb a : auth_monoi۰UR :=
◯ monopoi۰principal Rs a.
#[global] Instance auth_monoi۰authーinj `{!AntiSymm (≡) Rs} :
Inj2 (=) (≡) (≡) auth_monoi۰auth
| 10.
#[global] Instance auth_monoi۰authーinjーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
Inj2 (=) (=) (≡) auth_monoi۰auth
| 9.
#[global] Instance auth_monoi۰lbーinj `{!AntiSymm (≡) Rs} :
Inj (≡) (≡) auth_monoi۰lb
| 10.
#[global] Instance auth_monoi۰lbーinjーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
Inj (=) (≡) auth_monoi۰lb
| 9.
#[global] Instance auth_monoiーcmra_discrete :
CmraDiscrete auth_monoi۰R.
#[global] Instance auth_monoi۰authーcore_id a :
CoreId (auth_monoi۰auth DfracDiscarded a).
#[global] Instance auth_monoi۰lbーcore_id a :
CoreId (auth_monoi۰lb a).
Lemma auth_monoi۰authーdfracーop dq1 dq2 a :
auth_monoi۰auth (dq1 ⋅ dq2) a ≡ auth_monoi۰auth dq1 a ⋅ auth_monoi۰auth dq2 a.
#[global] Instance auth_monoi۰authーdfracーis_op dq dq1 dq2 a :
IsOp dq dq1 dq2 →
IsOp' (auth_monoi۰auth dq a) (auth_monoi۰auth dq1 a) (auth_monoi۰auth dq2 a).
Lemma auth_monoi۰lbーop a a' :
Rs a a' →
auth_monoi۰lb a' ≡ auth_monoi۰lb a ⋅ auth_monoi۰lb a'.
Lemma auth_monoi۰authーlbーop dq a :
auth_monoi۰auth dq a ≡ auth_monoi۰auth dq a ⋅ auth_monoi۰lb a.
Lemma auth_monoi۰authーdfracーvalid dq a :
✓ auth_monoi۰auth dq a ↔
✓ dq.
Lemma auth_monoi۰authーvalid a :
✓ auth_monoi۰auth (DfracOwn 1) a.
Lemma auth_monoi۰authーdfracーopーvalid `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
✓ (auth_monoi۰auth dq1 a1 ⋅ auth_monoi۰auth dq2 a2) →
✓ (dq1 ⋅ dq2) ∧
a1 ≡ a2.
Lemma auth_monoi۰authーdfracーopーvalidー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ーopーvalid `{!AntiSymm (≡) Rs} a1 a2 :
✓ (auth_monoi۰auth (DfracOwn 1) a1 ⋅ auth_monoi۰auth (DfracOwn 1) a2) →
False.
Lemma auth_monoi۰authーopーvalidーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
✓ (auth_monoi۰auth (DfracOwn 1) a1 ⋅ auth_monoi۰auth (DfracOwn 1) a2) ↔
False.
Lemma auth_monoi۰lbーopーvalid a1 a2 :
✓ (auth_monoi۰lb a1 ⋅ auth_monoi۰lb a2) →
∃ a,
Rs a1 a ∧
Rs a2 a.
Lemma auth_monoiーbothーdfracーvalid dq a b :
✓ (auth_monoi۰auth dq a ⋅ auth_monoi۰lb b) ↔
✓ dq ∧
Rs b a.
Lemma auth_monoiーbothーvalid a b :
✓ (auth_monoi۰auth (DfracOwn 1) a ⋅ auth_monoi۰lb b) ↔
Rs b a.
Lemma auth_monoi۰lbーmono a1 a2 :
Rs a1 a2 →
auth_monoi۰lb a1 ≼ auth_monoi۰lb a2.
Lemma auth_monoi۰authーdfracーincluded `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
auth_monoi۰auth dq1 a1 ≼ auth_monoi۰auth dq2 a2 →
(dq1 ≼ dq2 ∨ dq1 = dq2) ∧
a1 ≡ a2.
Lemma auth_monoi۰authーdfracーincludedーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} dq1 a1 dq2 a2 :
auth_monoi۰auth dq1 a1 ≼ auth_monoi۰auth dq2 a2 ↔
(dq1 ≼ dq2 ∨ dq1 = dq2) ∧
a1 = a2.
Lemma auth_monoi۰authーincluded `{!AntiSymm (≡) Rs} a1 a2 :
auth_monoi۰auth (DfracOwn 1) a1 ≼ auth_monoi۰auth (DfracOwn 1) a2 →
a1 ≡ a2.
Lemma auth_monoi۰authーincludedーL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
auth_monoi۰auth (DfracOwn 1) a1 ≼ auth_monoi۰auth (DfracOwn 1) a2 ↔
a1 = a2.
Lemma auth_monoi۰lbーincluded a1 dq a2 :
auth_monoi۰lb a1 ≼ auth_monoi۰auth dq a2 ↔
Rs a1 a2.
Lemma auth_monoi۰lbーincluded' a dq :
auth_monoi۰lb a ≼ auth_monoi۰auth dq a.
Lemma auth_monoi۰authーpersist dq a :
auth_monoi۰auth dq a ~~> auth_monoi۰auth DfracDiscarded a.
Lemma auth_monoi۰authーupdate {a} a' :
Rs a a' →
auth_monoi۰auth (DfracOwn 1) a ~~> auth_monoi۰auth (DfracOwn 1) a'.
Lemma auth_monoi۰authーlocal_update a a' :
Rs a a' →
(auth_monoi۰auth (DfracOwn 1) a, auth_monoi۰auth (DfracOwn 1) a) ¬l~>
(auth_monoi۰auth (DfracOwn 1) a', auth_monoi۰auth (DfracOwn 1) a').
End relation.
#[global] Opaque auth_monoi۰auth.
#[global] Opaque auth_monoi۰lb.