(** multiset union *)
  Definition munion (m1 m2:multiset) :=
    Bag (fun a:A => multiplicity m1 a + multiplicity m2 a).

(* Specifications: *)
Lemma munion_empty_left : forall x:multiset, meq x (munion EmptyBag x).
Lemma munion_empty_right : forall x:multiset, meq x (munion x EmptyBag).
Lemma munion_comm : forall x y:multiset, meq (munion x y) (munion y x).
Lemma munion_ass : forall x y z:multiset, meq (munion (munion x y) z) (munion x (munion y z)).
Lemma meq_left : forall x y z:multiset, meq x y -> meq (munion x z) (munion y z).
Lemma meq_right : forall x y z:multiset, meq x y -> meq (munion z x) (munion z y).
Lemma munion_rotate : forall x y z:multiset, meq (munion x (munion y z)) (munion z (munion x y)).
Lemma meq_congr : forall x y z t:multiset, meq x y -> meq z t -> meq (munion x z) (munion y t).
Lemma munion_perm_left : forall x y z:multiset, meq (munion x (munion y z)) (munion y (munion x z)).
Lemma multiset_twist1 : forall x y z t:multiset, meq (munion x (munion (munion y z) t)) (munion (munion y (munion x t)) z).
Lemma multiset_twist2 : forall x y z t:multiset, meq (munion x (munion (munion y z) t)) (munion (munion y (munion x z)) t).
Lemma treesort_twist1 : forall x y z t u:multiset, meq u (munion y z) -> meq (munion x (munion u t)) (munion (munion y (munion x t)) z).
Lemma treesort_twist2 : forall x y z t u:multiset, meq u (munion y z) -> meq (munion x (munion u t)) (munion (munion y (munion x z)) t).
Lemma meq_singleton : forall a a', eqA a a' -> meq (SingletonBag a) (SingletonBag a').