Library zoo.iris.base_logic.lib.mono_gmultiset

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 MonoGmultisetG Σ A `{Countable A} :=
  { #[local] mono_gmultiset۰G۰mono۰G :: AuthMonoG Σ (A := leibnizO (gmultiset A)) subseteq
  }.

Definition mono_gmultiset۰Σ A `{Countable A} :=
  #[auth_mono۰Σ (A := leibnizO (gmultiset A)) subseteq
  ].
#[global] Instance subGmono_gmultiset۰Σ Σ V `{Countable V} :
  subG (mono_gmultiset۰Σ V) Σ
  MonoGmultisetG Σ V.

Section mono_gmultiset۰G.
  Context `{mono_gmultiset۰G : MonoGmultisetG Σ A}.

  Implicit Type a : A.
  Implicit Type s : gmultiset A.

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

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

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

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

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

  Lemma mono_gmultisetalloc s :
     |==>
       γ,
      mono_gmultiset۰auth γ (DfracOwn 1) s.

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

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

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

  Lemma mono_gmultisetupdate {γ s} s' :
    s s'
    mono_gmultiset۰auth γ (DfracOwn 1) s |==>
    mono_gmultiset۰auth γ (DfracOwn 1) s'.
  Lemma mono_gmultisetinsert {γ s} a :
    mono_gmultiset۰auth γ (DfracOwn 1) s |==>
    mono_gmultiset۰auth γ (DfracOwn 1) ({[+a+]} s).
  Lemma mono_gmultisetinsert' {γ s} a :
    mono_gmultiset۰auth γ (DfracOwn 1) s |==>
      mono_gmultiset۰auth γ (DfracOwn 1) ({[+a+]} s)
      mono_gmultiset۰elem γ a.
End mono_gmultiset۰G.

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