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