Library zoo.iris.base_logic.lib.auth_nat_max
Require Import zoo.prelude.
Require Import zoo.common.math.
Require Import zoo.iris.base_logic.lib.auth_monoi.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class AuthNatMaxG Σ :=
{ #[local] auth_nat_max۰G۰mono۰G :: AuthMonoiG Σ (≤)
}.
Definition auth_nat_max۰Σ :=
#[auth_monoi۰Σ (≤)
].
#[global] Instance subGーauth_nat_max۰Σ Σ :
subG auth_nat_max۰Σ Σ →
AuthNatMaxG Σ.
Section auth_nat_max۰G.
Context `{auth_nat_max۰G : !AuthNatMaxG Σ}.
Implicit Type n m p : nat.
Definition auth_nat_max۰auth γ dq n :=
auth_monoi۰auth (≤) γ dq n.
Definition auth_nat_max۰lb γ n :=
auth_monoi۰lb (≤) γ n.
#[global] Instance auth_nat_max۰authーtimeless γ dq n :
Timeless (auth_nat_max۰auth γ dq n).
#[global] Instance auth_nat_max۰lbーtimeless γ n :
Timeless (auth_nat_max۰lb γ n).
#[global] Instance auth_nat_max۰authーpersistent γ n :
Persistent (auth_nat_max۰auth γ DfracDiscarded n).
#[global] Instance auth_nat_max۰lbーpersistent γ n :
Persistent (auth_nat_max۰lb γ n).
#[global] Instance auth_nat_max۰authーfractional γ n :
Fractional (λ q, auth_nat_max۰auth γ (DfracOwn q) n).
#[global] Instance auth_nat_max۰authーas_fractional γ q n :
AsFractional (auth_nat_max۰auth γ (DfracOwn q) n) (λ q, auth_nat_max۰auth γ (DfracOwn q) n) q.
Lemma auth_nat_maxーalloc n :
⊢ |==>
∃ γ,
auth_nat_max۰auth γ (DfracOwn 1) n.
Lemma auth_nat_max۰authーvalid γ dq a :
auth_nat_max۰auth γ dq a ⊢
⌜✓ dq⌝.
Lemma auth_nat_max۰authーcombine γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜n1 = n2⌝ ∗
auth_nat_max۰auth γ (dq1 ⋅ dq2) n1.
Lemma auth_nat_max۰authーvalidー2 γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜n1 = n2⌝.
Lemma auth_nat_max۰authーagree γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜n1 = n2⌝.
Lemma auth_nat_max۰authーdfracーne γ1 dq1 n1 γ2 dq2 n2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_nat_max۰auth γ1 dq1 n1 -∗
auth_nat_max۰auth γ2 dq2 n2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_nat_max۰authーne γ1 n1 γ2 dq2 n2 :
auth_nat_max۰auth γ1 (DfracOwn 1) n1 -∗
auth_nat_max۰auth γ2 dq2 n2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_nat_max۰authーexclusive γ n1 dq2 n2 :
auth_nat_max۰auth γ (DfracOwn 1) n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
False.
Lemma auth_nat_max۰authーpersist γ dq n :
auth_nat_max۰auth γ dq n ⊢ |==>
auth_nat_max۰auth γ DfracDiscarded n.
Lemma auth_nat_max۰lbー0 γ :
⊢ |==>
auth_nat_max۰lb γ 0.
Lemma auth_nat_max۰lbーget γ q n :
auth_nat_max۰auth γ q n ⊢
auth_nat_max۰lb γ n.
Lemma auth_nat_max۰lbーle {γ n} n' :
n' ≤ n →
auth_nat_max۰lb γ n ⊢
auth_nat_max۰lb γ n'.
Lemma auth_nat_max۰lbーmax γ n1 n2 :
auth_nat_max۰lb γ n1 -∗
auth_nat_max۰lb γ n2 -∗
auth_nat_max۰lb γ (n1 `max` n2).
Lemma auth_nat_max۰lbーvalid γ dq n m :
auth_nat_max۰auth γ dq n -∗
auth_nat_max۰lb γ m -∗
⌜m ≤ n⌝.
Lemma auth_nat_maxーupdate {γ n} n' :
n ≤ n' →
auth_nat_max۰auth γ (DfracOwn 1) n ⊢ |==>
auth_nat_max۰auth γ (DfracOwn 1) n'.
End auth_nat_max۰G.
#[global] Opaque auth_nat_max۰auth.
#[global] Opaque auth_nat_max۰lb.
Require Import zoo.common.math.
Require Import zoo.iris.base_logic.lib.auth_monoi.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.
Class AuthNatMaxG Σ :=
{ #[local] auth_nat_max۰G۰mono۰G :: AuthMonoiG Σ (≤)
}.
Definition auth_nat_max۰Σ :=
#[auth_monoi۰Σ (≤)
].
#[global] Instance subGーauth_nat_max۰Σ Σ :
subG auth_nat_max۰Σ Σ →
AuthNatMaxG Σ.
Section auth_nat_max۰G.
Context `{auth_nat_max۰G : !AuthNatMaxG Σ}.
Implicit Type n m p : nat.
Definition auth_nat_max۰auth γ dq n :=
auth_monoi۰auth (≤) γ dq n.
Definition auth_nat_max۰lb γ n :=
auth_monoi۰lb (≤) γ n.
#[global] Instance auth_nat_max۰authーtimeless γ dq n :
Timeless (auth_nat_max۰auth γ dq n).
#[global] Instance auth_nat_max۰lbーtimeless γ n :
Timeless (auth_nat_max۰lb γ n).
#[global] Instance auth_nat_max۰authーpersistent γ n :
Persistent (auth_nat_max۰auth γ DfracDiscarded n).
#[global] Instance auth_nat_max۰lbーpersistent γ n :
Persistent (auth_nat_max۰lb γ n).
#[global] Instance auth_nat_max۰authーfractional γ n :
Fractional (λ q, auth_nat_max۰auth γ (DfracOwn q) n).
#[global] Instance auth_nat_max۰authーas_fractional γ q n :
AsFractional (auth_nat_max۰auth γ (DfracOwn q) n) (λ q, auth_nat_max۰auth γ (DfracOwn q) n) q.
Lemma auth_nat_maxーalloc n :
⊢ |==>
∃ γ,
auth_nat_max۰auth γ (DfracOwn 1) n.
Lemma auth_nat_max۰authーvalid γ dq a :
auth_nat_max۰auth γ dq a ⊢
⌜✓ dq⌝.
Lemma auth_nat_max۰authーcombine γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜n1 = n2⌝ ∗
auth_nat_max۰auth γ (dq1 ⋅ dq2) n1.
Lemma auth_nat_max۰authーvalidー2 γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜n1 = n2⌝.
Lemma auth_nat_max۰authーagree γ dq1 n1 dq2 n2 :
auth_nat_max۰auth γ dq1 n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
⌜n1 = n2⌝.
Lemma auth_nat_max۰authーdfracーne γ1 dq1 n1 γ2 dq2 n2 :
¬ ✓ (dq1 ⋅ dq2) →
auth_nat_max۰auth γ1 dq1 n1 -∗
auth_nat_max۰auth γ2 dq2 n2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_nat_max۰authーne γ1 n1 γ2 dq2 n2 :
auth_nat_max۰auth γ1 (DfracOwn 1) n1 -∗
auth_nat_max۰auth γ2 dq2 n2 -∗
⌜γ1 ≠ γ2⌝.
Lemma auth_nat_max۰authーexclusive γ n1 dq2 n2 :
auth_nat_max۰auth γ (DfracOwn 1) n1 -∗
auth_nat_max۰auth γ dq2 n2 -∗
False.
Lemma auth_nat_max۰authーpersist γ dq n :
auth_nat_max۰auth γ dq n ⊢ |==>
auth_nat_max۰auth γ DfracDiscarded n.
Lemma auth_nat_max۰lbー0 γ :
⊢ |==>
auth_nat_max۰lb γ 0.
Lemma auth_nat_max۰lbーget γ q n :
auth_nat_max۰auth γ q n ⊢
auth_nat_max۰lb γ n.
Lemma auth_nat_max۰lbーle {γ n} n' :
n' ≤ n →
auth_nat_max۰lb γ n ⊢
auth_nat_max۰lb γ n'.
Lemma auth_nat_max۰lbーmax γ n1 n2 :
auth_nat_max۰lb γ n1 -∗
auth_nat_max۰lb γ n2 -∗
auth_nat_max۰lb γ (n1 `max` n2).
Lemma auth_nat_max۰lbーvalid γ dq n m :
auth_nat_max۰auth γ dq n -∗
auth_nat_max۰lb γ m -∗
⌜m ≤ n⌝.
Lemma auth_nat_maxーupdate {γ n} n' :
n ≤ n' →
auth_nat_max۰auth γ (DfracOwn 1) n ⊢ |==>
auth_nat_max۰auth γ (DfracOwn 1) n'.
End auth_nat_max۰G.
#[global] Opaque auth_nat_max۰auth.
#[global] Opaque auth_nat_max۰lb.