Library zoo.iris.base_logic.lib.mono_gset

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

Class MonoGsetG Σ A `{Countable A} :=
  { #[local] mono_gset۰G۰mono۰G :: AuthMonoG Σ (A := leibnizO (gset A)) subseteq
  }.

Definition mono_gset۰Σ A `{Countable A} :=
  #[auth_mono۰Σ (A := leibnizO (gset A)) subseteq
  ].
#[global] Instance subGmono_gset۰Σ Σ V `{Countable V} :
  subG (mono_gset۰Σ V) Σ
  MonoGsetG Σ V.

Section mono_gset۰G.
  Context `{mono_gset۰G : MonoGsetG Σ A}.

  Implicit Type a : A.
  Implicit Type s : gset A.

  Definition mono_gset۰auth γ dq s :=
    auth_mono۰auth subseteq γ dq s.
  Definition mono_gset۰lb γ s :=
    auth_mono۰lb subseteq γ s.
  Definition mono_gset۰elem γ a :=
    mono_gset۰lb γ {[a]}.

  #[global] Instance mono_gset۰authproper γ dq :
    Proper ((≡) ==> (≡)) (mono_gset۰auth γ dq).
  #[global] Instance mono_gset۰lbproper γ :
    Proper ((≡) ==> (≡)) (mono_gset۰lb γ).

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

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

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

  Lemma mono_gsetalloc s :
     |==>
       γ,
      mono_gset۰auth γ (DfracOwn 1) s.

  Lemma mono_gset۰authvalid γ dq s :
    mono_gset۰auth γ dq s
     dq.
  Lemma mono_gset۰authcombine γ dq1 s1 dq2 s2 :
    mono_gset۰auth γ dq1 s1 -∗
    mono_gset۰auth γ dq2 s2 -∗
      s1 = s2
      mono_gset۰auth γ (dq1 dq2) s1.
  Lemma mono_gset۰authvalidー2 γ dq1 s1 dq2 s2 :
    mono_gset۰auth γ dq1 s1 -∗
    mono_gset۰auth γ dq2 s2 -∗
       (dq1 dq2)
      s1 = s2.
  Lemma mono_gset۰authagree γ dq1 s1 dq2 s2 :
    mono_gset۰auth γ dq1 s1 -∗
    mono_gset۰auth γ dq2 s2 -∗
    s1 = s2.
  Lemma mono_gset۰authdfracne γ1 dq1 s1 γ2 dq2 s2 :
    ¬ (dq1 dq2)
    mono_gset۰auth γ1 dq1 s1 -∗
    mono_gset۰auth γ2 dq2 s2 -∗
    γ1 γ2.
  Lemma mono_gset۰authne γ1 s1 γ2 dq2 s2 :
    mono_gset۰auth γ1 (DfracOwn 1) s1 -∗
    mono_gset۰auth γ2 dq2 s2 -∗
    γ1 γ2.
  Lemma mono_gset۰authexclusive γ s1 dq2 s2 :
    mono_gset۰auth γ (DfracOwn 1) s1 -∗
    mono_gset۰auth γ dq2 s2 -∗
    False.
  Lemma mono_gset۰authpersist γ dq s :
    mono_gset۰auth γ dq s |==>
    mono_gset۰auth γ DfracDiscarded s.

  Lemma mono_gset۰lbget γ dq s :
    mono_gset۰auth γ dq s
    mono_gset۰lb γ s.
  Lemma mono_gset۰lbmono {γ s} s' :
    s' s
    mono_gset۰lb γ s
    mono_gset۰lb γ s'.
  Lemma mono_gset۰elemget {γ dq s} a :
    a s
    mono_gset۰auth γ dq s
    mono_gset۰elem γ a.

  Lemma mono_gset۰lbvalid γ dq s1 s2 :
    mono_gset۰auth γ dq s1 -∗
    mono_gset۰lb γ s2 -∗
    s2 s1.
  Lemma mono_gset۰elemvalid γ dq s a :
    mono_gset۰auth γ dq s -∗
    mono_gset۰elem γ a -∗
    a s.

  Lemma mono_gsetupdate {γ s} s' :
    s s'
    mono_gset۰auth γ (DfracOwn 1) s |==>
    mono_gset۰auth γ (DfracOwn 1) s'.
  Lemma mono_gsetinsert {γ s} a :
    mono_gset۰auth γ (DfracOwn 1) s |==>
    mono_gset۰auth γ (DfracOwn 1) ({[a]} s).
  Lemma mono_gsetinsert' {γ s} a :
    mono_gset۰auth γ (DfracOwn 1) s |==>
      mono_gset۰auth γ (DfracOwn 1) ({[a]} s)
      mono_gset۰elem γ a.
End mono_gset۰G.

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