(* Proof of lem_index_inter                                                *)
intros.
unfold App in |- *.
elim
(axs_comprehension (fun z : E => exists y : E, In (couple i y) a /\ In z y)
(reunion (Img a)) x); intros; apply H2; clear H1 H2;
intros.
unfold Einter in H.
elim
(axs_comprehension
(fun v0 : E => forall v3 : E, In v3 (index a I funa doma) -> In v0 v3)
(reunion (index a I funa doma)) x); intros; generalize (H1 H);
clear H H1 H2; intros.
elim H; clear H; intros.
generalize H; clear H; rewrite (lem_index_prop a I funa doma); intros.
split; [ auto with zfc | exists (App a funa i); split ].
generalize H0; rewrite <- doma; intros.
generalize (lem_App a i funa H2); intros.
elim H3; clear H3; intros; elim H3; clear H3; intros.
generalize (lem_eval_propertie a i x0 funa H4); intros.
rewrite <- H5; auto with zfc.
apply (H1 (App a funa i)); clear H1; intros.
unfold index in |- *.
elim (axs_comprehension (fun _ : E => True) (Img a) (App a funa i)); intros;
apply H2; clear H1 H2; intros.
split; [ idtac | auto with zfc ].
generalize H0; rewrite <- doma; intros.
generalize (lem_eval_prop2 a i funa H1); intros.
exact (lem_fun_and_img a i (App a funa i) funa H2).
Qed.
(* End of proof of lem_index_inter                                         *)
(***************************************************************************)
(***************************************************************************)
(* Produit d'une famille d'ensembles                                       *)
(***************************************************************************)
(***************************************************************************)
Definition produit (a I : E) (funa : fun_ a) (doma : dom a = I) :=
subset
(fun f : E =>
forall i : E,
In i I ->
exUniq _ (fun y : E => In (couple i y) f /\ In y (App a funa i)))
(exp (reunion (index a I funa doma)) I).

Lemma lem_f_in_prod_is_fun :
forall (a I : E) (funa : fun_ a) (doma : dom a = I) (f : E),
In f (produit a I funa doma) -> fun_ f.