Library zoo.iris.algebra.monopo
From iris.algebra Require Export
cmra.
From iris.algebra Require Import
local_updates.
From zoo Require Import
prelude.
From zoo.common Require Import
list.
From zoo Require Import
options.
Definition monopo `(R : relation A) : Type :=
list A.
Section relation.
Context {SI : sidx}.
Context `{R : relation A}.
Context `{!Reflexive R} `{!Transitive R}.
Implicit Types a b c : A.
Implicit Types x y z : monopo R.
#[local] Definition below a x :=
∃ b,
b ∈ x ∧
R a b.
#[local] Lemma below_elem_of a x :
a ∈ x →
below a x.
#[local] Lemma below_app a x y :
below a (x ++ y) ↔
below a x ∨ below a y.
#[local] Instance monopo_equiv : Equiv (monopo R) :=
λ x y,
∀ a,
below a x ↔
below a y.
#[local] Instance monopo_equiv_equiv :
Equivalence monopo_equiv.
#[local] Lemma monopo_equiv_nil x :
x ≡ [] →
x = [].
Canonical monopo_O :=
discreteO (monopo R).
#[local] Instance monopo_valid : Valid (monopo R) :=
λ x,
x ≠ [] →
∃ a,
Forall (flip R a) x.
#[local] Instance monopo_validN : ValidN (monopo R) :=
λ _,
valid.
#[local] Program Instance monopo_op : Op (monopo R) :=
λ x1 x2,
x1 ++ x2.
#[local] Instance monopo_pcore : PCore (monopo R) :=
Some.
#[local] Lemma monopo_cmra_mixin :
CmraMixin (monopo R).
Canonical monopo_R :=
Cmra (monopo R) monopo_cmra_mixin.
#[global] Instance monopo_cmra_total :
CmraTotal monopo_R.
#[global] Instance monopo_core_id x :
CoreId x.
#[global] Instance monopo_cmra_discrete :
CmraDiscrete monopo_R.
#[local] Instance monopo_unit : Unit (monopo R) :=
nil.
#[local] Lemma monopo_ucmra_mixin :
UcmraMixin (monopo R).
Canonical monopo_UR :=
Ucmra (monopo R) monopo_ucmra_mixin.
Lemma monopo_idemp x :
x ⋅ x ≡ x.
Lemma monopo_included x y :
x ≼ y ↔
y ≡ x ⋅ y.
Definition monopo_principal a : monopo_UR :=
[a].
#[local] Lemma below_principal a b :
below a (monopo_principal b) ↔
R a b.
Lemma monopo_principal_R_opN_base n x y :
( ∀ b,
b ∈ y →
∃ c,
c ∈ x ∧
R b c
) →
y ⋅ x ≡{n}≡ x.
Lemma monopo_principal_R_opN n a b :
R a b →
monopo_principal a ⋅ monopo_principal b ≡{n}≡ monopo_principal b.
Lemma monopo_principal_R_op a b :
R a b →
monopo_principal a ⋅ monopo_principal b ≡ monopo_principal b.
Lemma monopo_principal_opN_R n a b x :
R a a →
monopo_principal a ⋅ x ≡{n}≡ monopo_principal b →
R a b.
Lemma monopo_principal_op_R' a b x :
R a a →
monopo_principal a ⋅ x ≡ monopo_principal b →
R a b.
Lemma monopo_principal_op_R a b x :
monopo_principal a ⋅ x ≡ monopo_principal b →
R a b.
Lemma monopo_principal_valid a :
✓ monopo_principal a.
Lemma monopo_principal_op_valid a1 a2 :
✓ (monopo_principal a1 ⋅ monopo_principal a2) →
∃ a,
R a1 a ∧
R a2 a.
Lemma monopo_principal_includedN n a b :
monopo_principal a ≼{n} monopo_principal b ↔
R a b.
Lemma monopo_principal_included a b :
monopo_principal a ≼ monopo_principal b ↔
R a b.
Lemma monopo_local_update_grow a x b:
R a b →
(monopo_principal a, x) ¬l~> (monopo_principal b, monopo_principal b).
Lemma monopo_local_update_get_frag a b:
R b a →
(monopo_principal a, ε) ¬l~> (monopo_principal a, monopo_principal b).
End relation.
#[global] Arguments monopo_R {_ _} _ {_ _} : assert.
#[global] Arguments monopo_UR {_ _} _ {_ _} : assert.
#[global] Arguments monopo_principal {_ _} _ {_ _} _ : assert.
Section ofe_relation.
Context {SI : sidx}.
Context {A : ofe} {R : relation A}.
Context `{!Reflexive R} `{!Transitive R}.
Implicit Types a b c : A.
Implicit Types x y z : monopo R.
#[global] Instance monopo_principal_ne :
(∀ n, Proper ((≡{n}≡) ==> (≡{n}≡) ==> (↔)) R) →
NonExpansive (monopo_principal R).
#[global] Instance monopo_principal_proper :
Proper ((≡) ==> (≡) ==> (↔)) R →
Proper ((≡) ==> (≡)) (monopo_principal R).
Lemma monopo_principal_inj_related a b :
monopo_principal R a ≡ monopo_principal R b →
R a a →
R a b.
Lemma monopo_principal_inj_general a b :
monopo_principal R a ≡ monopo_principal R b →
R a a →
R b b →
(R a b → R b a → a ≡ b) →
a ≡ b.
#[global] Instance monopo_principal_inj `{!AntiSymm (≡) R} :
Inj (≡) (≡) (monopo_principal R).
#[global] Instance monopo_principal_inj' `{!AntiSymm (≡) R} n :
Inj (≡{n}≡) (≡{n}≡) (monopo_principal R).
End ofe_relation.
#[global] Opaque monopo_principal.
cmra.
From iris.algebra Require Import
local_updates.
From zoo Require Import
prelude.
From zoo.common Require Import
list.
From zoo Require Import
options.
Definition monopo `(R : relation A) : Type :=
list A.
Section relation.
Context {SI : sidx}.
Context `{R : relation A}.
Context `{!Reflexive R} `{!Transitive R}.
Implicit Types a b c : A.
Implicit Types x y z : monopo R.
#[local] Definition below a x :=
∃ b,
b ∈ x ∧
R a b.
#[local] Lemma below_elem_of a x :
a ∈ x →
below a x.
#[local] Lemma below_app a x y :
below a (x ++ y) ↔
below a x ∨ below a y.
#[local] Instance monopo_equiv : Equiv (monopo R) :=
λ x y,
∀ a,
below a x ↔
below a y.
#[local] Instance monopo_equiv_equiv :
Equivalence monopo_equiv.
#[local] Lemma monopo_equiv_nil x :
x ≡ [] →
x = [].
Canonical monopo_O :=
discreteO (monopo R).
#[local] Instance monopo_valid : Valid (monopo R) :=
λ x,
x ≠ [] →
∃ a,
Forall (flip R a) x.
#[local] Instance monopo_validN : ValidN (monopo R) :=
λ _,
valid.
#[local] Program Instance monopo_op : Op (monopo R) :=
λ x1 x2,
x1 ++ x2.
#[local] Instance monopo_pcore : PCore (monopo R) :=
Some.
#[local] Lemma monopo_cmra_mixin :
CmraMixin (monopo R).
Canonical monopo_R :=
Cmra (monopo R) monopo_cmra_mixin.
#[global] Instance monopo_cmra_total :
CmraTotal monopo_R.
#[global] Instance monopo_core_id x :
CoreId x.
#[global] Instance monopo_cmra_discrete :
CmraDiscrete monopo_R.
#[local] Instance monopo_unit : Unit (monopo R) :=
nil.
#[local] Lemma monopo_ucmra_mixin :
UcmraMixin (monopo R).
Canonical monopo_UR :=
Ucmra (monopo R) monopo_ucmra_mixin.
Lemma monopo_idemp x :
x ⋅ x ≡ x.
Lemma monopo_included x y :
x ≼ y ↔
y ≡ x ⋅ y.
Definition monopo_principal a : monopo_UR :=
[a].
#[local] Lemma below_principal a b :
below a (monopo_principal b) ↔
R a b.
Lemma monopo_principal_R_opN_base n x y :
( ∀ b,
b ∈ y →
∃ c,
c ∈ x ∧
R b c
) →
y ⋅ x ≡{n}≡ x.
Lemma monopo_principal_R_opN n a b :
R a b →
monopo_principal a ⋅ monopo_principal b ≡{n}≡ monopo_principal b.
Lemma monopo_principal_R_op a b :
R a b →
monopo_principal a ⋅ monopo_principal b ≡ monopo_principal b.
Lemma monopo_principal_opN_R n a b x :
R a a →
monopo_principal a ⋅ x ≡{n}≡ monopo_principal b →
R a b.
Lemma monopo_principal_op_R' a b x :
R a a →
monopo_principal a ⋅ x ≡ monopo_principal b →
R a b.
Lemma monopo_principal_op_R a b x :
monopo_principal a ⋅ x ≡ monopo_principal b →
R a b.
Lemma monopo_principal_valid a :
✓ monopo_principal a.
Lemma monopo_principal_op_valid a1 a2 :
✓ (monopo_principal a1 ⋅ monopo_principal a2) →
∃ a,
R a1 a ∧
R a2 a.
Lemma monopo_principal_includedN n a b :
monopo_principal a ≼{n} monopo_principal b ↔
R a b.
Lemma monopo_principal_included a b :
monopo_principal a ≼ monopo_principal b ↔
R a b.
Lemma monopo_local_update_grow a x b:
R a b →
(monopo_principal a, x) ¬l~> (monopo_principal b, monopo_principal b).
Lemma monopo_local_update_get_frag a b:
R b a →
(monopo_principal a, ε) ¬l~> (monopo_principal a, monopo_principal b).
End relation.
#[global] Arguments monopo_R {_ _} _ {_ _} : assert.
#[global] Arguments monopo_UR {_ _} _ {_ _} : assert.
#[global] Arguments monopo_principal {_ _} _ {_ _} _ : assert.
Section ofe_relation.
Context {SI : sidx}.
Context {A : ofe} {R : relation A}.
Context `{!Reflexive R} `{!Transitive R}.
Implicit Types a b c : A.
Implicit Types x y z : monopo R.
#[global] Instance monopo_principal_ne :
(∀ n, Proper ((≡{n}≡) ==> (≡{n}≡) ==> (↔)) R) →
NonExpansive (monopo_principal R).
#[global] Instance monopo_principal_proper :
Proper ((≡) ==> (≡) ==> (↔)) R →
Proper ((≡) ==> (≡)) (monopo_principal R).
Lemma monopo_principal_inj_related a b :
monopo_principal R a ≡ monopo_principal R b →
R a a →
R a b.
Lemma monopo_principal_inj_general a b :
monopo_principal R a ≡ monopo_principal R b →
R a a →
R b b →
(R a b → R b a → a ≡ b) →
a ≡ b.
#[global] Instance monopo_principal_inj `{!AntiSymm (≡) R} :
Inj (≡) (≡) (monopo_principal R).
#[global] Instance monopo_principal_inj' `{!AntiSymm (≡) R} n :
Inj (≡{n}≡) (≡{n}≡) (monopo_principal R).
End ofe_relation.
#[global] Opaque monopo_principal.