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 subGーsubprops۰Σ Σ :
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۰authーne γ n :
Proper ((≡{n}≡) ==> (=) ==> (≡{n}≡)) (subprops۰auth γ).
#[global] Instance subprops۰authーproper γ :
Proper ((≡) ==> (=) ==> (≡)) (subprops۰auth γ).
#[global] Instance subprops۰fragーcontractive γ :
Contractive (subprops۰frag γ).
#[global] Instance subprops۰fragーproper γ :
Proper ((≡) ==> (≡)) (subprops۰frag γ).
Lemma subpropsーalloc P :
⊢ |==>
∃ γ,
subprops۰auth γ P false ∗
subprops۰frag γ P.
Lemma subpropsーwand `{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 subpropsーsplit `{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 subpropsーdivide `{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 subpropsーproduce γ P :
subprops۰auth γ P false -∗
P -∗
subprops۰auth γ P true.
Lemma subpropsーconsume `{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.
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 subGーsubprops۰Σ Σ :
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۰authーne γ n :
Proper ((≡{n}≡) ==> (=) ==> (≡{n}≡)) (subprops۰auth γ).
#[global] Instance subprops۰authーproper γ :
Proper ((≡) ==> (=) ==> (≡)) (subprops۰auth γ).
#[global] Instance subprops۰fragーcontractive γ :
Contractive (subprops۰frag γ).
#[global] Instance subprops۰fragーproper γ :
Proper ((≡) ==> (≡)) (subprops۰frag γ).
Lemma subpropsーalloc P :
⊢ |==>
∃ γ,
subprops۰auth γ P false ∗
subprops۰frag γ P.
Lemma subpropsーwand `{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 subpropsーsplit `{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 subpropsーdivide `{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 subpropsーproduce γ P :
subprops۰auth γ P false -∗
P -∗
subprops۰auth γ P true.
Lemma subpropsーconsume `{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.