Library zoo.iris.base_logic.lib.auth_nat_min

Require Import zoo.prelude.
Require Import zoo.common.math.
Require Import zoo.common.relations.
Require Import zoo.iris.base_logic.lib.auth_mono.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.

Class AuthNatMinG Σ :=
  { #[local] auth_nat_min۰G۰mono۰G :: AuthMonoG Σ ge
  }.

Definition auth_nat_min۰Σ :=
  #[auth_mono۰Σ ge
  ].
#[global] Instance subGauth_nat_min۰Σ Σ :
  subG auth_nat_min۰Σ Σ
  AuthNatMinG Σ.

Section auth_nat_min۰G.
  Context `{auth_nat_min۰G : !AuthNatMinG Σ}.

  Implicit Type n m p : nat.

  Definition auth_nat_min۰auth γ dq n :=
    auth_mono۰auth ge γ dq n.
  Definition auth_nat_min۰ub γ n :=
    auth_mono۰lb ge γ n.

  #[global] Instance auth_nat_min۰authtimeless γ dq n :
    Timeless (auth_nat_min۰auth γ dq n).
  #[global] Instance auth_nat_min۰ubtimeless γ n :
    Timeless (auth_nat_min۰ub γ n).

  #[global] Instance auth_nat_min۰authpersistent γ n :
    Persistent (auth_nat_min۰auth γ DfracDiscarded n).
  #[global] Instance auth_nat_min۰ubpersistent γ n :
    Persistent (auth_nat_min۰ub γ n).

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

  Lemma auth_nat_minalloc n :
     |==>
       γ,
      auth_nat_min۰auth γ (DfracOwn 1) n.

  Lemma auth_nat_min۰authvalid γ dq a :
    auth_nat_min۰auth γ dq a
     dq.
  Lemma auth_nat_min۰authcombine γ dq1 n1 dq2 n2 :
    auth_nat_min۰auth γ dq1 n1 -∗
    auth_nat_min۰auth γ dq2 n2 -∗
      n1 = n2
      auth_nat_min۰auth γ (dq1 dq2) n1.
  Lemma auth_nat_min۰authvalidー2 γ dq1 n1 dq2 n2 :
    auth_nat_min۰auth γ dq1 n1 -∗
    auth_nat_min۰auth γ dq2 n2 -∗
       (dq1 dq2)
      n1 = n2.
  Lemma auth_nat_min۰authagree γ dq1 n1 dq2 n2 :
    auth_nat_min۰auth γ dq1 n1 -∗
    auth_nat_min۰auth γ dq2 n2 -∗
    n1 = n2.
  Lemma auth_nat_min۰authdfracne γ1 dq1 n1 γ2 dq2 n2 :
    ¬ (dq1 dq2)
    auth_nat_min۰auth γ1 dq1 n1 -∗
    auth_nat_min۰auth γ2 dq2 n2 -∗
    γ1 γ2.
  Lemma auth_nat_min۰authne γ1 n1 γ2 dq2 n2 :
    auth_nat_min۰auth γ1 (DfracOwn 1) n1 -∗
    auth_nat_min۰auth γ2 dq2 n2 -∗
    γ1 γ2.
  Lemma auth_nat_min۰authexclusive γ n1 dq2 n2 :
    auth_nat_min۰auth γ (DfracOwn 1) n1 -∗
    auth_nat_min۰auth γ dq2 n2 -∗
    False.
  Lemma auth_nat_min۰authpersist γ dq n :
    auth_nat_min۰auth γ dq n |==>
    auth_nat_min۰auth γ DfracDiscarded n.

  Lemma auth_nat_min۰ubget γ q n :
    auth_nat_min۰auth γ q n
    auth_nat_min۰ub γ n.
  Lemma auth_nat_min۰uble {γ n} n' :
    n n'
    auth_nat_min۰ub γ n
    auth_nat_min۰ub γ n'.

  Lemma auth_nat_min۰ubvalid γ dq n m :
    auth_nat_min۰auth γ dq n -∗
    auth_nat_min۰ub γ m -∗
    n m.

  Lemma auth_nat_minupdate {γ n} n' :
    n' n
    auth_nat_min۰auth γ (DfracOwn 1) n |==>
    auth_nat_min۰auth γ (DfracOwn 1) n'.
End auth_nat_min۰G.

#[global] Opaque auth_nat_min۰auth.
#[global] Opaque auth_nat_min۰ub.