From aa62dfcd5ede1dfec307adc9ccd88b5818e57a8b Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Fri, 21 May 2021 13:50:24 +0200 Subject: [PATCH] add big_sepS_pure --- iris/bi/big_op.v | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/iris/bi/big_op.v b/iris/bi/big_op.v index b24289e26..8026baf6f 100644 --- a/iris/bi/big_op.v +++ b/iris/bi/big_op.v @@ -2000,6 +2000,36 @@ Section gset. ([∗ set] y ∈ X, Φ y ∧ Ψ y) ⊢ ([∗ set] y ∈ X, Φ y) ∧ ([∗ set] y ∈ X, Ψ y). Proof. auto using and_intro, big_sepS_mono, and_elim_l, and_elim_r. Qed. + Lemma big_sepS_pure_1 (φ : A → Prop) X : + ([∗ set] y ∈ X, ⌜φ yâŒ) ⊢@{PROP} ⌜set_Forall φ XâŒ. + Proof. + induction X as [|x X ? IH] using set_ind_L. + { apply pure_intro, set_Forall_empty. } + rewrite big_sepS_insert // IH sep_and -pure_and. + f_equiv=>-[Hx HX]. apply set_Forall_union. + - apply set_Forall_singleton. done. + - done. + Qed. + Lemma big_sepS_affinely_pure_2 (φ : A → Prop) X : + <affine> ⌜set_Forall φ X⌠⊢@{PROP} ([∗ set] y ∈ X, <affine> ⌜φ yâŒ). + Proof. + induction X as [|x X ? IH] using set_ind_L. + { rewrite big_sepS_empty. apply affinely_elim_emp. } + rewrite big_sepS_insert // -IH. + rewrite -persistent_and_sep_1 -affinely_and -pure_and. + f_equiv. f_equiv=>HX. split. + - apply HX. set_solver+. + - apply set_Forall_union_inv_2 in HX. done. + Qed. + (** The general backwards direction requires [BiAffine] to cover the empty case. *) + Lemma big_sepS_pure `{!BiAffine PROP} (φ : A → Prop) X : + ([∗ set] y ∈ X, ⌜φ yâŒ) ⊣⊢@{PROP} ⌜set_Forall φ XâŒ. + Proof. + apply (anti_symm (⊢)); first by apply big_sepS_pure_1. + rewrite -(affine_affinely ⌜_âŒ%I). + rewrite big_sepS_affinely_pure_2. by setoid_rewrite affinely_elim. + Qed. + Lemma big_sepS_persistently `{BiAffine PROP} Φ X : <pers> ([∗ set] y ∈ X, Φ y) ⊣⊢ [∗ set] y ∈ X, <pers> (Φ y). Proof. apply (big_opS_commute _). Qed. -- GitLab