diff --git a/algebra/upred_big_op.v b/algebra/upred_big_op.v index 5171b8325a336513ea5c2b93143c4d1ecc4b76c3..f33d83299d508ee5feb501143f1cb6916b796f65 100644 --- a/algebra/upred_big_op.v +++ b/algebra/upred_big_op.v @@ -1,5 +1,5 @@ From iris.algebra Require Export upred list. -From iris.prelude Require Import gmap fin_collections. +From iris.prelude Require Import gmap fin_collections functions. Import uPred. (** * Big ops over lists *) @@ -107,6 +107,13 @@ Section gmap. - apply big_sep_mono', Forall2_fmap, Forall_Forall2. apply Forall_forall=> -[i x] ? /=. by apply HΦ, elem_of_map_to_list. Qed. + Lemma big_sepM_proper Φ Ψ m1 m2 : + m1 ≡ m2 → (∀ x k, m1 !! k = Some x → m2 !! k = Some x → Φ k x ⊣⊢ Ψ k x) → + Π★{map m1} Φ ⊣⊢ Π★{map m2} Ψ. + Proof. + intros [??] ?; apply (anti_symm (⊢)); apply big_sepM_mono; + eauto using equiv_entails, equiv_entails_sym, lookup_weaken. + Qed. Global Instance big_sepM_ne m n : Proper (pointwise_relation _ (pointwise_relation _ (dist n)) ==> (dist n)) @@ -115,17 +122,14 @@ Section gmap. intros Φ1 Φ2 HΦ. apply big_sep_ne, Forall2_fmap. apply Forall_Forall2, Forall_true=> -[i x]; apply HΦ. Qed. - Global Instance big_sepM_proper m : + Global Instance big_sepM_proper' m : Proper (pointwise_relation _ (pointwise_relation _ (⊣⊢)) ==> (⊣⊢)) (uPred_big_sepM (M:=M) m). - Proof. - intros Φ1 Φ2 HΦ; apply equiv_dist=> n. - apply big_sepM_ne=> k x; apply equiv_dist, HΦ. - Qed. + Proof. intros Φ1 Φ2 HΦ. by apply big_sepM_proper; intros; last apply HΦ. Qed. Global Instance big_sepM_mono' m : Proper (pointwise_relation _ (pointwise_relation _ (⊢)) ==> (⊢)) (uPred_big_sepM (M:=M) m). - Proof. intros Φ1 Φ2 HΦ. apply big_sepM_mono; intros; [done|apply HΦ]. Qed. + Proof. intros Φ1 Φ2 HΦ. by apply big_sepM_mono; intros; last apply HΦ. Qed. Lemma big_sepM_empty Φ : Π★{map ∅} Φ ⊣⊢ True. Proof. by rewrite /uPred_big_sepM map_to_list_empty. Qed. @@ -167,6 +171,12 @@ Section gset. - apply big_sep_mono', Forall2_fmap, Forall_Forall2. apply Forall_forall=> x ? /=. by apply HΦ, elem_of_elements. Qed. + Lemma big_sepS_proper Φ Ψ X Y : + X ≡ Y → (∀ x, x ∈ X → x ∈ Y → Φ x ⊣⊢ Ψ x) → Π★{set X} Φ ⊣⊢ Π★{set Y} Ψ. + Proof. + intros [??] ?; apply (anti_symm (⊢)); apply big_sepS_mono; + eauto using equiv_entails, equiv_entails_sym. + Qed. Lemma big_sepS_ne X n : Proper (pointwise_relation _ (dist n) ==> dist n) (uPred_big_sepS (M:=M) X). @@ -174,27 +184,39 @@ Section gset. intros Φ1 Φ2 HΦ. apply big_sep_ne, Forall2_fmap. apply Forall_Forall2, Forall_true=> x; apply HΦ. Qed. - Lemma big_sepS_proper X : + Lemma big_sepS_proper' X : Proper (pointwise_relation _ (⊣⊢) ==> (⊣⊢)) (uPred_big_sepS (M:=M) X). - Proof. - intros Φ1 Φ2 HΦ; apply equiv_dist=> n. - apply big_sepS_ne=> x; apply equiv_dist, HΦ. - Qed. + Proof. intros Φ1 Φ2 HΦ. apply big_sepS_proper; naive_solver. Qed. Lemma big_sepS_mono' X : Proper (pointwise_relation _ (⊢) ==> (⊢)) (uPred_big_sepS (M:=M) X). Proof. intros Φ1 Φ2 HΦ. apply big_sepS_mono; naive_solver. Qed. Lemma big_sepS_empty Φ : Π★{set ∅} Φ ⊣⊢ True. Proof. by rewrite /uPred_big_sepS elements_empty. Qed. + Lemma big_sepS_insert Φ X x : x ∉ X → Π★{set {[ x ]} ∪ X} Φ ⊣⊢ (Φ x ★ Π★{set X} Φ). Proof. intros. by rewrite /uPred_big_sepS elements_union_singleton. Qed. + Lemma big_sepS_insert' (Ψ : A → uPred M → uPred M) Φ X x P : + x ∉ X → + Π★{set {[ x ]} ∪ X} (λ y, Ψ y (<[x:=P]> Φ y)) + ⊣⊢ (Ψ x P ★ Π★{set X} (λ y, Ψ y (Φ y))). + Proof. + intros. rewrite big_sepS_insert // fn_lookup_insert. + apply sep_proper, big_sepS_proper; auto=> y ??. + by rewrite fn_lookup_insert_ne; last set_solver. + Qed. + Lemma big_sepS_insert'' Φ X x P : + x ∉ X → Π★{set {[ x ]} ∪ X} (<[x:=P]> Φ) ⊣⊢ (P ★ Π★{set X} Φ). + Proof. apply (big_sepS_insert' (λ y, id)). Qed. + Lemma big_sepS_delete Φ X x : x ∈ X → Π★{set X} Φ ⊣⊢ (Φ x ★ Π★{set X ∖ {[ x ]}} Φ). Proof. intros. rewrite -big_sepS_insert; last set_solver. by rewrite -union_difference_L; last set_solver. Qed. + Lemma big_sepS_singleton Φ x : Π★{set {[ x ]}} Φ ⊣⊢ (Φ x). Proof. intros. by rewrite /uPred_big_sepS elements_singleton /= right_id. Qed.