diff --git a/theories/fin_maps.v b/theories/fin_maps.v index 050861bcd078e6e4d41db47e37ee19a38532f8f2..0fda1a27d4490ed3c21ab0eba2649ac008a42cbd 100644 --- a/theories/fin_maps.v +++ b/theories/fin_maps.v @@ -2595,6 +2595,49 @@ Section map_kmap. map_kmap f (alter g i m) = alter g (f i) (map_kmap f m). Proof. apply map_kmap_partial_alter. Qed. + Lemma map_kmap_merge {A B C} (g : option A → option B → option C) + `{!DiagNone g} (m1 : M1 A) (m2 : M1 B) : + map_kmap f (merge g m1 m2) = merge g (map_kmap f m1) (map_kmap f m2). + Proof. + apply map_eq; intros j. apply option_eq; intros y. + rewrite (lookup_merge g), lookup_map_kmap_Some. + setoid_rewrite (lookup_merge g). split. + { intros [i [-> ?]]. by rewrite !lookup_map_kmap. } + intros Hg. destruct (map_kmap f m1 !! j) as [x1|] eqn:Hm1. + { apply lookup_map_kmap_Some in Hm1 as (i&->&Hm1i). + exists i. split; [done|]. by rewrite Hm1i, <-lookup_map_kmap. } + destruct (map_kmap f m2 !! j) as [x2|] eqn:Hm2. + { apply lookup_map_kmap_Some in Hm2 as (i&->&Hm2i). + exists i. split; [done|]. by rewrite Hm2i, <-lookup_map_kmap, Hm1. } + unfold DiagNone in *. naive_solver. + Qed. + Lemma map_kmap_union_with {A} (g : A → A → option A) (m1 m2 : M1 A) : + map_kmap f (union_with g m1 m2) + = union_with g (map_kmap f m1) (map_kmap f m2). + Proof. apply (map_kmap_merge _). Qed. + Lemma map_kmap_intersection_with {A} (g : A → A → option A) (m1 m2 : M1 A) : + map_kmap f (intersection_with g m1 m2) + = intersection_with g (map_kmap f m1) (map_kmap f m2). + Proof. apply (map_kmap_merge _). Qed. + Lemma map_kmap_difference_with {A} (g : A → A → option A) (m1 m2 : M1 A) : + map_kmap f (difference_with g m1 m2) + = difference_with g (map_kmap f m1) (map_kmap f m2). + Proof. apply (map_kmap_merge _). Qed. + + Lemma map_kmap_union {A} (m1 m2 : M1 A) : + map_kmap f (m1 ∪ m2) = map_kmap f m1 ∪ map_kmap f m2. + Proof. apply map_kmap_union_with. Qed. + Lemma map_kmap_intersection {A} (m1 m2 : M1 A) : + map_kmap f (m1 ∩ m2) = map_kmap f m1 ∩ map_kmap f m2. + Proof. apply map_kmap_intersection_with. Qed. + Lemma map_kmap_difference {A} (m1 m2 : M1 A) : + map_kmap f (m1 ∖ m2) = map_kmap f m1 ∖ map_kmap f m2. + Proof. apply (map_kmap_merge _). Qed. + + Lemma map_kmap_zip_with {A B C} (g : A → B → C) (m1 : M1 A) (m2 : M1 B) : + map_kmap f (map_zip_with g m1 m2) = map_zip_with g (map_kmap f m1) (map_kmap f m2). + Proof. by apply map_kmap_merge. Qed. + Lemma map_kmap_imap {A B} (g : K2 → A → option B) (m : M1 A) : map_kmap f (map_imap (g ∘ f) m) = map_imap g (map_kmap f m). Proof.