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 subGmono_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۰authtimeless γ dq l :
    Timeless (mono_list۰auth γ dq l).
  #[global] Instance mono_list۰lbtimeless γ l :
    Timeless (mono_list۰lb γ l).
  #[global] Instance mono_list۰attimeless γ i a :
    Timeless (mono_list۰at γ i a).
  #[global] Instance mono_list۰elemtimeless γ a :
    Timeless (mono_list۰elem γ a).

  #[global] Instance mono_list۰lbpersistent γ l :
    Persistent (mono_list۰lb γ l).
  #[global] Instance mono_list۰atpersistent γ i a :
    Persistent (mono_list۰at γ i a).
  #[global] Instance mono_list۰elempersistent γ a :
    Persistent (mono_list۰elem γ a).

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

  Lemma mono_listalloc l :
     |==>
       γ,
      mono_list۰auth γ (DfracOwn 1) l.

  Lemma mono_list۰authvalid γ dq l :
    mono_list۰auth γ dq l
     dq.
  Lemma mono_list۰authcombine γ 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۰authvalidー2 γ dq1 l1 dq2 l2 :
    mono_list۰auth γ dq1 l1 -∗
    mono_list۰auth γ dq2 l2 -∗
       (dq1 dq2)
      l1 = l2.
  Lemma mono_list۰authagree γ dq1 l1 dq2 l2 :
    mono_list۰auth γ dq1 l1 -∗
    mono_list۰auth γ dq2 l2 -∗
    l1 = l2.
  Lemma mono_list۰authdfracne γ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۰authne γ1 l1 γ2 dq2 l2 :
    mono_list۰auth γ1 (DfracOwn 1) l1 -∗
    mono_list۰auth γ2 dq2 l2 -∗
    γ1 γ2.
  Lemma mono_list۰authexclusive γ l1 dq2 l2 :
    mono_list۰auth γ (DfracOwn 1) l1 -∗
    mono_list۰auth γ dq2 l2 -∗
    False.
  Lemma mono_list۰authpersist γ dq l :
    mono_list۰auth γ dq l |==>
    mono_list۰auth γ DfracDiscarded l.

  Lemma mono_list۰lbget γ q l :
    mono_list۰auth γ q l
    mono_list۰lb γ l.
  Lemma mono_list۰atget {γ q l} i a :
    l !! i = Some a
    mono_list۰auth γ q l
    mono_list۰at γ i a.
  Lemma mono_list۰elemget {γ q l} a :
    a l
    mono_list۰auth γ q l
    mono_list۰elem γ a.

  Lemma mono_list۰lbmono {γ l} l' :
    l' `prefix_of` l
    mono_list۰lb γ l
    mono_list۰lb γ l'.

  Lemma mono_list۰lbvalid γ dq l1 l2 :
    mono_list۰auth γ dq l1 -∗
    mono_list۰lb γ l2 -∗
    l2 `prefix_of` l1.
  Lemma mono_list۰lbagree γ l1 l2 :
    mono_list۰lb γ l1 -∗
    mono_list۰lb γ l2 -∗
       l,
      l1 `prefix_of` l
      l2 `prefix_of` l.
  Lemma mono_list۰atvalid γ q l i a :
    mono_list۰auth γ q l -∗
    mono_list۰at γ i a -∗
    l !! i = Some a.
  Lemma mono_list۰atagree γ i a1 a2 :
    mono_list۰at γ i a1 -∗
    mono_list۰at γ i a2 -∗
    a1 = a2.
  Lemma mono_list۰elemvalid γ q l a :
    mono_list۰auth γ q l -∗
    mono_list۰elem γ a -∗
    a l.

  Lemma mono_listupdate {γ l} l' :
    l `prefix_of` l'
    mono_list۰auth γ (DfracOwn 1) l |==>
    mono_list۰auth γ (DfracOwn 1) l'.
  Lemma mono_listupdateapp {γ l} l' :
    mono_list۰auth γ (DfracOwn 1) l |==>
    mono_list۰auth γ (DfracOwn 1) (l ++ l').
  Lemma mono_listupdatesnoc {γ 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.