Library zoo.iris.algebra.lib.auth_monoi

Require Import iris.algebra.proofmode_classes.

Require Import zoo.prelude.
Require Export zoo.common.relations.
Require Export zoo.iris.algebra.base.
Require Import zoo.iris.algebra.auth.
Require Import zoo.iris.algebra.monopoi.
Require Import zoo.options.

#[local] Hint Resolve monopoi۰principalvalid : core.

Section relation.
  Context {SI : sidx}.
  Context {A : ofe} (R : relation A).
  Context `{!Initial R}.

  Implicit Type a b : A.

  Notation Rs := (
    rtc R
  ).

  #[local] Instance Rsantisymm `{!AntiSymm (=) Rs} :
    AntiSymm (≡) Rs.

  Definition auth_monoi :=
    auth (monopoi Rs).
  Definition auth_monoi۰R :=
    authR (monopoi۰UR Rs).
  Definition auth_monoi۰UR :=
    authUR (monopoi۰UR Rs).

  Definition auth_monoi۰auth dq a : auth_monoi۰UR :=
    {dq} monopoi۰principal Rs a monopoi۰principal Rs a.
  Definition auth_monoi۰lb a : auth_monoi۰UR :=
     monopoi۰principal Rs a.

  #[global] Instance auth_monoi۰authinj `{!AntiSymm (≡) Rs} :
    Inj2 (=) (≡) (≡) auth_monoi۰auth
  | 10.
  #[global] Instance auth_monoi۰authinjL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
    Inj2 (=) (=) (≡) auth_monoi۰auth
  | 9.
  #[global] Instance auth_monoi۰lbinj `{!AntiSymm (≡) Rs} :
    Inj (≡) (≡) auth_monoi۰lb
  | 10.
  #[global] Instance auth_monoi۰lbinjL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} :
    Inj (=) (≡) auth_monoi۰lb
  | 9.

  #[global] Instance auth_monoicmra_discrete :
    CmraDiscrete auth_monoi۰R.

  #[global] Instance auth_monoi۰authcore_id a :
    CoreId (auth_monoi۰auth DfracDiscarded a).
  #[global] Instance auth_monoi۰lbcore_id a :
    CoreId (auth_monoi۰lb a).

  Lemma auth_monoi۰authdfracop dq1 dq2 a :
    auth_monoi۰auth (dq1 dq2) a auth_monoi۰auth dq1 a auth_monoi۰auth dq2 a.
  #[global] Instance auth_monoi۰authdfracis_op dq dq1 dq2 a :
    IsOp dq dq1 dq2
    IsOp' (auth_monoi۰auth dq a) (auth_monoi۰auth dq1 a) (auth_monoi۰auth dq2 a).

  Lemma auth_monoi۰lbop a a' :
    Rs a a'
    auth_monoi۰lb a' auth_monoi۰lb a auth_monoi۰lb a'.

  Lemma auth_monoi۰authlbop dq a :
    auth_monoi۰auth dq a auth_monoi۰auth dq a auth_monoi۰lb a.

  Lemma auth_monoi۰authdfracvalid dq a :
     auth_monoi۰auth dq a
     dq.
  Lemma auth_monoi۰authvalid a :
     auth_monoi۰auth (DfracOwn 1) a.

  Lemma auth_monoi۰authdfracopvalid `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
     (auth_monoi۰auth dq1 a1 auth_monoi۰auth dq2 a2)
       (dq1 dq2)
      a1 a2.
  Lemma auth_monoi۰authdfracopvalidL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} dq1 a1 dq2 a2 :
     (auth_monoi۰auth dq1 a1 auth_monoi۰auth dq2 a2)
       (dq1 dq2)
      a1 = a2.
  Lemma auth_monoi۰authopvalid `{!AntiSymm (≡) Rs} a1 a2 :
     (auth_monoi۰auth (DfracOwn 1) a1 auth_monoi۰auth (DfracOwn 1) a2)
    False.
  Lemma auth_monoi۰authopvalidL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
     (auth_monoi۰auth (DfracOwn 1) a1 auth_monoi۰auth (DfracOwn 1) a2)
    False.

  Lemma auth_monoi۰lbopvalid a1 a2 :
     (auth_monoi۰lb a1 auth_monoi۰lb a2)
       a,
      Rs a1 a
      Rs a2 a.

  Lemma auth_monoibothdfracvalid dq a b :
     (auth_monoi۰auth dq a auth_monoi۰lb b)
       dq
      Rs b a.
  Lemma auth_monoibothvalid a b :
     (auth_monoi۰auth (DfracOwn 1) a auth_monoi۰lb b)
    Rs b a.

  Lemma auth_monoi۰lbmono a1 a2 :
    Rs a1 a2
    auth_monoi۰lb a1 auth_monoi۰lb a2.

  Lemma auth_monoi۰authdfracincluded `{!AntiSymm (≡) Rs} dq1 a1 dq2 a2 :
    auth_monoi۰auth dq1 a1 auth_monoi۰auth dq2 a2
      (dq1 dq2 dq1 = dq2)
      a1 a2.
  Lemma auth_monoi۰authdfracincludedL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} dq1 a1 dq2 a2 :
    auth_monoi۰auth dq1 a1 auth_monoi۰auth dq2 a2
      (dq1 dq2 dq1 = dq2)
      a1 = a2.
  Lemma auth_monoi۰authincluded `{!AntiSymm (≡) Rs} a1 a2 :
    auth_monoi۰auth (DfracOwn 1) a1 auth_monoi۰auth (DfracOwn 1) a2
    a1 a2.
  Lemma auth_monoi۰authincludedL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} a1 a2 :
    auth_monoi۰auth (DfracOwn 1) a1 auth_monoi۰auth (DfracOwn 1) a2
    a1 = a2.

  Lemma auth_monoi۰lbincluded a1 dq a2 :
    auth_monoi۰lb a1 auth_monoi۰auth dq a2
    Rs a1 a2.
  Lemma auth_monoi۰lbincluded' a dq :
    auth_monoi۰lb a auth_monoi۰auth dq a.

  Lemma auth_monoi۰authpersist dq a :
    auth_monoi۰auth dq a ~~> auth_monoi۰auth DfracDiscarded a.
  Lemma auth_monoi۰authupdate {a} a' :
    Rs a a'
    auth_monoi۰auth (DfracOwn 1) a ~~> auth_monoi۰auth (DfracOwn 1) a'.

  Lemma auth_monoi۰authlocal_update a a' :
    Rs a a'
    (auth_monoi۰auth (DfracOwn 1) a, auth_monoi۰auth (DfracOwn 1) a) ¬l~>
    (auth_monoi۰auth (DfracOwn 1) a', auth_monoi۰auth (DfracOwn 1) a').
End relation.

#[global] Opaque auth_monoi۰auth.
#[global] Opaque auth_monoi۰lb.