Library zoo.iris.algebra.mono

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

Require Import zoo.prelude.
Require Import zoo.options.

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

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

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

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

  #[local] Lemma belowapp a x y :
    below a (x ++ y)
    below a x below a y.

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

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

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

  #[local] Instance mono۰valid : Valid (mono R) :=
    λ x,
      True.
  #[local] Instance mono۰validN : ValidN (mono R) :=
    λ n x,
      True.
  #[local] Program Instance mono۰op : Op (mono R) :=
    λ x1 x2,
      x1 ++ x2.
  #[local] Instance mono۰pcore : PCore (mono R) :=
    Some.

  #[local] Lemma monocmra_mixin :
    CmraMixin (mono R).
  Canonical mono۰R :=
    Cmra (mono R) monocmra_mixin.

  #[global] Instance monocmra_total :
    CmraTotal mono۰R.
  #[global] Instance monocore_id x :
    CoreId x.

  #[global] Instance monocmra_discrete :
    CmraDiscrete mono۰R.

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

  Lemma monoidemp x :
    x x x.

  Lemma monoincluded x y :
    x y
    y x y.

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

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

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

  Lemma mono۰principalopNR n a b x :
    R a a
    mono۰principal a x ≡{n}≡ mono۰principal b
    R a b.
  Lemma mono۰principalopR' a b x :
    R a a
    mono۰principal a x mono۰principal b
    R a b.
  Lemma mono۰principalopR `{!Reflexive R} a b x :
    mono۰principal a x mono۰principal b
    R a b.

  Lemma mono۰principalincludedN `{!Reflexive R} `{!Transitive R} n a b :
    mono۰principal a ≼{n} mono۰principal b
    R a b.
  Lemma mono۰principalincluded `{!Reflexive R} `{!Transitive R} a b :
    mono۰principal a mono۰principal b
    R a b.

  Lemma monolocal_updategrow `{!Transitive R} a x b:
    R a b
    (mono۰principal a, x) ¬l~> (mono۰principal b, mono۰principal b).

  Lemma monolocal_updateget_frag `{!Reflexive R} `{!Transitive R} a b:
    R b a
    (mono۰principal a, ε) ¬l~> (mono۰principal a, mono۰principal b).
End relation.

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

Section ofe_relation.
  Context {SI : sidx}.
  Context {A : ofe} {R : relation A}.

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

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

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

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

#[global] Opaque mono۰principal.