Library zoo.iris.algebra.monopo

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

Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.options.

Definition monopo `(R : relation A) : Type :=
  list A.

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

  Implicit Type a b c : A.
  Implicit Type x y z : monopo 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 (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۰equivequiv :
    Equivalence monopo۰equiv.

  #[local] Lemma monopoequivnil 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 monopocmra_mixin :
    CmraMixin (monopo R).
  Canonical monopo۰R :=
    Cmra (monopo R) monopocmra_mixin.

  #[global] Instance monopocmra_total :
    CmraTotal monopo۰R.
  #[global] Instance monopocore_id x :
    CoreId x.

  #[global] Instance monopocmra_discrete :
    CmraDiscrete monopo۰R.

  #[local] Instance monopo۰unit : Unit (monopo R) :=
    nil.
  #[local] Lemma monopoucmra_mixin :
    UcmraMixin (monopo R).
  Canonical monopo۰UR :=
    Ucmra (monopo R) monopoucmra_mixin.

  Lemma monopoidemp x :
    x x x.

  Lemma monopoincluded x y :
    x y
    y x y.

  Definition monopo۰principal a : monopo۰UR :=
    [a].

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

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

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

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

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

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

  Lemma monopolocal_updateget_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 Type a b c : A.
  Implicit Type x y z : monopo R.

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

  Lemma monopo۰principalinjrelated a b :
    monopo۰principal R a monopo۰principal R b
    R a a
    R a b.
  Lemma monopo۰principalinjgeneral 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۰principalinj `{!AntiSymm (≡) R} :
    Inj (≡) (≡) (monopo۰principal R).
  #[global] Instance monopo۰principalinj' `{!AntiSymm (≡) R} n :
    Inj (≡{n}≡) (≡{n}≡) (monopo۰principal R).
End ofe_relation.

#[global] Opaque monopo۰principal.