red in |- *; intros.
assert (has_at_most_n_elements m A).
exists n.
split; auto with arith.
generalize (has_n_elements_by_at_least_at_most H1 H2).
intro.
assert (n =' m in _).
assert (has_n_elements n (full A)).
apply full_preserves_has_n_elements; auto with algebra.
assert (has_n_elements m (full A)).
apply full_preserves_has_n_elements; auto with algebra.
apply (has_n_elements_inj H4 H5); auto with algebra.
rewrite H4 in H0.
generalize lt_irrefl; intro p; red in p.
apply p with m; auto with algebra.
Qed.

(* Specifications: *)
Lemma union_has_at_most_n_plus_m_elements :
forall (A : Setoid) (B C : part_set A) (n m : Nat),
has_n_elements n B ->
has_n_elements m C -> has_at_most_n_elements (n + m) (union B C).