let I be set ; :: thesis: for C being Category
for c being Object of C
for F being Projections_family of c,I st c is_a_product_wrt F & ( for x1, x2 being set st x1 in I & x2 in I holds
Hom ((cod (F /. x1)),(cod (F /. x2))) <> {} ) holds
for x being set st x in I holds
for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction

let C be Category; :: thesis: for c being Object of C
for F being Projections_family of c,I st c is_a_product_wrt F & ( for x1, x2 being set st x1 in I & x2 in I holds
Hom ((cod (F /. x1)),(cod (F /. x2))) <> {} ) holds
for x being set st x in I holds
for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction

let c be Object of C; :: thesis: for F being Projections_family of c,I st c is_a_product_wrt F & ( for x1, x2 being set st x1 in I & x2 in I holds
Hom ((cod (F /. x1)),(cod (F /. x2))) <> {} ) holds
for x being set st x in I holds
for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction

let F be Projections_family of c,I; :: thesis: ( c is_a_product_wrt F & ( for x1, x2 being set st x1 in I & x2 in I holds
Hom ((cod (F /. x1)),(cod (F /. x2))) <> {} ) implies for x being set st x in I holds
for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction )

assume that
A1: c is_a_product_wrt F and
A2: for x1, x2 being set st x1 in I & x2 in I holds
Hom ((cod (F /. x1)),(cod (F /. x2))) <> {} ; :: thesis: for x being set st x in I holds
for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction

let x be set ; :: thesis: ( x in I implies for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction )

assume A3: x in I ; :: thesis: for d being Object of C st d = cod (F /. x) & Hom (c,d) <> {} holds
for f being Morphism of c,d st f = F /. x holds
f is retraction

let d be Object of C; :: thesis: ( d = cod (F /. x) & Hom (c,d) <> {} implies for f being Morphism of c,d st f = F /. x holds
f is retraction )

assume that
A4: d = cod (F /. x) and
A5: Hom (c,d) <> {} ; :: thesis: for f being Morphism of c,d st f = F /. x holds
f is retraction

let f be Morphism of c,d; :: thesis: ( f = F /. x implies f is retraction )
assume A6: f = F /. x ; :: thesis: f is retraction
defpred S1[ object , object ] means ( ( \$1 = x implies \$2 = id d ) & ( \$1 <> x implies \$2 in Hom (d,(cod (F /. \$1))) ) );
A7: for y being object st y in I holds
ex z being object st
( z in the carrier' of C & S1[y,z] )
proof
let y be object ; :: thesis: ( y in I implies ex z being object st
( z in the carrier' of C & S1[y,z] ) )

set z = the Element of Hom (d,(cod (F /. y)));
assume y in I ; :: thesis: ex z being object st
( z in the carrier' of C & S1[y,z] )

then A8: Hom (d,(cod (F /. y))) <> {} by A2, A3, A4;
then A9: the Element of Hom (d,(cod (F /. y))) in Hom (d,(cod (F /. y))) ;
per cases ( y = x or y <> x ) ;
suppose A10: y = x ; :: thesis: ex z being object st
( z in the carrier' of C & S1[y,z] )

take z = id d; :: thesis: ( z in the carrier' of C & S1[y,z] )
thus z in the carrier' of C ; :: thesis: S1[y,z]
thus S1[y,z] by A10; :: thesis: verum
end;
suppose A11: y <> x ; :: thesis: ex z being object st
( z in the carrier' of C & S1[y,z] )

take the Element of Hom (d,(cod (F /. y))) ; :: thesis: ( the Element of Hom (d,(cod (F /. y))) in the carrier' of C & S1[y, the Element of Hom (d,(cod (F /. y)))] )
thus the Element of Hom (d,(cod (F /. y))) in the carrier' of C by A9; :: thesis: S1[y, the Element of Hom (d,(cod (F /. y)))]
thus S1[y, the Element of Hom (d,(cod (F /. y)))] by ; :: thesis: verum
end;
end;
end;
consider F9 being Function such that
A12: ( dom F9 = I & rng F9 c= the carrier' of C ) and
A13: for y being object st y in I holds
S1[y,F9 . y] from reconsider F9 = F9 as Function of I, the carrier' of C by ;
now :: thesis: for y being set st y in I holds
(doms F9) /. y = (I --> d) /. y
let y be set ; :: thesis: ( y in I implies (doms F9) /. y = (I --> d) /. y )
assume A14: y in I ; :: thesis: (doms F9) /. y = (I --> d) /. y
then A15: F9 . y = F9 /. y by FUNCT_2:def 13;
then A16: ( y <> x implies F9 /. y in Hom (d,(cod (F /. y))) ) by ;
( y = x implies F9 /. y = id d ) by ;
then dom (F9 /. y) = d by ;
hence (doms F9) /. y = d by
.= (I --> d) /. y by ;
:: thesis: verum
end;
then A17: F9 is Projections_family of d,I by ;
now :: thesis: for y being set st y in I holds
(cods F9) /. y = (cods F) /. y
let y be set ; :: thesis: ( y in I implies (cods F9) /. y = (cods F) /. y )
assume A18: y in I ; :: thesis: (cods F9) /. y = (cods F) /. y
then A19: F9 . y = F9 /. y by FUNCT_2:def 13;
then A20: ( y <> x implies F9 /. y in Hom (d,(cod (F /. y))) ) by ;
( y = x implies F9 /. y = id d ) by ;
then cod (F9 /. y) = cod (F /. y) by ;
hence (cods F9) /. y = cod (F /. y) by
.= (cods F) /. y by ;
:: thesis: verum
end;
then consider i being Morphism of C such that
A21: i in Hom (d,c) and
A22: for k being Morphism of C st k in Hom (d,c) holds
( ( for y being set st y in I holds
(F /. y) (*) k = F9 /. y ) iff i = k ) by A1, A17, Th1;
reconsider i = i as Morphism of d,c by ;
thus ( Hom (c,d) <> {} & Hom (d,c) <> {} ) by ; :: according to CAT_3:def 8 :: thesis: ex g being Morphism of d,c st f * g = id d
take i ; :: thesis: f * i = id d
thus f * i = f (*) i by
.= F9 /. x by A3, A21, A22, A6
.= F9 . x by
.= id d by ; :: thesis: verum