(*									*)
(*  MAP "a la CAML"							*)
(*    On definit une fonction map qui applique une fonction a tous les  *)
(*    elements d'un ensemble et renvoie l'ensemble des resultats	*)
(*    Ceci permet, entre autres, de definir facilement l'union		*)
(*    disjointe (Voir ci-dessous)					*)
(*									*)
Fixpoint map (f : Elt -> Elt) (e : Ensf) {struct e} : Ensf :=
  match e with
  | empty => empty
  | add y e => add (f y) (map f e)
  end.

(* Specifications: *)
Lemma dans_map : forall (f : Elt -> Elt) (a : Ensf) (x : Elt), dans x (map f a) -> exists y : Elt, dans y a /\ x = f y.
Lemma dans_map_inv : forall (f : Elt -> Elt) (x : Elt) (a : Ensf), dans x a -> dans (f x) (map f a).
Lemma map_union : forall (f : Elt -> Elt) (a b : Ensf), union (map f a) (map f b) = map f (union a b) :>Ensf.
Lemma dans_map_trans : forall (x : Elt) (f : Elt -> Elt) (a b : Ensf), dans x (map f a) -> inclus a b -> dans x (map f b).
Lemma map_egal : forall (f g : Elt -> Elt) (E : Ensf), (forall x : Elt, dans x E -> f x = g x :>Elt) -> map f E = map g E :>Ensf.
Lemma map_inclus : forall (a b : Ensf) (f : Elt -> Elt), inclus a b -> inclus (map f a) (map f b).