(* Proof of lem_couple_reunion_prop                                        *)
intros.
split.
elim (axs_reunion (reunion z) x); intros; apply H1; clear H0 H1; intros.
exists (singleton x); split; [ idtac | apply lem_x_in_sing_x ].
elim (axs_reunion z (singleton x)); intros; apply H1; clear H0 H1; intros.
exists (couple x y); split;
[ auto with zfc
| elim (axs_paire (singleton x) (paire x y) (singleton x)); intros; apply H1;
left; reflexivity ].
elim (axs_reunion (reunion z) y); intros; apply H1; clear H0 H1; intros.
exists (paire x y); split;
[ idtac | elim (axs_paire x y y); intros; apply H1; right; reflexivity ].
elim (axs_reunion z (paire x y)); intros; apply H1; clear H0 H1; intros.
exists (couple x y); split;
[ auto with zfc
| elim (axs_paire (singleton x) (paire x y) (paire x y)); intros; apply H1;
right; reflexivity ].
Qed.
(* End of proof of lem_couple_reunion_prop                                 *)
(***************************************************************************)
(*                        Les n-uplets                                     *)
(***************************************************************************)
Inductive isTupple : nat -> E -> Prop :=
| c_0_tupple : isTupple 0 Vide
| c_1_tupple : forall a : E, isTupple 1 a
| c_2_tupple : forall a b : E, isTupple 2 (couple a b)
| c_n_tupple :
forall (a b : E) (n : nat),
isTupple (S (S n)) b -> isTupple (S (S (S n))) (couple a b).
Fixpoint cart_power (m : nat) : E -> E :=
fun a : E =>
match m with
| O => Vide
| S O => a
| S (S n as N) => cartesien a (cart_power N a)
end.

(* Specifications: *)
Lemma cart_power_eq1 : forall a : E, cart_power 0 a = Vide.
Lemma cart_power_eq2 : forall a : E, cart_power 1 a = a.
Lemma cart_power_eq3 :
forall (n : nat) (a : E),
cart_power (S (S n)) a = cartesien a (cart_power (S n) a).
Lemma lem_eq_cart_power : forall a : E, cart_power 2 a = cartesien a a.
intros; rewrite (cart_power_eq3 0 a); rewrite (cart_power_eq2 a); reflexivity.