Library zoo.iris.base_logic.lib.mono_list
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 MonoListG Σ A :=
{ #[local] mono_list۰G۰mono۰G :: AuthMonoG Σ (A := leibnizO (list A)) prefix
}.
Definition mono_list۰Σ A :=
#[auth_mono۰Σ (A := leibnizO (list A)) prefix
].
#[global] Instance subGーmono_list۰Σ Σ A :
subG (mono_list۰Σ A) Σ →
MonoListG Σ A.
Section mono_list۰G.
Context `{mono_list۰G : !MonoListG Σ A}.
Implicit Type i : nat.
Implicit Type a : A.
Implicit Type l : list A.
Definition mono_list۰auth γ dq l :=
auth_mono۰auth (A := leibnizO (list A)) prefix γ dq l.
Definition mono_list۰lb γ l :=
auth_mono۰lb (A := leibnizO (list A)) prefix γ l.
Definition mono_list۰at γ i a : iProp Σ :=
∃ l,
⌜l !! i = Some a⌝ ∗
mono_list۰lb γ l.
Definition mono_list۰elem γ a : iProp Σ :=
∃ i,
mono_list۰at γ i a.
#[global] Instance mono_list۰authーtimeless γ dq l :
Timeless (mono_list۰auth γ dq l).
#[global] Instance mono_list۰lbーtimeless γ l :
Timeless (mono_list۰lb γ l).
#[global] Instance mono_list۰atーtimeless γ i a :
Timeless (mono_list۰at γ i a).
#[global] Instance mono_list۰elemーtimeless γ a :
Timeless (mono_list۰elem γ a).
#[global] Instance mono_list۰lbーpersistent γ l :
Persistent (mono_list۰lb γ l).
#[global] Instance mono_list۰atーpersistent γ i a :
Persistent (mono_list۰at γ i a).
#[global] Instance mono_list۰elemーpersistent γ a :
Persistent (mono_list۰elem γ a).
#[global] Instance mono_list۰authーfractional γ l :
Fractional (λ q, mono_list۰auth γ (DfracOwn q) l).
#[global] Instance mono_list۰authーas_fractional γ q l :
AsFractional (mono_list۰auth γ (DfracOwn q) l) (λ q, mono_list۰auth γ (DfracOwn q) l) q.
Lemma mono_listーalloc l :
⊢ |==>
∃ γ,
mono_list۰auth γ (DfracOwn 1) l.
Lemma mono_list۰authーvalid γ dq l :
mono_list۰auth γ dq l ⊢
⌜✓ dq⌝.
Lemma mono_list۰authーcombine γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜l1 = l2⌝ ∗
mono_list۰auth γ (dq1 ⋅ dq2) l1.
Lemma mono_list۰authーvalidー2 γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜l1 = l2⌝.
Lemma mono_list۰authーagree γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜l1 = l2⌝.
Lemma mono_list۰authーdfracーne γ1 dq1 l1 γ2 dq2 l2 :
¬ ✓ (dq1 ⋅ dq2) →
mono_list۰auth γ1 dq1 l1 -∗
mono_list۰auth γ2 dq2 l2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_list۰authーne γ1 l1 γ2 dq2 l2 :
mono_list۰auth γ1 (DfracOwn 1) l1 -∗
mono_list۰auth γ2 dq2 l2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_list۰authーexclusive γ l1 dq2 l2 :
mono_list۰auth γ (DfracOwn 1) l1 -∗
mono_list۰auth γ dq2 l2 -∗
False.
Lemma mono_list۰authーpersist γ dq l :
mono_list۰auth γ dq l ⊢ |==>
mono_list۰auth γ DfracDiscarded l.
Lemma mono_list۰lbーget γ q l :
mono_list۰auth γ q l ⊢
mono_list۰lb γ l.
Lemma mono_list۰atーget {γ q l} i a :
l !! i = Some a →
mono_list۰auth γ q l ⊢
mono_list۰at γ i a.
Lemma mono_list۰elemーget {γ q l} a :
a ∈ l →
mono_list۰auth γ q l ⊢
mono_list۰elem γ a.
Lemma mono_list۰lbーmono {γ l} l' :
l' `prefix_of` l →
mono_list۰lb γ l ⊢
mono_list۰lb γ l'.
Lemma mono_list۰lbーvalid γ dq l1 l2 :
mono_list۰auth γ dq l1 -∗
mono_list۰lb γ l2 -∗
⌜l2 `prefix_of` l1⌝.
Lemma mono_list۰lbーagree γ l1 l2 :
mono_list۰lb γ l1 -∗
mono_list۰lb γ l2 -∗
∃ l,
⌜l1 `prefix_of` l⌝ ∧
⌜l2 `prefix_of` l⌝.
Lemma mono_list۰atーvalid γ q l i a :
mono_list۰auth γ q l -∗
mono_list۰at γ i a -∗
⌜l !! i = Some a⌝.
Lemma mono_list۰atーagree γ i a1 a2 :
mono_list۰at γ i a1 -∗
mono_list۰at γ i a2 -∗
⌜a1 = a2⌝.
Lemma mono_list۰elemーvalid γ q l a :
mono_list۰auth γ q l -∗
mono_list۰elem γ a -∗
⌜a ∈ l⌝.
Lemma mono_listーupdate {γ l} l' :
l `prefix_of` l' →
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) l'.
Lemma mono_listーupdateーapp {γ l} l' :
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) (l ++ l').
Lemma mono_listーupdateーsnoc {γ l} a :
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) (l ++ [a]).
End mono_list۰G.
#[global] Opaque mono_list۰auth.
#[global] Opaque mono_list۰lb.
#[global] Typeclasses Opaque mono_list۰at.
#[global] Typeclasses Opaque mono_list۰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 MonoListG Σ A :=
{ #[local] mono_list۰G۰mono۰G :: AuthMonoG Σ (A := leibnizO (list A)) prefix
}.
Definition mono_list۰Σ A :=
#[auth_mono۰Σ (A := leibnizO (list A)) prefix
].
#[global] Instance subGーmono_list۰Σ Σ A :
subG (mono_list۰Σ A) Σ →
MonoListG Σ A.
Section mono_list۰G.
Context `{mono_list۰G : !MonoListG Σ A}.
Implicit Type i : nat.
Implicit Type a : A.
Implicit Type l : list A.
Definition mono_list۰auth γ dq l :=
auth_mono۰auth (A := leibnizO (list A)) prefix γ dq l.
Definition mono_list۰lb γ l :=
auth_mono۰lb (A := leibnizO (list A)) prefix γ l.
Definition mono_list۰at γ i a : iProp Σ :=
∃ l,
⌜l !! i = Some a⌝ ∗
mono_list۰lb γ l.
Definition mono_list۰elem γ a : iProp Σ :=
∃ i,
mono_list۰at γ i a.
#[global] Instance mono_list۰authーtimeless γ dq l :
Timeless (mono_list۰auth γ dq l).
#[global] Instance mono_list۰lbーtimeless γ l :
Timeless (mono_list۰lb γ l).
#[global] Instance mono_list۰atーtimeless γ i a :
Timeless (mono_list۰at γ i a).
#[global] Instance mono_list۰elemーtimeless γ a :
Timeless (mono_list۰elem γ a).
#[global] Instance mono_list۰lbーpersistent γ l :
Persistent (mono_list۰lb γ l).
#[global] Instance mono_list۰atーpersistent γ i a :
Persistent (mono_list۰at γ i a).
#[global] Instance mono_list۰elemーpersistent γ a :
Persistent (mono_list۰elem γ a).
#[global] Instance mono_list۰authーfractional γ l :
Fractional (λ q, mono_list۰auth γ (DfracOwn q) l).
#[global] Instance mono_list۰authーas_fractional γ q l :
AsFractional (mono_list۰auth γ (DfracOwn q) l) (λ q, mono_list۰auth γ (DfracOwn q) l) q.
Lemma mono_listーalloc l :
⊢ |==>
∃ γ,
mono_list۰auth γ (DfracOwn 1) l.
Lemma mono_list۰authーvalid γ dq l :
mono_list۰auth γ dq l ⊢
⌜✓ dq⌝.
Lemma mono_list۰authーcombine γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜l1 = l2⌝ ∗
mono_list۰auth γ (dq1 ⋅ dq2) l1.
Lemma mono_list۰authーvalidー2 γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜✓ (dq1 ⋅ dq2)⌝ ∗
⌜l1 = l2⌝.
Lemma mono_list۰authーagree γ dq1 l1 dq2 l2 :
mono_list۰auth γ dq1 l1 -∗
mono_list۰auth γ dq2 l2 -∗
⌜l1 = l2⌝.
Lemma mono_list۰authーdfracーne γ1 dq1 l1 γ2 dq2 l2 :
¬ ✓ (dq1 ⋅ dq2) →
mono_list۰auth γ1 dq1 l1 -∗
mono_list۰auth γ2 dq2 l2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_list۰authーne γ1 l1 γ2 dq2 l2 :
mono_list۰auth γ1 (DfracOwn 1) l1 -∗
mono_list۰auth γ2 dq2 l2 -∗
⌜γ1 ≠ γ2⌝.
Lemma mono_list۰authーexclusive γ l1 dq2 l2 :
mono_list۰auth γ (DfracOwn 1) l1 -∗
mono_list۰auth γ dq2 l2 -∗
False.
Lemma mono_list۰authーpersist γ dq l :
mono_list۰auth γ dq l ⊢ |==>
mono_list۰auth γ DfracDiscarded l.
Lemma mono_list۰lbーget γ q l :
mono_list۰auth γ q l ⊢
mono_list۰lb γ l.
Lemma mono_list۰atーget {γ q l} i a :
l !! i = Some a →
mono_list۰auth γ q l ⊢
mono_list۰at γ i a.
Lemma mono_list۰elemーget {γ q l} a :
a ∈ l →
mono_list۰auth γ q l ⊢
mono_list۰elem γ a.
Lemma mono_list۰lbーmono {γ l} l' :
l' `prefix_of` l →
mono_list۰lb γ l ⊢
mono_list۰lb γ l'.
Lemma mono_list۰lbーvalid γ dq l1 l2 :
mono_list۰auth γ dq l1 -∗
mono_list۰lb γ l2 -∗
⌜l2 `prefix_of` l1⌝.
Lemma mono_list۰lbーagree γ l1 l2 :
mono_list۰lb γ l1 -∗
mono_list۰lb γ l2 -∗
∃ l,
⌜l1 `prefix_of` l⌝ ∧
⌜l2 `prefix_of` l⌝.
Lemma mono_list۰atーvalid γ q l i a :
mono_list۰auth γ q l -∗
mono_list۰at γ i a -∗
⌜l !! i = Some a⌝.
Lemma mono_list۰atーagree γ i a1 a2 :
mono_list۰at γ i a1 -∗
mono_list۰at γ i a2 -∗
⌜a1 = a2⌝.
Lemma mono_list۰elemーvalid γ q l a :
mono_list۰auth γ q l -∗
mono_list۰elem γ a -∗
⌜a ∈ l⌝.
Lemma mono_listーupdate {γ l} l' :
l `prefix_of` l' →
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) l'.
Lemma mono_listーupdateーapp {γ l} l' :
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) (l ++ l').
Lemma mono_listーupdateーsnoc {γ l} a :
mono_list۰auth γ (DfracOwn 1) l ⊢ |==>
mono_list۰auth γ (DfracOwn 1) (l ++ [a]).
End mono_list۰G.
#[global] Opaque mono_list۰auth.
#[global] Opaque mono_list۰lb.
#[global] Typeclasses Opaque mono_list۰at.
#[global] Typeclasses Opaque mono_list۰elem.