(*  On definit maintenant (sup x) pour un ensemble x, qui est		*)
(*    - soit O, si x ne contient pas d'entier				*)
(*    - soit (S n), si n est le plus grand entier de x			*)
(*									*)

(*
Definition Z : Elt -> nat :=
  [x:Elt]
    (<nat>Case x of
	(* natural *) [n:nat](S n)
	(* couple  *) [a:Elt][b:Elt]O
	(* up      *) [e:Ensf]O
	(* word    *) [w:Word]O
    end ).
*)

Definition Z (x : Elt) : nat := match x with
                                | natural n => S n
                                | _ => 0
                                end.(*
Fixpoint sup [e:Ensf] : nat :=
    (<nat>Case e of
	(* empty *) O	
	(* add   *) [x:Elt][f:Ensf](max (Z x) (sup f))
    end ).
*)

Fixpoint sup (e : Ensf) : nat :=
  match e with
  | empty => 0
  | add x f => max (Z x) (sup f)
  end.

(* Specifications: *)
Lemma sup_add : forall (x : Elt) (e : Ensf), sup (add x e) = max (Z x) (sup e) :>nat.
Lemma elt_not_sym : forall a b : Elt, a <> b :>Elt -> b <> a :>Elt.
Lemma lt_n_Z : forall n : nat, n < Z (natural n).
Lemma lt_n_sup : forall (x : Ensf) (n : nat), dans (natural n) x -> n < sup x.
Lemma sup_out : forall x : Ensf, ~ dans (natural (sup x)) x.
Lemma exist_other : forall e : Ensf, exists x : Elt, ~ dans x e.