From 453f5e30474bccc3ecbe451d70a490ac04db9c6e Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Thu, 21 Feb 2019 10:53:51 +0100 Subject: [PATCH] Add distributive laws for multisets. --- theories/gmultiset.v | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/theories/gmultiset.v b/theories/gmultiset.v index 77cb4b98..5bc6b2ed 100644 --- a/theories/gmultiset.v +++ b/theories/gmultiset.v @@ -169,6 +169,21 @@ Proof. intros X. apply gmultiset_eq; intros x. rewrite !multiplicity_intersection; lia. Qed. +Lemma gmultiset_union_intersection_l X Y Z : X ∪ (Y ∩ Z) = (X ∪ Y) ∩ (X ∪ Z). +Proof. + apply gmultiset_eq; intros y. + rewrite multiplicity_union, !multiplicity_intersection, !multiplicity_union. lia. +Qed. +Lemma gmultiset_union_intersection_r X Y Z : (X ∩ Y) ∪ Z = (X ∪ Z) ∩ (Y ∪ Z). +Proof. by rewrite <-!(comm_L _ Z), gmultiset_union_intersection_l. Qed. +Lemma gmultiset_intersection_union_l X Y Z : X ∩ (Y ∪ Z) = (X ∩ Y) ∪ (X ∩ Z). +Proof. + apply gmultiset_eq; intros y. + rewrite multiplicity_union, !multiplicity_intersection, !multiplicity_union. lia. +Qed. +Lemma gmultiset_intersection_union_r X Y Z : (X ∪ Y) ∩ Z = (X ∩ Z) ∪ (Y ∩ Z). +Proof. by rewrite <-!(comm_L _ Z), gmultiset_intersection_union_l. Qed. + (** For disjoint union (aka sum) *) Global Instance gmultiset_disj_union_comm : Comm (=@{gmultiset A}) (⊎). Proof. @@ -194,6 +209,24 @@ Qed. Global Instance gmultiset_disj_union_inj_2 X : Inj (=) (=) (⊎ X). Proof. intros Y1 Y2. rewrite <-!(comm_L _ X). apply (inj _). Qed. +Lemma gmultiset_disj_union_intersection_l X Y Z : X ⊎ (Y ∩ Z) = (X ⊎ Y) ∩ (X ⊎ Z). +Proof. + apply gmultiset_eq; intros y. + rewrite multiplicity_disj_union, !multiplicity_intersection, + !multiplicity_disj_union. lia. +Qed. +Lemma gmultiset_disj_union_intersection_r X Y Z : (X ∩ Y) ⊎ Z = (X ⊎ Z) ∩ (Y ⊎ Z). +Proof. by rewrite <-!(comm_L _ Z), gmultiset_disj_union_intersection_l. Qed. + +Lemma gmultiset_disj_union_union_l X Y Z : X ⊎ (Y ∪ Z) = (X ⊎ Y) ∪ (X ⊎ Z). +Proof. + apply gmultiset_eq; intros y. + rewrite multiplicity_disj_union, !multiplicity_union, + !multiplicity_disj_union. lia. +Qed. +Lemma gmultiset_disj_union_union_r X Y Z : (X ∪ Y) ⊎ Z = (X ⊎ Z) ∪ (Y ⊎ Z). +Proof. by rewrite <-!(comm_L _ Z), gmultiset_disj_union_union_l. Qed. + (** Misc *) Lemma gmultiset_non_empty_singleton x : {[ x ]} ≠@{gmultiset A} ∅. Proof. -- GitLab