Library zoo.iris.base_logic.lib.auth_monoi

Require Import zoo.prelude.
Require Export zoo.common.relations.
Require Import zoo.iris.algebra.lib.auth_monoi.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.

Class AuthMonoiG Σ {A : ofe} (R : relation A) `{!Initial R} :=
  { #[local] auth_monoi۰G۰inG :: inG Σ (auth_monoi۰UR R)
  }.

Definition auth_monoi۰Σ {A : ofe} (R : relation A) `{!Initial R} :=
  #[GFunctor (auth_monoi۰UR R)
  ].
#[global] Instance subGauth_monoi۰Σ Σ {A : ofe} (R : relation A) `{!Initial R} :
  subG (auth_monoi۰Σ R) Σ
  AuthMonoiG Σ R.

Section auth_monoi۰G.
  Context {A : ofe} (R : relation A) `{!Initial R}.
  Context `{auth_monoi۰G : !AuthMonoiG Σ R}.

  Implicit Type a : A.

  Notation Rs := (
    rtc R
  ).

  Definition auth_monoi۰auth γ dq a :=
    own γ (auth_monoi۰auth R dq a).
  Definition auth_monoi۰lb γ a :=
    own γ (auth_monoi۰lb R a).

  #[global] Instance auth_monoi۰authtimeless γ dq a :
    Timeless (auth_monoi۰auth γ dq a).
  #[global] Instance auth_monoi۰lbtimeless γ a :
    Timeless (auth_monoi۰lb γ a).

  #[global] Instance auth_monoi۰authpersistent γ a :
    Persistent (auth_monoi۰auth γ DfracDiscarded a).
  #[global] Instance auth_monoi۰lbpersistent γ a :
    Persistent (auth_monoi۰lb γ a).

  #[global] Instance auth_monoi۰authfractional γ a :
    Fractional (λ q, auth_monoi۰auth γ (DfracOwn q) a).
  #[global] Instance auth_monoi۰authas_fractional γ q a :
    AsFractional (auth_monoi۰auth γ (DfracOwn q) a) (λ q, auth_monoi۰auth γ (DfracOwn q) a) q.

  Lemma auth_monoialloc a :
     |==>
       γ,
      auth_monoi۰auth γ (DfracOwn 1) a.

  Lemma auth_monoi۰authvalid γ dq a :
    auth_monoi۰auth γ dq a
     dq.
  Lemma auth_monoi۰authcombine `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
    auth_monoi۰auth γ dq1 a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
      a1 = a2
      auth_monoi۰auth γ (dq1 dq2) a1.
  Lemma auth_monoi۰authvalidー2 `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
    auth_monoi۰auth γ dq1 a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
       (dq1 dq2)
      a1 a2.
  Lemma auth_monoi۰authvalidー2ーL `{!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۰authagree `{!AntiSymm (≡) Rs} γ dq1 a1 dq2 a2 :
    auth_monoi۰auth γ dq1 a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
    a1 a2.
  Lemma auth_monoi۰authagreeL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ dq1 a1 dq2 a2 :
    auth_monoi۰auth γ dq1 a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
    a1 = a2.
  Lemma auth_monoi۰authdfracne `{!AntiSymm (≡) Rs} γ1 dq1 a1 γ2 dq2 a2 :
    ¬ (dq1 dq2)
    auth_monoi۰auth γ1 dq1 a1 -∗
    auth_monoi۰auth γ2 dq2 a2 -∗
    γ1 γ2.
  Lemma auth_monoi۰authdfracneL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 dq1 a1 γ2 dq2 a2 :
    ¬ (dq1 dq2)
    auth_monoi۰auth γ1 dq1 a1 -∗
    auth_monoi۰auth γ2 dq2 a2 -∗
    γ1 γ2.
  Lemma auth_monoi۰authne `{!AntiSymm (≡) Rs} γ1 a1 γ2 dq2 a2 :
    auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
    auth_monoi۰auth γ2 dq2 a2 -∗
    γ1 γ2.
  Lemma auth_monoi۰authneL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ1 a1 γ2 dq2 a2 :
    auth_monoi۰auth γ1 (DfracOwn 1) a1 -∗
    auth_monoi۰auth γ2 dq2 a2 -∗
    γ1 γ2.
  Lemma auth_monoi۰authexclusive `{!AntiSymm (≡) Rs} γ a1 dq2 a2 :
    auth_monoi۰auth γ (DfracOwn 1) a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
    False.
  Lemma auth_monoi۰authexclusiveL `{!LeibnizEquiv A} `{!AntiSymm (=) Rs} γ a1 dq2 a2 :
    auth_monoi۰auth γ (DfracOwn 1) a1 -∗
    auth_monoi۰auth γ dq2 a2 -∗
    False.
  Lemma auth_monoi۰authpersist γ dq a :
    auth_monoi۰auth γ dq a |==>
    auth_monoi۰auth γ DfracDiscarded a.

  Lemma auth_monoi۰lbinitial γ :
     |==>
      auth_monoi۰lb γ initial.
  Lemma auth_monoi۰lbmono {γ a} a' :
    Rs a' a
    auth_monoi۰lb γ a
    auth_monoi۰lb γ a'.
  Lemma auth_monoi۰lbmono' {γ a} a' :
    R a' a
    auth_monoi۰lb γ a
    auth_monoi۰lb γ a'.

  Lemma auth_monoi۰lbget γ q a :
    auth_monoi۰auth γ q a
    auth_monoi۰lb γ a.
  Lemma auth_monoi۰lbgetmono' γ q a a' :
    R a' a
    auth_monoi۰auth γ q a
    auth_monoi۰lb γ a'.
  Lemma auth_monoi۰lbgetmono γ q a a' :
    Rs a' a
    auth_monoi۰auth γ q a
    auth_monoi۰lb γ a'.

  Lemma auth_monoi۰lbvalid γ dq a a' :
    auth_monoi۰auth γ dq a -∗
    auth_monoi۰lb γ a' -∗
    Rs a' a.
  Lemma auth_monoi۰lbagree γ a1 a2 :
    auth_monoi۰lb γ a1 -∗
    auth_monoi۰lb γ a2 -∗
       a,
      Rs a1 a
      Rs a2 a.

  Lemma auth_monoiupdate {γ a} a' :
    Rs a a'
    auth_monoi۰auth γ (DfracOwn 1) a |==>
    auth_monoi۰auth γ (DfracOwn 1) a'.
  Lemma auth_monoiupdate' {γ a} a' :
    R a a'
    auth_monoi۰auth γ (DfracOwn 1) a |==>
    auth_monoi۰auth γ (DfracOwn 1) a'.
End auth_monoi۰G.

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