Library zoo.iris.base_logic.lib.subpreds

Require Import iris.base_logic.lib.fancy_updates.

Require Import zoo.prelude.
Require Import zoo.iris.base_logic.lib.auth_dgset.
Require Import zoo.iris.base_logic.lib.saved_pred.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.diaframe.
Require Import zoo.options.

Class SubpredsG Σ A :=
  { #[local] subpreds۰G۰auth_dgset۰G :: AuthDgsetG Σ gname
  ; #[local] subpreds۰G۰saved_pred۰G :: SavedPredG Σ A
  }.

Definition subpreds۰Σ A :=
  #[auth_dgset۰Σ gname
  ; saved_pred۰Σ A
  ].
#[global] Instance subGsubpreds۰Σ Σ A :
  subG (subpreds۰Σ A) Σ
  SubpredsG Σ A.

Section subpreds۰G.
  Context `{subpreds۰G : !SubpredsG Σ A}.

  Implicit Type state : option A.
  Implicit Type η : gname.
  Implicit Type Ψ Χ : A iProp Σ.

  Definition subpreds۰auth γ Ψ state : iProp Σ :=
     ηs,
    auth_dgset۰auth γ (DfracOwn 1) ηs
       x,
      (if state is Some y then x = y else Ψ x) -∗
      [∗ set] η ηs,
         Χ,
        saved_pred η Χ
         Χ x.
  #[local] Instance : CustomIpat "auth" :=
    " ( %ηs & {>;}Hauth & Hηs ) ".

  Definition subpreds۰frag γ Χ : iProp Σ :=
     η,
    auth_dgset۰frag γ {[η]}
    saved_pred η Χ.
  #[local] Instance : CustomIpat "frag" :=
    " ( %η{} & Hfrag{_{}} & #Hη{} ) ".

  #[global] Instance subpreds۰authne γ n :
    Proper (
      (pointwise_relation _ (≡{n}≡)) ==>
      (=) ==>
      (≡{n}≡)
    ) (subpreds۰auth γ).
  #[global] Instance subpreds۰authproper γ :
    Proper (
      (pointwise_relation _ (≡)) ==>
      (=) ==>
      (≡)
    ) (subpreds۰auth γ).
  #[global] Instance subpreds۰fragcontractive γ n :
    Proper (
      (pointwise_relation _ (dist_later n)) ==>
      (≡{n}≡)
    ) (subpreds۰frag γ).
  #[global] Instance subpreds۰fragproper γ :
    Proper (
      (pointwise_relation _ (≡)) ==>
      (≡)
    ) (subpreds۰frag γ).

  Lemma subpredsalloc Ψ :
     |==>
       γ,
      subpreds۰auth γ Ψ None
      subpreds۰frag γ Ψ.

  Lemma subpredssplitwand `{inv۰G : !invGS Σ} {γ Ψ state Χ} Χ1 Χ2 E :
     subpreds۰auth γ Ψ state -∗
    subpreds۰frag γ Χ -∗
    ( x, Χ x -∗ Χ1 x Χ2 x) ={E}=∗
       subpreds۰auth γ Ψ state
      subpreds۰frag γ Χ1
      subpreds۰frag γ Χ2.
  Lemma subpredswand `{inv۰G : !invGS Σ} {γ Ψ state Χ1} Χ2 E :
     subpreds۰auth γ Ψ state -∗
    subpreds۰frag γ Χ1 -∗
    ( x, Χ1 x -∗ Χ2 x) ={E}=∗
       subpreds۰auth γ Ψ state
      subpreds۰frag γ Χ2.
  Lemma subpredssplit `{inv۰G : !invGS Σ} {γ Ψ state} Χ1 Χ2 E :
     subpreds۰auth γ Ψ state -∗
    subpreds۰frag γ (λ x, Χ1 x Χ2 x)%I ={E}=∗
       subpreds۰auth γ Ψ state
      subpreds۰frag γ Χ1
      subpreds۰frag γ Χ2.
  Lemma subpredsdivide `{inv۰G : !invGS Σ} {γ Ψ state} Χs E :
     subpreds۰auth γ Ψ state -∗
    subpreds۰frag γ (λ x, [∗ list] Χ Χs, Χ x) ={E}=∗
       subpreds۰auth γ Ψ state
      [∗ list] Χ Χs, subpreds۰frag γ Χ.

  Lemma subpredsproduce {γ Ψ} x :
    subpreds۰auth γ Ψ None -∗
    Ψ x -∗
    subpreds۰auth γ Ψ (Some x).

  Lemma subpredsconsume `{inv۰G : !invGS Σ} γ Ψ x Χ E :
     subpreds۰auth γ Ψ (Some x) -∗
    subpreds۰frag γ Χ ={E}=∗
       subpreds۰auth γ Ψ (Some x)
      ▷^2 Χ x.
End subpreds۰G.

#[global] Opaque subpreds۰auth.
#[global] Opaque subpreds۰frag.