(*									*)
(*  UNION :								*)
(*    On definit ici l'union de 2 ensembles. On remarquera qu'un 	*)
(*    peut apparaitre plusieurs fois dans un ensemble, et que c'est     *)
(*    pour cela que l'on utilise 					*)
(*      union E (add x F) -> add x (union E F)				*)
(*    directement.							*)
(*									*)

Fixpoint union (A : Ensf) : Ensf -> Ensf :=
  fun B : Ensf =>
  match A return Ensf with
  | empty =>
      (* empty *)  B
      (* add   *) 
  | add x e => add x (union e B)
  end.

(* Specifications: *)
Lemma union_a_empty : forall a : Ensf, a = union a empty :>Ensf.
Lemma dans_union : forall (x : Elt) (a b : Ensf), dans x (union a b) -> dans x a \/ dans x b.
Lemma union_g : forall (x : Elt) (a b : Ensf), dans x a -> dans x (union a b).
Lemma union_d : forall (x : Elt) (a b : Ensf), dans x b -> dans x (union a b).
Lemma dans_union_inv : forall (x : Elt) (a b : Ensf), dans x a \/ dans x b -> dans x (union a b).