(** uniset union *)
Definition union (m1 m2:uniset) :=
  Charac (fun a:A => orb (charac m1 a) (charac m2 a)).

(* Specifications: *)
Lemma union_empty_left : forall x:uniset, seq x (union Emptyset x).
Lemma union_empty_right : forall x:uniset, seq x (union x Emptyset).
Lemma union_comm : forall x y:uniset, seq (union x y) (union y x).
Lemma union_ass : forall x y z:uniset, seq (union (union x y) z) (union x (union y z)).
Lemma seq_left : forall x y z:uniset, seq x y -> seq (union x z) (union y z).
Lemma seq_right : forall x y z:uniset, seq x y -> seq (union z x) (union z y).
Lemma union_rotate : forall x y z:uniset, seq (union x (union y z)) (union z (union x y)).
Lemma seq_congr : forall x y z t:uniset, seq x y -> seq z t -> seq (union x z) (union y t).
Lemma union_perm_left : forall x y z:uniset, seq (union x (union y z)) (union y (union x z)).
Lemma uniset_twist1 : forall x y z t:uniset, seq (union x (union (union y z) t)) (union (union y (union x t)) z).
Lemma uniset_twist2 : forall x y z t:uniset, seq (union x (union (union y z) t)) (union (union y (union x z)) t).
Lemma treesort_twist1 : forall x y z t u:uniset, seq u (union y z) -> seq (union x (union u t)) (union (union y (union x t)) z).
Lemma treesort_twist2 : forall x y z t u:uniset, seq u (union y z) -> seq (union x (union u t)) (union (union y (union x z)) t).