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 subGーmono_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 mapーsubseteqーpartialorder :
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۰authーtimeless γ dq m :
Timeless (mono_gmap۰auth γ dq m).
#[global] Instance mono_gmap۰lbーtimeless γ m :
Timeless (mono_gmap۰lb γ m).
#[global] Instance mono_gmap۰elemーtimeless γ i :
Timeless (mono_gmap۰elem γ i).
#[global] Instance mono_gmap۰authーpersistent γ m :
Persistent (mono_gmap۰auth γ DfracDiscarded m).
#[global] Instance mono_gmap۰lbーpersistent γ m :
Persistent (mono_gmap۰lb γ m).
#[global] Instance mono_gmap۰elemーpersistent γ i :
Persistent (mono_gmap۰elem γ i).
#[global] Instance mono_gmap۰authーfractional γ m :
Fractional (λ q, mono_gmap۰auth γ (DfracOwn q) m).
#[global] Instance mono_gmap۰authーas_fractional γ q m :
AsFractional (mono_gmap۰auth γ (DfracOwn q) m) (λ q, mono_gmap۰auth γ (DfracOwn q) m) q.
Lemma mono_gmapーalloc m :
⊢ |==>
∃ γ,
mono_gmap۰auth γ (DfracOwn 1) m.
Lemma mono_gmap۰atーtoーelem γ i v :
mono_gmap۰at γ i v ⊢
mono_gmap۰elem γ i.
Lemma mono_gmap۰elemーtoーat γ i :
mono_gmap۰elem γ i ⊢
∃ v,
mono_gmap۰at γ i v.
Lemma mono_gmap۰authーvalid γ dq m :
mono_gmap۰auth γ dq m ⊢
⌜✓ dq⌝.
Lemma mono_gmap۰authーcombine γ 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۰authーvalidー2 γ dq1 m1 dq2 m2 :
mono_gmap۰auth γ dq1 m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜m1 = m2⌝.
Lemma mono_gmap۰authーagree γ dq1 m1 dq2 m2 :
mono_gmap۰auth γ dq1 m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
⌜m1 = m2⌝.
Lemma mono_gmap۰authーdfracーne γ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۰authーne γ1 m1 γ2 dq2 m2 :
mono_gmap۰auth γ1 (DfracOwn 1) m1 -∗
mono_gmap۰auth γ2 dq2 m2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_gmap۰authーexclusive γ m1 dq2 m2 :
mono_gmap۰auth γ (DfracOwn 1) m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
False.
Lemma mono_gmap۰authーpersist γ dq m :
mono_gmap۰auth γ dq m ⊢ |==>
mono_gmap۰auth γ DfracDiscarded m.
Lemma mono_gmap۰lbーget γ dq m :
mono_gmap۰auth γ dq m ⊢
mono_gmap۰lb γ m.
Lemma mono_gmap۰lbーmono {γ m} m' :
m' ⊆ m →
mono_gmap۰lb γ m ⊢
mono_gmap۰lb γ m'.
Lemma mono_gmap۰atーget {γ dq m} i v :
m !! i = Some v →
mono_gmap۰auth γ dq m ⊢
mono_gmap۰at γ i v.
Lemma mono_gmap۰lbーvalid γ dq m1 m2 :
mono_gmap۰auth γ dq m1 -∗
mono_gmap۰lb γ m2 -∗
⌜m2 ⊆ m1⌝.
Lemma mono_gmap۰atーvalid γ dq m i v :
mono_gmap۰auth γ dq m -∗
mono_gmap۰at γ i v -∗
⌜m !! i = Some v⌝.
Lemma mono_gmap۰elemーvalid γ dq m i :
mono_gmap۰auth γ dq m -∗
mono_gmap۰elem γ i -∗
∃ v,
⌜m !! i = Some v⌝.
Lemma mono_gmapーupdate {γ m} m' :
m ⊆ m' →
mono_gmap۰auth γ (DfracOwn 1) m ⊢ |==>
mono_gmap۰auth γ (DfracOwn 1) m'.
Lemma mono_gmapーinsert {γ m} i v :
m !! i = None →
mono_gmap۰auth γ (DfracOwn 1) m ⊢ |==>
mono_gmap۰auth γ (DfracOwn 1) (<[i := v]> m).
Lemma mono_gmapーinsert' {γ 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.
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 subGーmono_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 mapーsubseteqーpartialorder :
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۰authーtimeless γ dq m :
Timeless (mono_gmap۰auth γ dq m).
#[global] Instance mono_gmap۰lbーtimeless γ m :
Timeless (mono_gmap۰lb γ m).
#[global] Instance mono_gmap۰elemーtimeless γ i :
Timeless (mono_gmap۰elem γ i).
#[global] Instance mono_gmap۰authーpersistent γ m :
Persistent (mono_gmap۰auth γ DfracDiscarded m).
#[global] Instance mono_gmap۰lbーpersistent γ m :
Persistent (mono_gmap۰lb γ m).
#[global] Instance mono_gmap۰elemーpersistent γ i :
Persistent (mono_gmap۰elem γ i).
#[global] Instance mono_gmap۰authーfractional γ m :
Fractional (λ q, mono_gmap۰auth γ (DfracOwn q) m).
#[global] Instance mono_gmap۰authーas_fractional γ q m :
AsFractional (mono_gmap۰auth γ (DfracOwn q) m) (λ q, mono_gmap۰auth γ (DfracOwn q) m) q.
Lemma mono_gmapーalloc m :
⊢ |==>
∃ γ,
mono_gmap۰auth γ (DfracOwn 1) m.
Lemma mono_gmap۰atーtoーelem γ i v :
mono_gmap۰at γ i v ⊢
mono_gmap۰elem γ i.
Lemma mono_gmap۰elemーtoーat γ i :
mono_gmap۰elem γ i ⊢
∃ v,
mono_gmap۰at γ i v.
Lemma mono_gmap۰authーvalid γ dq m :
mono_gmap۰auth γ dq m ⊢
⌜✓ dq⌝.
Lemma mono_gmap۰authーcombine γ 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۰authーvalidー2 γ dq1 m1 dq2 m2 :
mono_gmap۰auth γ dq1 m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜m1 = m2⌝.
Lemma mono_gmap۰authーagree γ dq1 m1 dq2 m2 :
mono_gmap۰auth γ dq1 m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
⌜m1 = m2⌝.
Lemma mono_gmap۰authーdfracーne γ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۰authーne γ1 m1 γ2 dq2 m2 :
mono_gmap۰auth γ1 (DfracOwn 1) m1 -∗
mono_gmap۰auth γ2 dq2 m2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_gmap۰authーexclusive γ m1 dq2 m2 :
mono_gmap۰auth γ (DfracOwn 1) m1 -∗
mono_gmap۰auth γ dq2 m2 -∗
False.
Lemma mono_gmap۰authーpersist γ dq m :
mono_gmap۰auth γ dq m ⊢ |==>
mono_gmap۰auth γ DfracDiscarded m.
Lemma mono_gmap۰lbーget γ dq m :
mono_gmap۰auth γ dq m ⊢
mono_gmap۰lb γ m.
Lemma mono_gmap۰lbーmono {γ m} m' :
m' ⊆ m →
mono_gmap۰lb γ m ⊢
mono_gmap۰lb γ m'.
Lemma mono_gmap۰atーget {γ dq m} i v :
m !! i = Some v →
mono_gmap۰auth γ dq m ⊢
mono_gmap۰at γ i v.
Lemma mono_gmap۰lbーvalid γ dq m1 m2 :
mono_gmap۰auth γ dq m1 -∗
mono_gmap۰lb γ m2 -∗
⌜m2 ⊆ m1⌝.
Lemma mono_gmap۰atーvalid γ dq m i v :
mono_gmap۰auth γ dq m -∗
mono_gmap۰at γ i v -∗
⌜m !! i = Some v⌝.
Lemma mono_gmap۰elemーvalid γ dq m i :
mono_gmap۰auth γ dq m -∗
mono_gmap۰elem γ i -∗
∃ v,
⌜m !! i = Some v⌝.
Lemma mono_gmapーupdate {γ m} m' :
m ⊆ m' →
mono_gmap۰auth γ (DfracOwn 1) m ⊢ |==>
mono_gmap۰auth γ (DfracOwn 1) m'.
Lemma mono_gmapーinsert {γ m} i v :
m !! i = None →
mono_gmap۰auth γ (DfracOwn 1) m ⊢ |==>
mono_gmap۰auth γ (DfracOwn 1) (<[i := v]> m).
Lemma mono_gmapーinsert' {γ 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.