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 subGーsubpreds۰Σ Σ 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۰authーne γ n :
Proper (
(pointwise_relation _ (≡{n}≡)) ==>
(=) ==>
(≡{n}≡)
) (subpreds۰auth γ).
#[global] Instance subpreds۰authーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(=) ==>
(≡)
) (subpreds۰auth γ).
#[global] Instance subpreds۰fragーcontractive γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (subpreds۰frag γ).
#[global] Instance subpreds۰fragーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (subpreds۰frag γ).
Lemma subpredsーalloc Ψ :
⊢ |==>
∃ γ,
subpreds۰auth γ Ψ None ∗
subpreds۰frag γ Ψ.
Lemma subpredsーsplitーwand `{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 subpredsーwand `{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 subpredsーsplit `{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 subpredsーdivide `{inv۰G : !invGS Σ} {γ Ψ state} Χs E :
▷ subpreds۰auth γ Ψ state -∗
subpreds۰frag γ (λ x, [∗ list] Χ ∈ Χs, Χ x) ={E}=∗
▷ subpreds۰auth γ Ψ state ∗
[∗ list] Χ ∈ Χs, subpreds۰frag γ Χ.
Lemma subpredsーproduce {γ Ψ} x :
subpreds۰auth γ Ψ None -∗
Ψ x -∗
subpreds۰auth γ Ψ (Some x).
Lemma subpredsーconsume `{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.
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 subGーsubpreds۰Σ Σ 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۰authーne γ n :
Proper (
(pointwise_relation _ (≡{n}≡)) ==>
(=) ==>
(≡{n}≡)
) (subpreds۰auth γ).
#[global] Instance subpreds۰authーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(=) ==>
(≡)
) (subpreds۰auth γ).
#[global] Instance subpreds۰fragーcontractive γ n :
Proper (
(pointwise_relation _ (dist_later n)) ==>
(≡{n}≡)
) (subpreds۰frag γ).
#[global] Instance subpreds۰fragーproper γ :
Proper (
(pointwise_relation _ (≡)) ==>
(≡)
) (subpreds۰frag γ).
Lemma subpredsーalloc Ψ :
⊢ |==>
∃ γ,
subpreds۰auth γ Ψ None ∗
subpreds۰frag γ Ψ.
Lemma subpredsーsplitーwand `{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 subpredsーwand `{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 subpredsーsplit `{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 subpredsーdivide `{inv۰G : !invGS Σ} {γ Ψ state} Χs E :
▷ subpreds۰auth γ Ψ state -∗
subpreds۰frag γ (λ x, [∗ list] Χ ∈ Χs, Χ x) ={E}=∗
▷ subpreds۰auth γ Ψ state ∗
[∗ list] Χ ∈ Χs, subpreds۰frag γ Χ.
Lemma subpredsーproduce {γ Ψ} x :
subpreds۰auth γ Ψ None -∗
Ψ x -∗
subpreds۰auth γ Ψ (Some x).
Lemma subpredsーconsume `{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.