Library zoo.iris.base_logic.lib.mono_gmap

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 MonoGmapG Σ K V `{Countable K} :=
  { #[local] mono_gmap۰G۰mono۰G :: AuthMonoG Σ (A := leibnizO (gmap K V)) (subseteq (A := gmap K V))
  }.

Definition mono_gmap۰Σ K V `{Countable K} :=
  #[auth_mono۰Σ (A := leibnizO (gmap K V)) (subseteq (A := gmap K V))
  ].
#[global] Instance subGmono_gmap۰Σ Σ K V `{Countable K} :
  subG (mono_gmap۰Σ K V) Σ
  MonoGmapG Σ K V.

Section mono_gmap۰G.
  Context `{mono_gmap۰G : MonoGmapG Σ K V}.

  Implicit Type v : V.
  Implicit Type m : gmap K V.

  #[local] Instance mapsubseteqpartialorder :
    PartialOrder (A := gmap K V) subseteq.

  Definition mono_gmap۰auth γ dq m :=
    auth_mono۰auth subseteq γ dq m.
  Definition mono_gmap۰lb γ m :=
    auth_mono۰lb subseteq γ m.
  Definition mono_gmap۰at γ i v :=
    mono_gmap۰lb γ {[i := v]}.
  Definition mono_gmap۰elem γ i : iProp Σ :=
     v,
    mono_gmap۰at γ i v.

  #[global] Instance mono_gmap۰authtimeless γ dq m :
    Timeless (mono_gmap۰auth γ dq m).
  #[global] Instance mono_gmap۰lbtimeless γ m :
    Timeless (mono_gmap۰lb γ m).
  #[global] Instance mono_gmap۰elemtimeless γ i :
    Timeless (mono_gmap۰elem γ i).

  #[global] Instance mono_gmap۰authpersistent γ m :
    Persistent (mono_gmap۰auth γ DfracDiscarded m).
  #[global] Instance mono_gmap۰lbpersistent γ m :
    Persistent (mono_gmap۰lb γ m).
  #[global] Instance mono_gmap۰elempersistent γ i :
    Persistent (mono_gmap۰elem γ i).

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

  Lemma mono_gmapalloc m :
     |==>
       γ,
      mono_gmap۰auth γ (DfracOwn 1) m.

  Lemma mono_gmap۰attoelem γ i v :
    mono_gmap۰at γ i v
    mono_gmap۰elem γ i.
  Lemma mono_gmap۰elemtoat γ i :
    mono_gmap۰elem γ i
       v,
      mono_gmap۰at γ i v.

  Lemma mono_gmap۰authvalid γ dq m :
    mono_gmap۰auth γ dq m
     dq.
  Lemma mono_gmap۰authcombine γ dq1 m1 dq2 m2 :
    mono_gmap۰auth γ dq1 m1 -∗
    mono_gmap۰auth γ dq2 m2 -∗
      m1 = m2
      mono_gmap۰auth γ (dq1 dq2) m1.
  Lemma mono_gmap۰authvalidー2 γ dq1 m1 dq2 m2 :
    mono_gmap۰auth γ dq1 m1 -∗
    mono_gmap۰auth γ dq2 m2 -∗
       (dq1 dq2)
      m1 = m2.
  Lemma mono_gmap۰authagree γ dq1 m1 dq2 m2 :
    mono_gmap۰auth γ dq1 m1 -∗
    mono_gmap۰auth γ dq2 m2 -∗
    m1 = m2.
  Lemma mono_gmap۰authdfracne γ1 dq1 m1 γ2 dq2 m2 :
    ¬ (dq1 dq2)
    mono_gmap۰auth γ1 dq1 m1 -∗
    mono_gmap۰auth γ2 dq2 m2 -∗
    γ1 γ2.
  Lemma mono_gmap۰authne γ1 m1 γ2 dq2 m2 :
    mono_gmap۰auth γ1 (DfracOwn 1) m1 -∗
    mono_gmap۰auth γ2 dq2 m2 -∗
    γ1 γ2.
  Lemma mono_gmap۰authexclusive γ m1 dq2 m2 :
    mono_gmap۰auth γ (DfracOwn 1) m1 -∗
    mono_gmap۰auth γ dq2 m2 -∗
    False.
  Lemma mono_gmap۰authpersist γ dq m :
    mono_gmap۰auth γ dq m |==>
    mono_gmap۰auth γ DfracDiscarded m.

  Lemma mono_gmap۰lbget γ dq m :
    mono_gmap۰auth γ dq m
    mono_gmap۰lb γ m.
  Lemma mono_gmap۰lbmono {γ m} m' :
    m' m
    mono_gmap۰lb γ m
    mono_gmap۰lb γ m'.
  Lemma mono_gmap۰atget {γ dq m} i v :
    m !! i = Some v
    mono_gmap۰auth γ dq m
    mono_gmap۰at γ i v.

  Lemma mono_gmap۰lbvalid γ dq m1 m2 :
    mono_gmap۰auth γ dq m1 -∗
    mono_gmap۰lb γ m2 -∗
    m2 m1.
  Lemma mono_gmap۰atvalid γ dq m i v :
    mono_gmap۰auth γ dq m -∗
    mono_gmap۰at γ i v -∗
    m !! i = Some v.
  Lemma mono_gmap۰elemvalid γ dq m i :
    mono_gmap۰auth γ dq m -∗
    mono_gmap۰elem γ i -∗
       v,
      m !! i = Some v.

  Lemma mono_gmapupdate {γ m} m' :
    m m'
    mono_gmap۰auth γ (DfracOwn 1) m |==>
    mono_gmap۰auth γ (DfracOwn 1) m'.
  Lemma mono_gmapinsert {γ m} i v :
    m !! i = None
    mono_gmap۰auth γ (DfracOwn 1) m |==>
    mono_gmap۰auth γ (DfracOwn 1) (<[i := v]> m).
  Lemma mono_gmapinsert' {γ m} i v :
    m !! i = None
    mono_gmap۰auth γ (DfracOwn 1) m |==>
      mono_gmap۰auth γ (DfracOwn 1) (<[i := v]> m)
      mono_gmap۰at γ i v.
End mono_gmap۰G.

#[global] Opaque mono_gmap۰auth.
#[global] Opaque mono_gmap۰lb.
#[global] Opaque mono_gmap۰elem.