Library zoo.iris.base_logic.lib.subprops

Require Import iris.base_logic.lib.fancy_updates.

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

Implicit Type state : bool.

Class SubpropsG Σ :=
  { #[local] subprops۰G۰subpreds۰G :: SubpredsG Σ ()
  }.

Definition subprops۰Σ :=
  #[subpreds۰Σ ()
  ].
#[global] Instance subGsubprops۰Σ Σ :
  subG subprops۰Σ Σ
  SubpropsG Σ.

Section subprops۰G.
  Context `{subprops۰G : !SubpropsG Σ}.

  Implicit Type P Q : iProp Σ.

  Definition subprops۰auth γ P state :=
    subpreds۰auth γ (λ _, P) (if state then Some () else None).

  Definition subprops۰frag γ Q :=
    subpreds۰frag γ (λ _, Q).

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

  Lemma subpropsalloc P :
     |==>
       γ,
      subprops۰auth γ P false
      subprops۰frag γ P.

  Lemma subpropswand `{inv۰G : !invGS Σ} {γ P state Q1} Q2 E :
     subprops۰auth γ P state -∗
    subprops۰frag γ Q1 -∗
    (Q1 -∗ Q2) ={E}=∗
       subprops۰auth γ P state
      subprops۰frag γ Q2.
  Lemma subpropssplit `{inv۰G : !invGS Σ} {γ P state} Q1 Q2 E :
     subprops۰auth γ P state -∗
    subprops۰frag γ (Q1 Q2) ={E}=∗
       subprops۰auth γ P state
      subprops۰frag γ Q1
      subprops۰frag γ Q2.
  Lemma subpropsdivide `{inv۰G : !invGS Σ} {γ P state} Qs E :
     subprops۰auth γ P state -∗
    subprops۰frag γ ([∗ list] Q Qs, Q) ={E}=∗
       subprops۰auth γ P state
      [∗ list] Q Qs, subprops۰frag γ Q.

  Lemma subpropsproduce γ P :
    subprops۰auth γ P false -∗
    P -∗
    subprops۰auth γ P true.

  Lemma subpropsconsume `{inv۰G : !invGS Σ} γ P Q E :
     subprops۰auth γ P true -∗
    subprops۰frag γ Q ={E}=∗
       subprops۰auth γ P true
      ▷^2 Q.
End subprops۰G.

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