diff --git a/iris/bi/big_op.v b/iris/bi/big_op.v index 323b2e2c22cb044e0092447781797b7ca1dc1452..a2c17f4bef5c5658d83e7b9343c0de1a3432b4d6 100644 --- a/iris/bi/big_op.v +++ b/iris/bi/big_op.v @@ -1137,6 +1137,27 @@ Section map. ([∗ map] k↦y ∈ <[i:=x]> m, <[i:=P]> Φ k) ⊣⊢ (P ∗ [∗ map] k↦y ∈ m, Φ k). Proof. apply big_opM_fn_insert'. Qed. + Lemma big_sepM_filter' Φ (P : K * A → Prop) `{∀ k, Decision (P k)} m : + ([∗ map] k ↦ x ∈ filter P m, Φ k x) ⊣⊢ + ([∗ map] k ↦ x ∈ m, if decide (P (k, x)) then Φ k x else emp). + Proof. + induction m as [|k v m ? IH] using map_ind. + { by rewrite map_filter_empty !big_sepM_empty. } + destruct (decide (P (k, v))). + - rewrite map_filter_insert //. + rewrite !big_sepM_insert //. + * by rewrite decide_True // IH. + * apply map_filter_lookup_None; eauto. + - rewrite map_filter_insert_not' //; last by congruence. + rewrite !big_sepM_insert // decide_False // IH. rewrite left_id. eauto. + Qed. + + Lemma big_sepM_filter `{BiAffine PROP} + Φ (P : K * A → Prop) `{∀ k, Decision (P k)} m : + ([∗ map] k ↦ x ∈ filter P m, Φ k x) ⊣⊢ + ([∗ map] k ↦ x ∈ m, ⌜P (k, x)⌠→ Φ k x). + Proof. setoid_rewrite <-decide_emp. apply big_sepM_filter'. Qed. + Lemma big_sepM_union Φ m1 m2 : m1 ##ₘ m2 → ([∗ map] k↦y ∈ m1 ∪ m2, Φ k y)