Library zoo.iris.algebra.monopoi

Require Export iris.algebra.cmra.
Require Import iris.algebra.local_updates.

Require Import zoo.prelude.
Require Import zoo.common.listne.
Require Export zoo.common.relations.
Require Import zoo.options.

Definition monopoi `(R : relation A) : Type :=
  listne A.

Section relation.
  Context {SI : sidx}.
  Context `{R : relation A}.
  Context `{!Reflexive R} `{!Transitive R}.
  Context `{!Initial R}.

  Implicit Type a b c : A.
  Implicit Type x y z : monopoi R.

  #[local] Definition below a x :=
     b,
    b x
    R a b.

  #[local] Lemma belowelem_of a x :
    a x
    below a x.
  #[local] Lemma belowapp a x y :
    below a (listne۰app x y)
    below a x below a y.

  #[local] Instance monopoi۰equiv : Equiv (monopoi R) :=
    λ x y,
       a,
      below a x
      below a y.

  #[local] Instance monopoi۰equivequiv :
    Equivalence monopoi۰equiv.

  Canonical monopoi۰O :=
    discreteO (monopoi R).

  #[local] Instance monopoi۰valid : Valid (monopoi R) :=
    λ x,
       a,
      listne۰Forall (flip R a) x.
  #[local] Instance monopoi۰validN : ValidN (monopoi R) :=
    λ _,
      valid.
  #[local] Instance monopoi۰op : Op (monopoi R) :=
    λ x1 x2,
      listne۰app x1 x2.
  #[local] Instance monopoi۰pcore : PCore (monopoi R) :=
    Some.

  #[local] Lemma monopoicmra_mixin :
    CmraMixin (monopoi R).
  Canonical monopoi۰R :=
    Cmra (monopoi R) monopoicmra_mixin.

  #[global] Instance monopoicmra_total :
    CmraTotal monopoi۰R.
  #[global] Instance monopoicore_id x :
    CoreId x.

  #[global] Instance monopoicmra_discrete :
    CmraDiscrete monopoi۰R.

  #[local] Program Definition principal a : monopoi R :=
    [a].

  #[local] Instance monopoi۰unit : Unit (monopoi R) :=
    principal initial.
  #[local] Lemma monopoiucmra_mixin :
    UcmraMixin (monopoi R).
  Canonical monopoi۰UR :=
    Ucmra (monopoi R) monopoiucmra_mixin.

  Lemma monopoiidemp x :
    x x x.

  Lemma monopoiincluded x y :
    x y
    y x y.

  Definition monopoi۰principal : A monopoi۰UR :=
    principal.

  #[local] Lemma belowprincipal a b :
    below a (monopoi۰principal b)
    R a b.

  Lemma monopoi۰principalRopNbase n x y :
    ( b,
      b y
         c,
        c x
        R b c
    )
    y x ≡{n}≡ x.
  Lemma monopoi۰principalRopN n a b :
    R a b
    monopoi۰principal a monopoi۰principal b ≡{n}≡ monopoi۰principal b.
  Lemma monopoi۰principalRop a b :
    R a b
    monopoi۰principal a monopoi۰principal b monopoi۰principal b.

  Lemma monopoi۰principalopNR n a b x :
    R a a
    monopoi۰principal a x ≡{n}≡ monopoi۰principal b
    R a b.
  Lemma monopoi۰principalopR' a b x :
    R a a
    monopoi۰principal a x monopoi۰principal b
    R a b.
  Lemma monopoi۰principalopR a b x :
    monopoi۰principal a x monopoi۰principal b
    R a b.

  Lemma monopoi۰principalvalid a :
     monopoi۰principal a.
  Lemma monopoi۰principalopvalid a1 a2 :
     (monopoi۰principal a1 monopoi۰principal a2)
       a,
      R a1 a
      R a2 a.

  Lemma monopoi۰principalincludedN n a b :
    monopoi۰principal a ≼{n} monopoi۰principal b
    R a b.
  Lemma monopoi۰principalincluded a b :
    monopoi۰principal a monopoi۰principal b
    R a b.

  Lemma monopoilocal_updategrow a x b:
    R a b
    (monopoi۰principal a, x) ¬l~> (monopoi۰principal b, monopoi۰principal b).

  Lemma monopoilocal_updateget_frag a b:
    R b a
    (monopoi۰principal a, ε) ¬l~> (monopoi۰principal a, monopoi۰principal b).
End relation.

#[global] Arguments monopoi۰R {_ _} _ {_ _ _} : assert.
#[global] Arguments monopoi۰UR {_ _} _ {_ _ _} : assert.
#[global] Arguments monopoi۰principal {_ _} _ {_ _ _} _ : assert.

Section ofe_relation.
  Context {SI : sidx}.
  Context {A : ofe} {R : relation A}.
  Context `{!Reflexive R} `{!Transitive R}.
  Context `{!Initial R}.

  Implicit Type a b c : A.
  Implicit Type x y z : monopoi R.

  #[global] Instance monopoi۰principalne :
    ( n, Proper ((≡{n}≡) ==> (≡{n}≡) ==> (↔)) R)
    NonExpansive (monopoi۰principal R).
  #[global] Instance monopoi۰principalproper :
    Proper ((≡) ==> (≡) ==> (↔)) R
    Proper ((≡) ==> (≡)) (monopoi۰principal R).

  Lemma monopoi۰principalinjrelated a b :
    monopoi۰principal R a monopoi۰principal R b
    R a a
    R a b.
  Lemma monopoi۰principalinjgeneral a b :
    monopoi۰principal R a monopoi۰principal R b
    R a a
    R b b
    (R a b R b a a b)
    a b.

  #[global] Instance monopoi۰principalinj `{!AntiSymm (≡) R} :
    Inj (≡) (≡) (monopoi۰principal R).
  #[global] Instance monopoi۰principalinj' `{!AntiSymm (≡) R} n :
    Inj (≡{n}≡) (≡{n}≡) (monopoi۰principal R).
End ofe_relation.

#[global] Opaque monopoi۰principal.