Library zoo.iris.algebra.lib.auth_mono

Require Import iris.algebra.proofmode_classes.

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

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

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

  Implicit Type a b : A.

  Notation Rs := (
    rtc R
  ).

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

  Definition auth_mono :=
    auth (monopo Rs).
  Definition auth_mono۰R :=
    authR (monopo۰UR Rs).
  Definition auth_mono۰UR :=
    authUR (monopo۰UR Rs).

  Definition auth_mono۰auth dq a : auth_mono۰UR :=
    {dq} monopo۰principal Rs a monopo۰principal Rs a.
  Definition auth_mono۰lb a : auth_mono۰UR :=
     monopo۰principal Rs a.

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

  #[global] Instance auth_monocmra_discrete :
    CmraDiscrete auth_mono۰R.

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

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

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

  Lemma auth_monoauthlbop dq a :
    auth_mono۰auth dq a auth_mono۰auth dq a auth_mono۰lb a.

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

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

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

  Lemma auth_monobothdfracvalid dq a b :
     (auth_mono۰auth dq a auth_mono۰lb b)
       dq
      Rs b a.
  Lemma auth_monobothvalid a b :
     (auth_mono۰auth (DfracOwn 1) a auth_mono۰lb b)
    Rs b a.

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

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

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

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

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

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