### Products and Coproducts in Categories

by
Czeslaw Bylinski

Copyright (c) 1992 Association of Mizar Users

MML identifier: CAT_3
[ MML identifier index ]

```environ

vocabulary CAT_1, FUNCT_1, FINSEQ_4, RELAT_1, FUNCOP_1, FUNCT_4, BOOLE,
FUNCT_6, OPPCAT_1, WELLORD1, CAT_3;
notation TARSKI, XBOOLE_0, SUBSET_1, RELAT_1, FUNCT_1, FUNCOP_1, FUNCT_4,
FUNCT_2, FINSEQ_4, CAT_1, OPPCAT_1;
constructors OPPCAT_1, FINSEQ_4, MEMBERED, XBOOLE_0;
clusters RELSET_1, MEMBERED, ZFMISC_1, XBOOLE_0;
requirements SUBSET, BOOLE;
definitions CAT_1;
theorems TARSKI, FUNCT_2, FUNCOP_1, FUNCT_4, CAT_1, OPPCAT_1, FINSEQ_4,
RELSET_1, PARTFUN1;
schemes FUNCT_2, COMPTS_1;

begin :: Indexed families

reserve I for set, x,x1,x2,y,z for set, A for non empty set;
reserve C,D for Category;
reserve a,b,c,d for Object of C;
reserve f,g,h,i,j,k,p1,p2,q1,q2,i1,i2,j1,j2 for Morphism of C;

definition let I,A; let F be Function of I,A; let x be set;
assume
A1:  x in I;
redefine func F/.x equals
:Def1:   F.x;
compatibility
proof let a be Element of A;
x in dom F by A1,FUNCT_2:def 1;
hence a = F/.x iff a = F.x by FINSEQ_4:def 4;
end;
end;

scheme LambdaIdx{I()->set,A()->non empty set,F(set)->Element of A()}:
ex F being Function of I(),A() st for x st x in I() holds F/.x = F(x)
proof
deffunc f(set) = F(\$1);
A1:  for x st x in I() holds f(x) in A();
consider IT being Function of I(),A() such that
A2:  for x st x in I() holds IT.x = f(x) from Lambda1(A1);
take IT;
let x; assume
A3:  x in I();
hence F(x) = IT.x by A2 .= IT/.x by A3,Def1;
end;

theorem Th1:
for F1,F2 being Function of I,A st for x st x in I holds F1/.x = F2/.x
holds F1 = F2
proof let F1,F2 be Function of I,A such that
A1:  for x st x in I holds F1/.x = F2/.x;
now let x; assume
A2:   x in I;
hence F1.x = F1/.x by Def1 .= F2/.x by A1,A2 .= F2.x by A2,Def1;
end;
hence thesis by FUNCT_2:18;
end;

scheme FuncIdx_correctness{I()->set,A()->non empty set,F(set)->Element of A()}:
(ex F being Function of I(),A() st for x st x in I() holds F/.x = F(x)) &
(for F1,F2 being Function of I(),A() st
(for x st x in I() holds F1/.x = F(x)) &
(for x st x in I() holds F2/.x = F(x))
holds F1 = F2)
proof
deffunc f(set) = F(\$1);
thus ex F being Function of I(),A() st for x st x in I() holds F/.x = f(x)
from LambdaIdx;
let F1,F2 be Function of I(),A() such that
A1:  for x st x in I() holds F1/.x = F(x) and
A2:  for x st x in I() holds F2/.x = F(x);
now let x; assume
A3:  x in I();
hence F1/.x = F(x) by A1 .= F2/.x by A2,A3;
end;
hence thesis by Th1;
end;

definition let A,I; let a be Element of A;
redefine func I --> a -> Function of I,A;
coherence by FUNCOP_1:58;
end;

theorem Th2:
for a being Element of A st x in I holds (I --> a)/.x = a
proof let a be Element of A;
assume
A1:  x in I;
hence a = (I --> a).x by FUNCOP_1:13 .= (I --> a)/.x by A1,Def1;
end;

canceled 4;

theorem Th7:
x1 <> x2 implies for y1,y2 being Element of A
holds ((x1,x2) --> (y1,y2))/.x1 = y1 & ((x1,x2) --> (y1,y2))/.x2 = y2
proof assume
A1:  x1 <> x2;
let y1,y2 be Element of A;
set h = (x1,x2) --> (y1,y2);
h.x1 = y1 & h.x2 = y2 & x1 in {x1,x2} & x2 in {x1,x2} by A1,FUNCT_4:66,
TARSKI:def 2;
hence thesis by Def1;
end;

begin :: Indexed families of morphisms

definition let C,I; let F be Function of I,the Morphisms of C;
canceled;

func doms F -> Function of I, the Objects of C means
:Def3:  for x st x in I holds it/.x = dom(F/.x);
correctness
proof
set A = the Objects of C;
deffunc F(set) = dom(F/.\$1);
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
func cods F -> Function of I, the Objects of C means
:Def4:  for x st x in I holds it/.x = cod(F/.x);
correctness
proof
set A = the Objects of C;
deffunc F(set) = cod(F/.\$1);
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
end;

theorem Th8:
doms(I-->f) = I-->(dom f)
proof set F = I-->f, F' = I-->(dom f);
now let x; assume
A1:   x in I;
then F/.x = f & F'/.x = dom f by Th2;
hence (doms F)/.x = F'/.x by A1,Def3;
end;
hence thesis by Th1;
end;

theorem Th9:
cods(I-->f) = I-->(cod f)
proof set F = I-->f, F' = I-->(cod f);
now let x; assume
A1:   x in I;
then F/.x = f & F'/.x = cod f by Th2;
hence (cods F)/.x = F'/.x by A1,Def4;
end;
hence thesis by Th1;
end;

theorem Th10:
doms((x1,x2)-->(p1,p2)) = (x1,x2)-->(dom p1,dom p2)
proof
set F = (x1,x2)-->(p1,p2), f = {x1} --> p1, g = {x2} --> p2,
F' = (x1,x2)-->(dom p1,dom p2), f' = {x1}-->(dom p1), g' = {x2}-->(dom p2);
A1:  dom f = {x1} & dom f' = {x1} & dom g = {x2} & dom g' = {x2}
by FUNCOP_1:19;
A2:  F = f +* g & F' = f' +* g' by FUNCT_4:def 4;
now let x; assume
A3:  x in {x1,x2};
then A4:  x in dom F by FUNCT_4:65;
now per cases by A2,A4,FUNCT_4:13;
case
A5:   x in dom f & not x in dom g;
then F.x = f.x & F'.x = f'.x by A1,A2,FUNCT_4:12;
then F.x = p1 & F'.x = dom p1 by A1,A5,FUNCOP_1:13;
hence F/.x = p1 & F'/.x = dom p1 by A3,Def1;
case
A6:   x in dom g;
then F.x = g.x & F'.x = g'.x by A1,A2,FUNCT_4:14;
then F.x = p2 & F'.x = dom p2 by A1,A6,FUNCOP_1:13;
hence F/.x = p2 & F'/.x = dom p2 by A3,Def1;
end;
hence (doms F)/.x = F'/.x by A3,Def3;
end;
hence thesis by Th1;
end;

theorem Th11:
cods((x1,x2)-->(p1,p2)) = (x1,x2)-->(cod p1,cod p2)
proof
set F = (x1,x2)-->(p1,p2), f = {x1} --> p1, g = {x2} --> p2,
F' = (x1,x2)-->(cod p1,cod p2), f' = {x1}-->(cod p1), g' = {x2}-->(cod p2);
A1:  dom f = {x1} & dom f' = {x1} & dom g = {x2} & dom g' = {x2}
by FUNCOP_1:19;
A2:  F = f +* g & F' = f' +* g' by FUNCT_4:def 4;
now let x; assume
A3:  x in {x1,x2};
then A4:  x in dom F by FUNCT_4:65;
now per cases by A2,A4,FUNCT_4:13;
case
A5:   x in dom f & not x in dom g;
then F.x = f.x & F'.x = f'.x by A1,A2,FUNCT_4:12;
then F.x = p1 & F'.x = cod p1 by A1,A5,FUNCOP_1:13;
hence F/.x = p1 & F'/.x = cod p1 by A3,Def1;
case
A6:   x in dom g;
then F.x = g.x & F'.x = g'.x by A1,A2,FUNCT_4:14;
then F.x = p2 & F'.x = cod p2 by A1,A6,FUNCOP_1:13;
hence F/.x = p2 & F'/.x = cod p2 by A3,Def1;
end;
hence (cods F)/.x = F'/.x by A3,Def4;
end;
hence thesis by Th1;
end;

definition let C,I; let F be Function of I,the Morphisms of C;
func F opp -> Function of I,the Morphisms of C opp means
:Def5:  for x st x in I holds it/.x = (F/.x) opp;
correctness
proof
set A = the Morphisms of C opp;
deffunc F(set) = (F/.\$1) opp;
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
end;

theorem
(I --> f) opp = I --> f opp
proof set F = I --> f, F' = I --> f opp;
now let x; assume
A1:   x in I;
then F/.x = f & F'/.x = f opp by Th2;
hence F opp/.x = F'/.x by A1,Def5;
end;
hence thesis by Th1;
end;

theorem
x1 <> x2 implies ((x1,x2)-->(p1,p2)) opp = (x1,x2)-->(p1 opp,p2 opp)
proof set F = (x1,x2)-->(p1,p2), F' = (x1,x2)-->(p1 opp,p2 opp);
assume
A1:  x1 <> x2;
now let x; assume
A2:   x in {x1,x2};
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = p1 & F'/.x = p1 opp or F/.x = p2 & F'/.x = p2 opp by A1,Th7;
hence F opp/.x = F'/.x by A2,Def5;
end;
hence thesis by Th1;
end;

theorem
for F being Function of I,the Morphisms of C holds F opp opp = F
proof let F be Function of I,the Morphisms of C;
now
C opp = CatStr (#the Objects of C, the Morphisms of C,
the Cod of C, the Dom of C,
~(the Comp of C), the Id of C#) &
C opp opp = CatStr (#the Objects of C opp, the Morphisms of C opp,
the Cod of C opp, the Dom of C opp,
~(the Comp of C opp), the Id of C opp#) by OPPCAT_1:def 1;
hence the Morphisms of C = the Morphisms of C opp opp;
let x; assume
A1:  x in I;
hence (F opp opp)/.x = ((F opp)/.x) opp by Def5
.= (F/.x) opp opp by A1,Def5
.= F/.x by OPPCAT_1:6;
end;
hence thesis by Th1;
end;

definition let C,I; let F be Function of I,the Morphisms of C opp;
func opp F -> Function of I,the Morphisms of C means
:Def6:  for x st x in I holds it/.x = opp (F/.x);
correctness
proof
set A = the Morphisms of C;
deffunc F(set) = opp (F/.\$1);
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
end;

theorem
for f being Morphism of C opp holds opp(I --> f) = I --> (opp f)
proof let f be Morphism of C opp;
set F = I --> f, F' = I --> (opp f);
now let x; assume
A1:   x in I;
then F/.x = f & F'/.x = opp f by Th2;
hence opp F/.x = F'/.x by A1,Def6;
end;
hence thesis by Th1;
end;

theorem
x1 <> x2 implies for p1,p2 being Morphism of C opp holds
opp ((x1,x2)-->(p1,p2)) = (x1,x2)-->(opp p1,opp p2)
proof assume
A1:  x1 <> x2;
let p1,p2 be Morphism of C opp;
set F = (x1,x2)-->(p1,p2), F' = (x1,x2)-->(opp p1,opp p2);
now let x; assume
A2:   x in {x1,x2};
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = p1 & F'/.x = opp p1 or F/.x = p2 & F'/.x = opp p2 by A1,Th7;
hence opp F/.x = F'/.x by A2,Def6;
end;
hence thesis by Th1;
end;

theorem
for F being Function of I,the Morphisms of C holds opp(F opp) = F
proof let F be Function of I,the Morphisms of C;
now let x; assume
A1:  x in I;
hence opp(F opp)/.x = opp((F opp)/.x) by Def6
.= opp((F/.x) opp) by A1,Def5
.= F/.x by OPPCAT_1:7;
end;
hence thesis by Th1;
end;

definition let C,I; let F be Function of I,the Morphisms of C, f;
func F*f -> Function of I,the Morphisms of C means
:Def7: for x st x in I holds it/.x = (F/.x)*f;
correctness
proof
set A = the Morphisms of C;
deffunc F(set) = (F/.\$1)*f;
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
func f*F -> Function of I,the Morphisms of C means
:Def8: for x st x in I holds it/.x = f*(F/.x);
correctness
proof
set A = the Morphisms of C;
deffunc F(set) = f*(F/.\$1);
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
end;

theorem Th18:
x1 <> x2 implies ((x1,x2)-->(p1,p2))*f = (x1,x2)-->(p1*f,p2*f)
proof
assume
A1:  x1 <> x2;
set F = (x1,x2)-->(p1,p2), F' = (x1,x2)-->(p1*f,p2*f);
now let x; assume
A2:   x in {x1,x2};
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = p1 & F'/.x = p1*f or F/.x = p2 & F'/.x = p2*f by A1,Th7;
hence (F*f)/.x = F'/.x by A2,Def7;
end;
hence thesis by Th1;
end;

theorem Th19:
x1 <> x2 implies f*((x1,x2)-->(p1,p2)) = (x1,x2)-->(f*p1,f*p2)
proof
assume
A1:  x1 <> x2;
set F = (x1,x2)-->(p1,p2), F' = (x1,x2)-->(f*p1,f*p2);
now let x; assume
A2:   x in {x1,x2};
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = p1 & F'/.x = f*p1 or F/.x = p2 & F'/.x = f*p2 by A1,Th7;
hence (f*F)/.x = F'/.x by A2,Def8;
end;
hence thesis by Th1;
end;

theorem Th20:
for F being Function of I,the Morphisms of C st doms F = I-->cod f
holds doms(F*f) = I-->dom f & cods(F*f) = cods F
proof let F be Function of I,the Morphisms of C such that
A1:  doms F = I-->cod f;
now let x; assume
A2:  x in I;
then A3:  dom(F/.x) = (I-->cod f)/.x by A1,Def3 .= cod f by A2,Th2;
thus (doms(F*f))/.x = dom((F*f)/.x) by A2,Def3
.= dom((F/.x)*f) by A2,Def7
.= dom f by A3,CAT_1:42
.= (I--> dom f)/.x by A2,Th2;
end;
hence doms(F*f) = I --> dom f by Th1;
now let x; assume
A4:  x in I;
then A5:  dom(F/.x) = (I-->cod f)/.x by A1,Def3 .= cod f by A4,Th2;
thus (cods F)/.x = cod(F/.x) by A4,Def4
.= cod((F/.x)*f) by A5,CAT_1:42
.= cod((F*f)/.x) by A4,Def7
.= (cods(F*f))/.x by A4,Def4;
end;
hence cods(F*f) = cods F by Th1;
end;

theorem Th21:
for F being Function of I,the Morphisms of C st cods F = I-->dom f
holds doms(f*F) = doms F & cods(f*F) = I-->cod f
proof let F be Function of I,the Morphisms of C such that
A1:  cods F = I-->dom f;
now let x; assume
A2:  x in I;
then A3:  cod(F/.x) = (I-->dom f)/.x by A1,Def4 .= dom f by A2,Th2;
thus (doms F)/.x = dom(F/.x) by A2,Def3
.= dom(f*(F/.x)) by A3,CAT_1:42
.= dom((f*F)/.x) by A2,Def8
.= (doms(f*F))/.x by A2,Def3;
end;
hence doms(f*F) = doms F by Th1;
now let x; assume
A4:  x in I;
then A5:  cod(F/.x) = (I-->dom f)/.x by A1,Def4 .= dom f by A4,Th2;
thus (cods(f*F))/.x = cod((f*F)/.x) by A4,Def4
.= cod(f*(F/.x)) by A4,Def8
.= cod f by A5,CAT_1:42
.= (I--> cod f)/.x by A4,Th2;
end;
hence cods(f*F) = I-->cod f by Th1;
end;

definition let C,I; let F,G be Function of I,the Morphisms of C;
func F"*"G -> Function of I,the Morphisms of C means
:Def9:  for x st x in I holds it/.x = (F/.x)*(G/.x);
correctness
proof
set A = the Morphisms of C;
deffunc F(set) = (F/.\$1)*(G/.\$1);
thus (ex F being Function of I,A st for x st x in I holds F/.x = F(x)) &
(for F1,F2 being Function of I,A st
(for x st x in I holds F1/.x = F(x)) &
(for x st x in I holds F2/.x = F(x))
holds F1 = F2) from FuncIdx_correctness;
end;
end;

theorem Th22:
for F,G being Function of I,the Morphisms of C st doms F = cods G
holds doms(F"*"G) = doms G & cods(F"*"G) = cods F
proof let F,G be Function of I,the Morphisms of C such that
A1:  doms F = cods G;
now let x; assume
A2:   x in I;
then A3:   cod(G/.x) = (doms F)/.x by A1,Def4 .= dom(F/.x) by A2,Def3;
thus (doms(F"*"G))/.x = dom((F"*"G)/.x) by A2,Def3
.= dom((F/.x)*(G/.x)) by A2,Def9
.= dom(G/.x) by A3,CAT_1:42
.= (doms G)/.x by A2,Def3;
end;
hence doms(F"*"G) = doms G by Th1;
now let x; assume
A4:   x in I;
then A5:   cod(G/.x) = (doms F)/.x by A1,Def4 .= dom(F/.x) by A4,Def3;
thus (cods(F"*"G))/.x = cod((F"*"G)/.x) by A4,Def4
.= cod((F/.x)*(G/.x)) by A4,Def9
.= cod(F/.x) by A5,CAT_1:42
.= (cods F)/.x by A4,Def4;
end;
hence cods(F"*"G) = cods F by Th1;
end;

theorem
x1 <> x2 implies
((x1,x2)-->(p1,p2))"*"((x1,x2)-->(q1,q2)) = (x1,x2)-->(p1*q1,p2*q2)
proof
assume
A1:  x1 <> x2;
set F1 = (x1,x2)-->(p1,p2), F2 = (x1,x2)-->(q1,q2),
G = (x1,x2)-->(p1*q1,p2*q2);
now let x; assume
A2:   x in {x1,x2};
then x = x1 or x = x2 by TARSKI:def 2;
then F1/.x = p1 & F2/.x = q1 & G/.x = p1*q1 or
F1/.x = p2 & F2/.x = q2 & G/.x = p2*q2 by A1,Th7;
hence (F1"*"F2)/.x = G/.x by A2,Def9;
end;
hence thesis by Th1;
end;

theorem
for F being Function of I,the Morphisms of C holds F*f = F"*"(I-->f)
proof let F be Function of I,the Morphisms of C;
now let x; assume
A1:   x in I;
hence (F*f)/.x = (F/.x)*f by Def7
.= (F/.x)*((I-->f)/.x) by A1,Th2
.= (F"*"(I-->f))/.x by A1,Def9;
end;
hence thesis by Th1;
end;

theorem
for F being Function of I,the Morphisms of C holds f*F = (I-->f)"*"F
proof let F be Function of I,the Morphisms of C;
now let x; assume
A1:   x in I;
hence (f*F)/.x = f*(F/.x) by Def8
.= ((I-->f)/.x)*(F/.x) by A1,Th2
.= ((I-->f)"*"F)/.x by A1,Def9;
end;
hence thesis by Th1;
end;

begin :: Retractions and Coretractions

definition let C;
let IT be Morphism of C;
attr IT is retraction means
:Def10: ex g st cod g = dom IT & IT*g = id(cod IT);
attr IT is coretraction means
:Def11: ex g st dom g = cod IT & g*IT = id(dom IT);
end;

theorem Th26:
f is retraction implies f is epi
proof given g such that
A1:  cod g = dom f and
A2:  f*g = id(cod f);
let p1,p2 such that
A3:  dom p1 = cod f and
A4:  dom p2 = cod f and cod p1 = cod p2 and
A5:  p1*f = p2*f;
thus p1 = p1*(f*g) by A2,A3,CAT_1:47
.= (p2*f)*g by A1,A3,A5,CAT_1:43
.= p2*(f*g) by A1,A4,CAT_1:43
.= p2 by A2,A4,CAT_1:47;
end;

theorem
f is coretraction implies f is monic
proof given g such that
A1:  dom g = cod f and
A2:  g*f = id(dom f);
let p1,p2 such that dom p1 = dom p2 and
A3:  cod p1 = dom f and
A4:  cod p2 = dom f and
A5:  f*p1 = f*p2;
thus p1 = g*f*p1 by A2,A3,CAT_1:46
.= g*(f*p2) by A1,A3,A5,CAT_1:43
.= g*f*p2 by A1,A4,CAT_1:43
.= p2 by A2,A4,CAT_1:46;
end;

theorem
f is retraction & g is retraction & dom g = cod f
implies g*f is retraction
proof given i such that
A1:  cod i = dom f and
A2:  f*i = id(cod f);
given j such that
A3:  cod j = dom g and
A4:  g*j = id(cod g);
assume
A5:  dom g = cod f;
take i*j;
A6: dom i = dom(f*i) by A1,CAT_1:42 .= cod f by A2,CAT_1:44;
then A7: cod(i*j) = dom f by A1,A3,A5,CAT_1:42;
hence cod(i*j) = dom(g*f) by A5,CAT_1:42;
thus g*f*(i*j) = g*(f*(i*j)) by A5,A7,CAT_1:43
.= g*(f*i*j) by A1,A3,A5,A6,CAT_1:43
.= id(cod g) by A2,A3,A4,A5,CAT_1:46
.= id(cod(g*f)) by A5,CAT_1:42;
end;

theorem
f is coretraction & g is coretraction & dom g = cod f
implies g*f is coretraction
proof given i such that
A1:  dom i = cod f and
A2:  i*f = id(dom f);
given j such that
A3:  dom j = cod g and
A4:  j*g = id(dom g);
assume
A5:  dom g = cod f;
take i*j;
A6:  cod j = cod(j*g) by A3,CAT_1:42 .= dom g by A4,CAT_1:44;
A7:  cod g = cod(g*f) by A5,CAT_1:42;
hence dom(i*j) = cod(g*f) by A1,A3,A5,A6,CAT_1:42;
thus i*j*(g*f) = i*(j*(g*f)) by A1,A3,A5,A6,A7,CAT_1:43
.= i*(j*g*f) by A3,A5,CAT_1:43
.= id(dom f) by A2,A4,A5,CAT_1:46
.= id(dom(g*f)) by A5,CAT_1:42;
end;

theorem
dom g = cod f & g*f is retraction implies g is retraction
proof assume
A1:  dom g = cod f;
given i such that
A2:  cod i = dom(g*f) and
A3:  (g*f)*i = id(cod(g*f));
take f*i;
A4:  dom f = dom(g*f) by A1,CAT_1:42;
hence cod(f*i) = dom g by A1,A2,CAT_1:42;
thus g*(f*i) = id(cod(g*f)) by A1,A2,A3,A4,CAT_1:43
.= id(cod g) by A1,CAT_1:42;
end;

theorem
dom g = cod f & g*f is coretraction implies f is coretraction
proof assume
A1:  dom g = cod f;
given i such that
A2:  dom i = cod(g*f) and
A3:  i*(g*f) = id(dom(g*f));
take i*g;
A4:  cod g = cod(g*f) by A1,CAT_1:42;
hence dom(i*g) = cod f by A1,A2,CAT_1:42;
thus (i*g)*f = id(dom(g*f)) by A1,A2,A3,A4,CAT_1:43
.= id(dom f) by A1,CAT_1:42;
end;

theorem
f is retraction & f is monic implies f is invertible
proof given i such that
A1:  cod i = dom f and
A2:  f*i = id(cod f);
assume
A3:  f is monic;
take i;
thus
A4:  dom i = dom(f*i) by A1,CAT_1:42 .= cod f by A2,CAT_1:44;
thus cod i = dom f by A1;
thus f*i = id cod f by A2;
now
thus dom(i*f) = dom f by A4,CAT_1:42 .= dom(id(dom f)) by CAT_1:44;
thus cod(i*f) = dom f by A1,A4,CAT_1:42;
thus cod(id(dom f)) = dom f by CAT_1:44;
thus f*(i*f) = id(cod f)*f by A1,A2,A4,CAT_1:43
.= f by CAT_1:46
.= f * id(dom f) by CAT_1:47;
end;
hence i*f = id(dom f) by A3,CAT_1:def 10;
end;

theorem Th33:
f is coretraction & f is epi implies f is invertible
proof given i such that
A1:  dom i = cod f and
A2:  i*f = id(dom f);
assume
A3:  f is epi;
take i;
thus dom i = cod f by A1;
thus
A4:  cod i = cod(i*f) by A1,CAT_1:42 .= dom f by A2,CAT_1:44;
now
thus dom(f*i) = cod f by A1,A4,CAT_1:42;
thus dom(id(cod f)) = cod f by CAT_1:44;
thus cod(f*i) = cod f by A4,CAT_1:42 .= cod(id(cod f)) by CAT_1:44;
thus f*i*f = f * id(dom f) by A1,A2,A4,CAT_1:43
.= f by CAT_1:47
.= id(cod f)*f by CAT_1:46;
end;
hence f*i = id cod f by A3,CAT_1:def 11;
thus i*f = id(dom f) by A2;
end;

theorem
f is invertible iff f is retraction & f is coretraction
proof
thus f is invertible implies f is retraction & f is coretraction
proof
assume ex g st dom g = cod f & cod g = dom f &
f*g = id cod f & g*f = id dom f;
hence thesis by Def10,Def11;
end;
assume f is retraction;
then f is epi by Th26;
hence thesis by Th33;
end;

theorem
for T being Functor of C,D st f is retraction holds T.f is retraction
proof let T be Functor of C,D;
given i such that
A1:  cod i = dom f and
A2:  f*i = id(cod f);
take T.i;
thus cod(T.i) = T.(dom f) by A1,CAT_1:109 .= dom(T.f) by CAT_1:109;
thus (T.f)*(T.i) = T.(id(cod f)) by A1,A2,CAT_1:99
.= id(cod(T.f)) by CAT_1:98;
end;

theorem
for T being Functor of C,D st f is coretraction holds T.f is coretraction
proof let T be Functor of C,D;
given i such that
A1:  dom i = cod f and
A2:  i*f = id(dom f);
take T.i;
thus dom(T.i) = T.(cod f) by A1,CAT_1:109 .= cod(T.f) by CAT_1:109;
thus (T.i)*(T.f) = T.(id(dom f)) by A1,A2,CAT_1:99
.= id(dom(T.f)) by CAT_1:98;
end;

theorem
f is retraction iff f opp is coretraction
proof
thus f is retraction implies f opp is coretraction
proof given i such that
A1:   cod i = dom f and
A2:   f*i = id(cod f);
take i opp;
thus dom(i opp) = dom f by A1,OPPCAT_1:9 .= cod(f opp) by OPPCAT_1:9;
thus (i opp)*(f opp) = (id(cod f)) opp by A1,A2,OPPCAT_1:17
.= id((cod f)opp) by OPPCAT_1:21
.= id(dom(f opp)) by OPPCAT_1:11;
end;
given i being Morphism of C opp such that
A3:  dom i = cod(f opp) and
A4:  i*(f opp) = id(dom(f opp));
take opp i;
thus
A5:  cod(opp i) = cod(f opp) by A3,OPPCAT_1:10 .= dom f by OPPCAT_1:9;
thus f*(opp i) = (f*(opp i)) opp by OPPCAT_1:def 4
.= ((opp i)opp)*(f opp) by A5,OPPCAT_1:17
.= id(dom(f opp)) by A4,OPPCAT_1:8
.= id((cod f)opp) by OPPCAT_1:11
.= (id(cod f))opp by OPPCAT_1:21
.= id(cod f) by OPPCAT_1:def 4;
end;

theorem
f is coretraction iff f opp is retraction
proof
thus f is coretraction implies f opp is retraction
proof given i such that
A1:   dom i = cod f and
A2:   i*f = id(dom f);
take i opp;
thus cod(i opp) = cod f by A1,OPPCAT_1:9 .= dom(f opp) by OPPCAT_1:9;
thus (f opp)*(i opp) = (id(dom f))opp by A1,A2,OPPCAT_1:17
.= id((dom f)opp) by OPPCAT_1:21
.= id(cod(f opp)) by OPPCAT_1:11;
end;
given i being Morphism of C opp such that
A3:   cod i = dom(f opp) and
A4:   (f opp)*i = id(cod(f opp));
take opp i;
thus
A5:   dom(opp i) = dom(f opp) by A3,OPPCAT_1:10 .= cod f by OPPCAT_1:9;
thus (opp i)*f = ((opp i)*f) opp by OPPCAT_1:def 4
.= (f opp)*((opp i)opp) by A5,OPPCAT_1:17
.= id(cod(f opp)) by A4,OPPCAT_1:8
.= id((dom f)opp) by OPPCAT_1:11
.= (id(dom f))opp by OPPCAT_1:21
.= id(dom f) by OPPCAT_1:def 4;
end;

begin :: Morphisms determined by a terminal Object

definition let C,a,b;
assume
A1:  b is terminal;
func term(a,b) -> Morphism of a,b means not contradiction;
existence;
uniqueness
proof let f1,f2 be Morphism of a,b;
consider f being Morphism of a,b such that
A2:  for g being Morphism of a,b holds f = g by A1,CAT_1:def 15;
thus f1 = f by A2 .= f2 by A2;
end;
end;

theorem Th39:
b is terminal implies dom(term(a,b)) = a & cod(term(a,b)) = b
proof assume b is terminal;
then Hom(a,b) <> {} by CAT_1:def 15;
hence thesis by CAT_1:23;
end;

theorem Th40:
b is terminal & dom f = a & cod f = b implies term(a,b) = f
proof assume that
A1:  b is terminal and
A2:  dom f = a & cod f = b;
consider h being Morphism of a,b such that
A3:  for g being Morphism of a,b holds h = g by A1,CAT_1:def 15;
f is Morphism of a,b by A2,CAT_1:22;
hence f = h by A3 .= term(a,b) by A3;
end;

theorem
for f being Morphism of a,b st b is terminal holds term(a,b) = f
proof let f be Morphism of a,b;
assume
A1:  b is terminal;
then Hom(a,b) <> {} by CAT_1:def 15;
then dom f = a & cod f = b by CAT_1:23;
hence thesis by A1,Th40;
end;

begin :: Morphisms determined by an iniatial object

definition let C,a,b;
assume
A1:  a is initial;
func init(a,b) -> Morphism of a,b means not contradiction;
existence;
uniqueness
proof let f1,f2 be Morphism of a,b;
consider f being Morphism of a,b such that
A2:  for g being Morphism of a,b holds f = g by A1,CAT_1:def 16;
thus f1 = f by A2 .= f2 by A2;
end;
end;

theorem Th42:
a is initial implies dom(init(a,b)) = a & cod(init(a,b)) = b
proof assume a is initial;
then Hom(a,b) <> {} by CAT_1:def 16;
hence dom(init(a,b)) = a & cod(init(a,b)) = b by CAT_1:23;
end;

theorem Th43:
a is initial & dom f = a & cod f = b implies init(a,b) = f
proof assume that
A1:  a is initial and
A2:  dom f = a & cod f = b;
consider h being Morphism of a,b such that
A3:  for g being Morphism of a,b holds h = g by A1,CAT_1:def 16;
f is Morphism of a,b by A2,CAT_1:22;
hence f = h by A3 .= init(a,b) by A3;
end;

theorem
for f being Morphism of a,b st a is initial holds init(a,b) = f
proof let f be Morphism of a,b;
assume
A1:  a is initial;
then Hom(a,b) <> {} by CAT_1:def 16;
then dom f = a & cod f = b by CAT_1:23;
hence thesis by A1,Th43;
end;

begin :: Products

definition let C,a,I;
mode Projections_family of a,I -> Function of I,the Morphisms of C means
:Def14:  doms it = I --> a;
existence
proof take F = I-->id a;
doms F = I --> (dom id a) by Th8;
hence thesis by CAT_1:44;
end;
end;

theorem Th45:
for F being Projections_family of a,I st x in I holds dom(F/.x) = a
proof let F be Projections_family of a,I such that
A1:  x in I;
(doms F)/.x = (I --> a)/.x by Def14;
hence dom(F/.x) = (I --> a)/.x by A1,Def3 .= a by A1,Th2;
end;

theorem Th46:
for F being Function of {},the Morphisms of C
holds F is Projections_family of a,{}
proof let F be Function of {},the Morphisms of C;
thus {} --> a = {} by FUNCT_4:3 .= doms F by PARTFUN1:57;
end;

theorem Th47:
dom f = a implies {y} --> f is Projections_family of a,{y}
proof set F = {y} --> f;
assume
A1:  dom f = a;
now let x; assume
A2:  x in {y};
hence (doms F)/.x = dom(F/.x) by Def3
.= a by A1,A2,Th2
.= ({y} --> a)/.x by A2,Th2;
end;
hence doms F = {y} --> a by Th1;
end;

theorem Th48:
dom p1 = a & dom p2 = a
implies (x1,x2)-->(p1,p2) is Projections_family of a,{x1,x2}
proof
assume
A1:  dom p1 = a & dom p2 = a;
doms ((x1,x2)-->(p1,p2))
= (x1,x2) --> (dom p1,dom p2) by Th10 .= {x1,x2} --> a by A1,FUNCT_4:68;
hence thesis by Def14;
end;

canceled;

theorem Th50:
for F being Projections_family of a,I st cod f = a
holds F*f is Projections_family of dom f,I
proof let F be Projections_family of a,I;
assume cod f = a;
then doms F = I-->cod f by Def14;
hence doms(F*f) = I --> dom f by Th20;
end;

theorem
for F being Function of I,the Morphisms of C,
G being Projections_family of a,I st doms F = cods G
holds F"*"G is Projections_family of a,I
proof let F be Function of I,the Morphisms of C;
let G be Projections_family of a,I;
assume doms F = cods G;
then doms(F"*"G) = doms G by Th22;
hence doms(F"*"G) = I --> a by Def14;
end;

theorem
for F being Projections_family of cod f,I holds (f opp)*(F opp) = (F*f)
opp
proof let F be Projections_family of cod f, I;
now let x; assume
A1:  x in I;
then A2:  dom(F/.x) = (doms F)/.x by Def3
.= (I --> cod f)/.x by Def14
.= cod f by A1,Th2;
thus ((f opp)*(F opp))/.x = (f opp)*((F opp)/.x) by A1,Def8
.= (f opp)*((F/.x)opp) by A1,Def5
.= ((F/.x)*f)opp by A2,OPPCAT_1:17
.= ((F*f)/.x)opp by A1,Def7
.= ((F*f) opp)/.x by A1,Def5;
end;
hence thesis by Th1;
end;

definition let C,a,I; let F be Function of I,the Morphisms of C;
pred a is_a_product_wrt F means
:Def15:  F is Projections_family of a,I &
for b for F' being Projections_family of b,I st cods F = cods F'
ex h st h in Hom(b,a) &
for k st k in Hom(b,a) holds
(for x st x in I holds (F/.x)*k = F'/.x) iff h = k;
end;

theorem Th53:
for F being Projections_family of c,I, F' being Projections_family of d,I
st c is_a_product_wrt F & d is_a_product_wrt F' & cods F = cods F'
holds c,d are_isomorphic
proof
let F be Projections_family of c,I, F' be Projections_family of d,I such that
A1:  c is_a_product_wrt F and
A2:  d is_a_product_wrt F' and
A3:  cods F = cods F';
consider f such that
A4:  f in Hom(d,c) and
A5:  for k st k in Hom(d,c) holds
(for x st x in I holds (F/.x)*k = F'/.x ) iff f = k by A1,A3,Def15;
consider g such that
A6:  g in Hom(c,d) and
A7:  for k st k in Hom(c,d) holds
(for x st x in I holds (F'/.x)*k = F/.x ) iff g = k by A2,A3,Def15;
thus Hom(c,d) <> {} by A6;
reconsider g as Morphism of c,d by A6,CAT_1:def 7;
take g,f;
A8:  dom f = d & cod g = d & cod f = c & dom g = c by A4,A6,CAT_1:18;
hence dom f = cod g & cod f = dom g;
cods F' = cods F';
then consider gf being Morphism of C such that gf in Hom(d,d) and
A9:  for k st k in Hom(d,d) holds
(for x st x in I holds (F'/.x)*k = F'/.x ) iff gf = k by A2,Def15;
A10:
now set k = id d;
thus k in Hom(d,d) by CAT_1:55;
let x;
assume x in I;
then dom(F'/.x) = d by Th45;
hence (F'/.x)*k = F'/.x by CAT_1:47;
end;
now dom(g*f) = d & cod(g*f) = d by A8,CAT_1:42;
hence g*f in Hom(d,d) by CAT_1:18;
let x; assume
A11:   x in I;
then dom(F'/.x) = d by Th45;
hence (F'/.x)*(g*f) = (F'/.x)*g*f by A8,CAT_1:43
.= (F/.x)*f by A6,A7,A11
.= F'/.x by A4,A5,A11;
end;
hence g*f = gf by A9 .= id cod g by A8,A9,A10;
A12:
now set k = id c;
thus k in Hom(c,c) by CAT_1:55;
let x;
assume x in I;
then dom(F/.x) = c by Th45;
hence (F/.x)*k = F/.x by CAT_1:47;
end;
cods F = cods F;
then consider fg being Morphism of C such that fg in Hom(c,c) and
A13:  for k st k in Hom(c,c) holds
(for x st x in I holds (F/.x)*k = F/.x ) iff fg = k by A1,Def15;
now dom(f*g) = c & cod(f*g) = c by A8,CAT_1:42;
hence f*g in Hom(c,c) by CAT_1:18;
let x; assume
A14:   x in I;
then dom(F/.x) = c by Th45;
hence (F/.x)*(f*g) = (F/.x)*f*g by A8,CAT_1:43
.= (F'/.x)*g by A4,A5,A14
.= F/.x by A6,A7,A14;
end;
hence f*g = fg by A13 .= id dom g by A8,A12,A13;
end;

theorem Th54:
for F being Projections_family of c,I
st c is_a_product_wrt F &
for x1,x2 st x1 in I & x2 in I holds Hom(cod(F/.x1),cod(F/.x2)) <> {}
for x st x in I holds F/.x is retraction
proof let F be Projections_family of c,I such that
A1:  c is_a_product_wrt F and
A2:  for x1,x2 st x1 in I & x2 in I holds Hom(cod(F/.x1),cod(F/.x2)) <> {};
let x such that
A3:  x in I;
set d = cod(F/.x);
defpred P[set,set] means
(\$1 = x implies \$2 = id d) &
(\$1 <> x implies \$2 in Hom(d,cod(F/.\$1)));
A4:  for y st y in I holds ex z st z in the Morphisms of C & P[y,z]
proof let y; assume y in I;
then A5:  Hom(d,cod(F/.y)) <> {} by A2,A3;
consider z being Element of Hom(d,cod(F/.y));
A6:   z is Morphism of d,cod(F/.y) by A5,CAT_1:21;
per cases;
suppose
A7:    y = x;
take z = id d;
thus z in the Morphisms of C;
thus (y = x implies z = id d) & (y <> x implies z in Hom(d,cod(F/.y)))
by A7;
suppose
A8:    y <> x;
take z;
thus z in the Morphisms of C by A6;
thus (y = x implies z = id d) & (y <> x implies z in Hom(d,cod(F/.y)))
by A5,A8;
end;
consider F' being Function such that
A9:  dom F' = I & rng F' c= the Morphisms of C and
A10:  for y st y in I holds P[y,F'.y] from NonUniqBoundFuncEx(A4);
reconsider F' as Function of I,the Morphisms of C by A9,FUNCT_2:def 1,
RELSET_1:11;
now
now let y; assume
A11:  y in I;
then F'.y = F'/.y & F'.x = F'/.x by A3,Def1;
then (y = x implies F'/.y = id d) &
(y <> x implies F'/.y in Hom(d,cod(F/.y))) by A10,A11;
then dom(F'/.y) = d by CAT_1:18,44;
hence (doms F')/.y = d by A11,Def3 .= (I-->d)/.y by A11,Th2;
end;
hence doms F' = I --> d by Th1;
hence F' is Projections_family of d,I by Def14;
now let y; assume
A12:  y in I;
then F'.y = F'/.y & F'.x = F'/.x by A3,Def1;
then (y = x implies F'/.y = id d) &
(y <> x implies F'/.y in Hom(d,cod(F/.y))) by A10,A12;
then cod(F'/.y) = cod(F/.y) by CAT_1:18,44;
hence (cods F')/.y = cod(F/.y) by A12,Def4 .= (cods F)/.y by A12,Def4;
end;
hence cods F = cods F' by Th1;
end;
then consider i such that
A13:  i in Hom(d,c) and
A14:  for k st k in Hom(d,c) holds
(for y st y in I holds (F/.y)*k = F'/.y) iff i = k by A1,Def15;
take i;
thus cod i = c by A13,CAT_1:18 .= dom(F/.x) by A3,Th45;
thus (F/.x)*i = F'/.x by A3,A13,A14 .= F'.x by A3,Def1 .= id d by A3,A10;
end;

theorem Th55:
for F being Function of {},the Morphisms of C holds
a is_a_product_wrt F iff a is terminal
proof let F be Function of {},the Morphisms of C;
thus a is_a_product_wrt F implies a is terminal
proof assume
A1:   a is_a_product_wrt F;
let b;
consider F' being Projections_family of b,{};
cods F = {} & cods F' = {} by PARTFUN1:57;
then consider h such that
A2:   h in Hom(b,a) and
A3:   for k st k in Hom(b,a) holds
(for x st x in {} holds (F/.x)*k = F'/.x ) iff h = k by A1,Def15;
thus
Hom(b,a)<>{} by A2;
reconsider f = h as Morphism of b,a by A2,CAT_1:def 7;
take f;
let g be Morphism of b,a;
g in Hom(b,a) & for x st x in {} holds (F/.x)*g = F'/.x
by A2,CAT_1:def 7;
hence f=g by A3;
end;
assume
A4:  a is terminal;
thus F is Projections_family of a,{} by Th46;
let b;
let F' be Projections_family of b,{} such that cods F = cods F';
consider h being Morphism of b,a such that
A5:  for g being Morphism of b,a holds h = g by A4,CAT_1:def 15;
take h;
Hom(b,a)<>{} by A4,CAT_1:def 15;
hence h in Hom(b,a) by CAT_1:def 7;
let k;
assume k in Hom(b,a);
then k is Morphism of b,a by CAT_1:def 7;
hence (for x st x in {} holds (F/.x)*k = F'/.x ) iff h = k by A5;
end;

theorem Th56:
for F being Projections_family of a,I
st a is_a_product_wrt F & dom f = b & cod f = a & f is invertible
holds b is_a_product_wrt F*f
proof let F be Projections_family of a,I such that
A1:  a is_a_product_wrt F and
A2:  dom f = b & cod f = a and
A3:  f is invertible;
thus F*f is Projections_family of b,I by A2,Th50;
let c;
let F' be Projections_family of c,I such that
A4:  cods(F*f) = cods F';
doms F = I-->cod f by A2,Def14;
then cods F = cods F' by A4,Th20;
then consider h such that
A5:  h in Hom(c,a) and
A6:  for k st k in Hom(c,a) holds
(for x st x in I holds (F/.x)*k = F'/.x) iff h = k by A1,Def15;
consider g such that
A7:  dom g = cod f & cod g = dom f and
A8:  f*g = id cod f and
A9:  g*f = id dom f by A3,CAT_1:def 12;
take gh = g*h;
A10:  cod h = a & dom h = c by A5,CAT_1:18;
then dom(g*h) = c & cod(g*h) = b by A2,A7,CAT_1:42;
hence gh in Hom(c,b) by CAT_1:18;
let k; assume k in Hom(c,b);
then A11:  dom k = c & cod k = b by CAT_1:18;
thus (for x st x in I holds ((F*f)/.x)*k = F'/.x) implies gh = k
proof assume
A12:  for x st x in I holds ((F*f)/.x)*k = F'/.x;
now dom(f*k) = c & cod(f*k) = a by A2,A11,CAT_1:42;
hence f*k in Hom(c,a) by CAT_1:18;
let x; assume
A13:    x in I;
then dom(F/.x) = a by Th45;
hence (F/.x)*(f*k) = (F/.x)*f*k by A2,A11,CAT_1:43
.= ((F*f)/.x)*k by A13,Def7
.= F'/.x by A12,A13;
end;
then g*(f*k) = g*h by A6;
hence gh = (id b)*k by A2,A7,A9,A11,CAT_1:43 .= k by A11,CAT_1:46;
end;
assume
A14:  gh = k;
let x; assume
A15:  x in I;
then A16:  dom(F/.x) = a by Th45;
thus ((F*f)/.x)*k = ((F/.x)*f)*k by A15,Def7
.= (F/.x)*(f*(g*h)) by A2,A11,A14,A16,CAT_1:43
.= (F/.x)*((id cod f)*h) by A2,A7,A8,A10,CAT_1:43
.= (F/.x)*h by A2,A10,CAT_1:46
.= F'/.x by A5,A6,A15;
end;

theorem
a is_a_product_wrt {y} --> id a
proof set F = {y} --> id a;
dom(id a) = a by CAT_1:44;
hence F is Projections_family of a,{y} by Th47;
let b; let F' be Projections_family of b,{y} such that
A1:  cods F = cods F';
take h = F'/.y;
A2:  y in {y} by TARSKI:def 1;
now
thus dom h = b by A2,Th45;
thus cod h = (cods F)/.y by A1,A2,Def4
.= cod(F/.y) by A2,Def4
.= cod(id a) by A2,Th2
.= a by CAT_1:44;
end;
hence h in Hom(b,a) by CAT_1:18;
let k; assume k in Hom(b,a);
then A3:  cod k = a by CAT_1:18;
thus (for x st x in {y} holds (F/.x)*k = F'/.x) implies h = k
proof assume
A4:   for x st x in {y} holds (F/.x)*k = F'/.x;
thus k = (id a)*k by A3,CAT_1:46
.= (F/.y)*k by A2,Th2
.= h by A2,A4;
end;
assume
A5:  h = k;
let x; assume
A6:  x in {y};
hence F'/.x = k by A5,TARSKI:def 1
.= (id a)*k by A3,CAT_1:46
.= (F/.x)*k by A6,Th2;
end;

theorem
for F being Projections_family of a,I
st a is_a_product_wrt F &
for x st x in I holds cod(F/.x) is terminal
holds a is terminal
proof let F be Projections_family of a,I such that
A1:  a is_a_product_wrt F and
A2:  for x st x in I holds cod(F/.x) is terminal;
now
thus I = {} implies a is terminal by A1,Th55;
let b;
deffunc f(set) = term(b,cod(F/.\$1));
consider F' being Function of I, the Morphisms of C such that
A3:  for x st x in I holds F'/.x = f(x) from LambdaIdx;
now let x; assume
A4:  x in I;
then A5:  cod(F/.x) is terminal by A2;
thus (doms F')/.x = dom(F'/.x) by A4,Def3
.= dom(term(b,cod(F/.x))) by A3,A4
.= b by A5,Th39
.= (I-->b)/.x by A4,Th2;
end;
then doms F' = I --> b by Th1;
then reconsider F' as Projections_family of b,I by Def14;
now let x; assume
A6:  x in I;
then A7:  cod(F/.x) is terminal by A2;
thus (cods F)/.x = cod(F/.x) by A6,Def4
.= cod(term(b,cod(F/.x))) by A7,Th39
.= cod(F'/.x) by A3,A6
.= (cods F')/.x by A6,Def4;
end;
then cods F = cods F' by Th1;
then consider h such that
A8:  h in Hom(b,a) and
A9:  for k st k in Hom(b,a) holds
(for x st x in I holds (F/.x)*k = F'/.x) iff h = k by A1,Def15;
thus
Hom(b,a)<>{} by A8;
reconsider h as Morphism of b,a by A8,CAT_1:def 7;
take h; let g be Morphism of b,a;
now
thus g in Hom(b,a) by A8,CAT_1:def 7;
let x;
set c = cod(F/.x);
assume
A10:   x in I;
then c is terminal by A2;
then consider f being Morphism of b,c such that
A11:   for f' being Morphism of b,c holds f = f' by CAT_1:def 15;
dom g = b & cod g = a & dom(F/.x) = a by A8,A10,Th45,CAT_1:23;
then dom((F/.x)*g) = b & cod((F/.x)*g) = c by CAT_1:42;
then (F/.x)*g in Hom(b,c) by CAT_1:18;
then A12:   (F/.x)*g is Morphism of b,c by CAT_1:def 7;
F'/.x = term(b,c) by A3,A10;
hence F'/.x = f by A11 .= (F/.x)*g by A11,A12;
end;
hence h = g by A9;
end;
hence thesis by CAT_1:def 15;
end;

definition let C,c,p1,p2;
pred c is_a_product_wrt p1,p2 means
:Def16: dom p1 = c & dom p2 = c &
for d,f,g st f in Hom(d,cod p1) & g in Hom(d,cod p2)
ex h st h in Hom(d,c) &
for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k;
end;

theorem Th59:
x1 <> x2 implies
(c is_a_product_wrt p1,p2 iff c is_a_product_wrt (x1,x2)-->(p1,p2))
proof set F = (x1,x2)-->(p1,p2), I = {x1,x2};
assume
A1:  x1 <> x2;
thus c is_a_product_wrt p1,p2 implies c is_a_product_wrt F
proof assume
A2:   c is_a_product_wrt p1,p2;
then dom p1 = c & dom p2 = c by Def16;
hence F is Projections_family of c,I by Th48;
let b; let F' be Projections_family of b,I such that
A3:   cods F = cods F';
set f = F'/.x1, g = F'/.x2;
A4:   x1 in I & x2 in I by TARSKI:def 2;
then (cods F)/.x1 = cod(F/.x1) & (cods F)/.x2 = cod(F/.x2) by Def4;
then cod f = cod(F/.x1) & cod g = cod(F/.x2) by A3,A4,Def4;
then cod f = cod p1 & cod g = cod p2 & dom f = b & dom g = b
by A1,A4,Th7,Th45;
then f in Hom(b,cod p1) & g in Hom(b,cod p2) by CAT_1:18;
then consider h such that
A5:   h in Hom(b,c) and
A6:   for k st k in Hom(b,c) holds p1*k = f & p2*k = g iff h = k by A2,Def16;
take h;
thus h in Hom(b,c) by A5;
let k such that
A7:   k in Hom(b,c);
thus (for x st x in I holds (F/.x)*k = F'/.x ) implies h = k
proof assume for x st x in I holds (F/.x)*k = F'/.x;
then (F/.x1)*k = f & (F/.x2)*k = g by A4;
then p1*k = f & p2*k = g by A1,Th7;
hence h = k by A6,A7;
end;
assume
A8:   h = k;
let x such that
A9:   x in I;
p1*k = f & p2*k = g by A6,A7,A8;
then (F/.x1)*k = f & (F/.x2)*k = g & (x = x1 or x = x2)
by A1,A9,Th7,TARSKI:def 2;
hence thesis;
end;
assume
A10:  c is_a_product_wrt F;
then x1 in I & x2 in
I & F is Projections_family of c,I by Def15,TARSKI:def 2;
then dom(F/.x1) = c & dom(F/.x2) = c by Th45;
hence dom p1 = c & dom p2 = c by A1,Th7;
let d,f,g such that
A11:  f in Hom(d,cod p1) and
A12:  g in Hom(d,cod p2);
dom f = d & dom g = d by A11,A12,CAT_1:18;
then reconsider F' = (x1,x2) --> (f,g) as Projections_family of d,I by Th48;
cods F = (x1,x2)-->(cod p1,cod p2) by Th11
.= (x1,x2)-->(cod f,cod p2) by A11,CAT_1:18
.= (x1,x2)-->(cod f,cod g) by A12,CAT_1:18
.= cods F' by Th11;
then consider h such that
A13:  h in Hom(d,c) and
A14:  for k st k in Hom(d,c) holds
(for x st x in I holds (F/.x)*k = F'/.x ) iff h = k by A10,Def15;
take h;
thus h in Hom(d,c) by A13;
let k such that
A15:  k in Hom(d,c);
thus p1*k = f & p2*k = g implies h = k
proof assume
A16:  p1*k = f & p2*k = g;
now let x;
assume x in I;
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = p1 & F'/.x = f or F/.x = p2 & F'/.x = g by A1,Th7;
hence (F/.x)*k = F'/.x by A16;
end;
hence h = k by A14,A15;
end;
assume h = k;
then x1 in I & x2 in I & for x st x in I holds (F/.x)*k = F'/.x
by A14,A15,TARSKI:def 2;
then (F/.x1)*k = F'/.x1 & (F/.x2)*k = F'/.x2;
then (F/.x1)*k = f & (F/.x2)*k = g by A1,Th7;
hence p1*k = f & p2*k = g by A1,Th7;
end;

theorem
Hom(c,a) <> {} & Hom(c,b) <> {} implies
for p1 being Morphism of c,a, p2 being Morphism of c,b
holds c is_a_product_wrt p1,p2 iff
for d st Hom(d,a)<>{} & Hom(d,b)<>{} holds
Hom(d,c) <> {} &
for f being Morphism of d,a, g being Morphism of d,b
ex h being Morphism of d,c st
for k being Morphism of d,c holds p1*k = f & p2*k = g iff h = k
proof assume
A1:  Hom(c,a) <> {} & Hom(c,b) <> {};
let p1 be Morphism of c,a, p2 be Morphism of c,b;
thus c is_a_product_wrt p1,p2 implies
for d st Hom(d,a)<>{} & Hom(d,b)<>{} holds
Hom(d,c) <> {} &
for f being Morphism of d,a, g being Morphism of d,b
ex h being Morphism of d,c st
for k being Morphism of d,c holds p1*k = f & p2*k = g iff h = k
proof assume that dom p1 = c & dom p2 = c and
A2:  for d,f,g st f in Hom(d,cod p1) & g in Hom(d,cod p2)
ex h st h in Hom(d,c) &
for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k;
let d such that
A3:  Hom(d,a)<>{} & Hom(d,b)<>{};
consider f being Morphism of d,a, g being Morphism of d,b;
A4:  cod p1 = a & cod p2 = b by A1,CAT_1:23;
then f in Hom(d,cod p1) & g in Hom(d,cod p2) by A3,CAT_1:def 7;
then A5: ex h st h in Hom(d,c) &
for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k by A2;
hence
Hom(d,c) <> {};
let f be Morphism of d,a, g be Morphism of d,b;
f in Hom(d,cod p1) & g in Hom(d,cod p2) by A3,A4,CAT_1:def 7;
then consider h such that
A6:  h in Hom(d,c) and
A7:  for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k by A2;
reconsider h as Morphism of d,c by A6,CAT_1:def 7;
take h; let k be Morphism of d,c;
p1*k = p1*(k qua Morphism of C) & p2*k = p2*(k qua Morphism of C) &
k in Hom(d,c) by A1,A5,CAT_1:def 7,def 13;
hence thesis by A7;
end;
assume
A8: for d st Hom(d,a)<>{} & Hom(d,b)<>{} holds Hom(d,c) <> {} &
for f being Morphism of d,a, g being Morphism of d,b
ex h being Morphism of d,c st
for k being Morphism of d,c holds p1*k = f & p2*k = g iff h = k;
thus dom p1 = c & dom p2 = c by A1,CAT_1:23;
let d,f,g such that
A9:  f in Hom(d,cod p1) and
A10:  g in Hom(d,cod p2);
A11:  cod p1 = a & cod p2 = b by A1,CAT_1:23;
then f is Morphism of d,a & g is Morphism of d,b &
Hom(d,a) <> {} & Hom(d,b) <> {} by A9,A10,CAT_1:def 7;
then consider h being Morphism of d,c such that
A12:  for k being Morphism of d,c holds p1*k = f & p2*k = g iff h = k by A8;
reconsider h' = h as Morphism of C;
take h';
A13:  Hom(d,c) <> {} by A8,A9,A10,A11;
hence h' in Hom(d,c) by CAT_1:def 7;
let k;
assume k in Hom(d,c);
then reconsider k' = k as Morphism of d,c by CAT_1:def 7;
p1*k = p1*k' & p2*k = p2*k' by A1,A13,CAT_1:def 13;
hence thesis by A12;
end;

theorem
c is_a_product_wrt p1,p2 & d is_a_product_wrt q1,q2 &
cod p1 = cod q1 & cod p2 = cod q2 implies c,d are_isomorphic
proof
assume that
A1:  c is_a_product_wrt p1,p2 and
A2:  d is_a_product_wrt q1,q2 and
A3:  cod p1 = cod q1 & cod p2 = cod q2;
set I = {0,1}, F = (0,1)-->(p1,p2), F' = (0,1)-->(q1,q2);
now dom p1 = c & dom p2 = c & dom q1 = d & dom q2 = d by A1,A2,Def16;
hence F is Projections_family of c,I & F' is Projections_family of d,I
by Th48;
thus c is_a_product_wrt F & d is_a_product_wrt F' by A1,A2,Th59;
thus cods F = (0,1)-->(cod q1,cod q2) by A3,Th11 .= cods F' by Th11;
end;
hence thesis by Th53;
end;

theorem
c is_a_product_wrt p1,p2 & Hom(cod p1,cod p2) <> {} & Hom(cod p2,cod p1)
<>
{}
implies p1 is retraction & p2 is retraction
proof assume that
A1:  c is_a_product_wrt p1,p2 and
A2:  Hom(cod p1,cod p2) <> {} & Hom(cod p2,cod p1) <> {};
set I = {0,1}, F = (0,1)-->(p1,p2);
A3:  F/.0 = p1 & F/.1 = p2 by Th7;
now dom p1 = c & dom p2 = c by A1,Def16;
hence F is Projections_family of c,I by Th48;
thus c is_a_product_wrt F by A1,Th59;
let x1,x2; assume x1 in I & x2 in I;
then (x1 = 0 or x1 = 1) & (x2 = 0 or x2 = 1) by TARSKI:def 2;
hence Hom(cod(F/.x1),cod(F/.x2)) <> {} by A2,A3,CAT_1:56;
end;
then 0 in I & 1 in I & for x st x in I holds F/.x is retraction
by Th54,TARSKI:def 2;
hence thesis by A3;
end;

theorem Th63:
c is_a_product_wrt p1,p2 & h in Hom(c,c) & p1*h = p1 & p2*h = p2
implies h = id c
proof
assume that
A1:  dom p1 = c and
A2:  dom p2 = c and
A3:  for d,f,g st f in Hom(d,cod p1) & g in Hom(d,cod p2)
ex h st h in Hom(d,c) &
for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k and
A4:  h in Hom(c,c) and
A5:  p1*h = p1 & p2*h = p2;
p1 in Hom(c,cod p1) & p2 in Hom(c,cod p2) by A1,A2,CAT_1:18;
then consider i such that i in Hom(c,c) and
A6:  for k st k in Hom(c,c) holds p1*k = p1 & p2*k = p2 iff i = k by A3;
id c in Hom(c,c) & p1*(id c) = p1 & p2*(id c) = p2 by A1,A2,CAT_1:47,55;
hence id c = i by A6 .= h by A4,A5,A6;
end;

theorem
c is_a_product_wrt p1,p2 & dom f = d & cod f = c & f is invertible
implies d is_a_product_wrt p1*f,p2*f
proof
assume that
A1:  c is_a_product_wrt p1,p2 and
A2:  dom f = d & cod f = c & f is invertible;
dom p1 = c & dom p2 = c by A1,Def16;
then c is_a_product_wrt (0,1)-->(p1,p2) &
(0,1)-->(p1,p2) is Projections_family of c,{0,1} by A1,Th48,Th59;
then d is_a_product_wrt ((0,1)-->(p1,p2))*f by A2,Th56;
then d is_a_product_wrt (0,1)-->(p1*f,p2*f) by Th18;
hence d is_a_product_wrt p1*f,p2*f by Th59;
end;

theorem
c is_a_product_wrt p1,p2 & cod p2 is terminal
implies c,cod p1 are_isomorphic
proof set a = cod p1, b = cod p2;
assume that
A1:  c is_a_product_wrt p1,p2 and
A2:  b is terminal;
A3:  dom p1 = c & dom p2 = c by A1,Def16;
hence Hom(c,a)<>{} by CAT_1:19;
reconsider p = p1 as Morphism of c,a by A3,CAT_1:22;
take p;
set f = id(a),g = term(a,b);
dom g = a & cod g = b by A2,Th39;
then f in Hom(a,a) & g in Hom(a,b) by CAT_1:18,55;
then consider h such that
A4:  h in Hom(a,c) and
A5:  for k st k in Hom(a,c) holds p1*k = f & p2*k = g iff h = k by A1,Def16;
take h;
thus dom h = cod p & cod h = dom p by A3,A4,CAT_1:18;
thus
A6:  p*h = id cod p by A4,A5;
now
A7:  dom h = a & cod h = c by A4,CAT_1:18;
then A8:  dom(h*p) = c & cod(h*p) = c by A3,CAT_1:42;
hence h*p in Hom(c,c) by CAT_1:18;
thus p1*(h*p) = (id cod p)*p by A3,A6,A7,CAT_1:43 .= p by CAT_1:46;
dom(p2*(h*p)) = c & cod(p2*(h*p)) = b by A3,A8,CAT_1:42;
hence p2*(h*p) = term(c,b) by A2,Th40 .= p2 by A2,A3,Th40;
end;
hence id dom p = h*p by A1,A3,Th63;
end;

theorem
c is_a_product_wrt p1,p2 & cod p1 is terminal
implies c,cod p2 are_isomorphic
proof set a = cod p1, b = cod p2;
assume that
A1:  c is_a_product_wrt p1,p2 and
A2:  a is terminal;
A3:  dom p1 = c & dom p2 = c by A1,Def16;
hence Hom(c,b)<>{} by CAT_1:19;
reconsider p = p2 as Morphism of c,b by A3,CAT_1:22;
take p;
set f = id(b),g = term(b,a);
dom g = b & cod g = a by A2,Th39;
then f in Hom(b,b) & g in Hom(b,a) by CAT_1:18,55;
then consider h such that
A4:  h in Hom(b,c) and
A5:  for k st k in Hom(b,c) holds p1*k = g & p2*k = f iff h = k by A1,Def16;
take h;
thus dom h = cod p & cod h = dom p by A3,A4,CAT_1:18;
thus
A6:  p*h = id cod p by A4,A5;
now
A7:  dom h = b & cod h = c by A4,CAT_1:18;
then A8:  dom(h*p) = c & cod(h*p) = c by A3,CAT_1:42;
hence h*p in Hom(c,c) by CAT_1:18;
dom(p1*(h*p)) = c & cod(p1*(h*p)) = a by A3,A8,CAT_1:42;
hence p1*(h*p) = term(c,a) by A2,Th40 .= p1 by A2,A3,Th40;
thus p2*(h*p) = (id cod p)*p by A3,A6,A7,CAT_1:43 .= p by CAT_1:46;
end;
hence id dom p = h*p by A1,A3,Th63;
end;

begin :: Coproducts

definition let C,c,I;
mode Injections_family of c,I -> Function of I,the Morphisms of C means
:Def17:  cods it = I --> c;
existence
proof take F = I-->id c;
cods F = I --> (cod id c) by Th9;
hence thesis by CAT_1:44;
end;
end;

theorem Th67:
for F being Injections_family of c,I st x in I holds cod(F/.x) = c
proof let F be Injections_family of c,I such that
A1:  x in I;
(cods F)/.x = (I --> c)/.x by Def17;
hence cod(F/.x) = (I --> c)/.x by A1,Def4 .= c by A1,Th2;
end;

theorem
for F being Function of {},the Morphisms of C
holds F is Injections_family of a,{}
proof let F be Function of {},the Morphisms of C;
thus {} --> a = {} by FUNCT_4:3 .= cods F by PARTFUN1:57;
end;

theorem Th69:
cod f = a implies {y} --> f is Injections_family of a,{y}
proof set F = {y} --> f;
assume
A1:  cod f = a;
now let x; assume
A2:  x in {y};
hence (cods F)/.x = cod(F/.x) by Def4
.= a by A1,A2,Th2
.= ({y} --> a)/.x by A2,Th2;
end;
hence cods F = {y} --> a by Th1;
end;

theorem Th70:
cod p1 = c & cod p2 = c
implies (x1,x2)-->(p1,p2) is Injections_family of c,{x1,x2}
proof
assume
A1:  cod p1 = c & cod p2 = c;
cods ((x1,x2)-->(p1,p2))
= (x1,x2) --> (cod p1,cod p2) by Th11 .= {x1,x2} --> c by A1,FUNCT_4:68;
hence thesis by Def17;
end;

canceled;

theorem Th72:
for F being Injections_family of b,I st dom f = b
holds f*F is Injections_family of cod f,I
proof let F be Injections_family of b,I;
assume dom f = b;
then cods F = I--> dom f by Def17;
hence cods(f*F) = I --> cod f by Th21;
end;

theorem
for F being Injections_family of b,I,
G being Function of I,the Morphisms of C st doms F = cods G
holds F"*"G is Injections_family of b,I
proof let F be Injections_family of b,I;
let G be Function of I,the Morphisms of C;
assume doms F = cods G;
then cods(F"*"G) = cods F by Th22;
hence cods(F"*"G) = I --> b by Def17;
end;

theorem Th74:
for F be Function of I,the Morphisms of C holds
F is Projections_family of c,I iff F opp is Injections_family of c opp,I
proof let F be Function of I,the Morphisms of C;
thus F is Projections_family of c,I
implies F opp is Injections_family of c opp,I
proof assume
A1:  doms F = I --> c;
now let x; assume
A2:   x in I;
hence (cods(F opp))/.x = cod((F opp)/.x) by Def4
.= cod((F/.x) opp) by A2,Def5
.= dom(F/.x) opp by OPPCAT_1:11
.= ((I --> c)/.x) opp by A1,A2,Def3
.= c opp by A2,Th2
.= (I --> (c opp))/.x by A2,Th2;
end;
hence cods(F opp) = I --> (c opp) by Th1;
end;
assume
A3:  cods(F opp) = I --> (c opp);
now let x; assume
A4:  x in I;
hence (doms F)/.x = dom(F/.x) by Def3
.= cod((F/.x) opp) by OPPCAT_1:9
.= cod((F opp)/.x) by A4,Def5
.= (I --> (c opp))/.x by A3,A4,Def4
.= c opp by A4,Th2
.= c by OPPCAT_1:def 2
.= (I --> c)/.x by A4,Th2;
end;
hence doms F = I --> c by Th1;
end;

theorem Th75:
for F be Function of I,the Morphisms of C opp, c being Object of C opp holds
F is Injections_family of c,I iff opp F is Projections_family of opp c,I
proof let F be Function of I,the Morphisms of C opp, c be Object of C opp;
thus F is Injections_family of c,I
implies opp F is Projections_family of opp c,I
proof assume
A1:   cods F = I --> c;
now let x; assume
A2:   x in I;
hence (doms opp F)/.x = dom(opp F/.x) by Def3
.= dom(opp(F/.x)) by A2,Def6
.= opp(cod(F/.x)) by OPPCAT_1:12
.= opp((I-->c)/.x) by A1,A2,Def4
.= opp c by A2,Th2
.= (I --> (opp c))/.x by A2,Th2;
end;
hence doms opp F = I --> (opp c) by Th1;
end;
assume
A3:  doms opp F = I --> (opp c);
now let x; assume
A4:  x in I;
hence (cods F)/.x = cod(F/.x) by Def4
.= dom(opp(F/.x)) by OPPCAT_1:10
.= dom(opp F/.x) by A4,Def6
.= (I -->(opp c))/.x by A3,A4,Def3
.= opp c by A4,Th2
.= c opp by OPPCAT_1:def 3
.= c by OPPCAT_1:def 2
.= (I --> c)/.x by A4,Th2;
end;
hence cods F = I --> c by Th1;
end;

theorem
for F being Injections_family of dom f,I holds (F opp)*(f opp) = (f*F) opp
proof let F be Injections_family of dom f, I;
now let x; assume
A1:  x in I;
then A2:  cod(F/.x) = (cods F)/.x by Def4
.= (I --> dom f)/.x by Def17
.= dom f by A1,Th2;
thus ((F opp)*(f opp))/.x = ((F opp)/.x)*(f opp) by A1,Def7
.= ((F/.x)opp)*(f opp) by A1,Def5
.= (f*(F/.x))opp by A2,OPPCAT_1:17
.= ((f*F)/.x)opp by A1,Def8
.= ((f*F) opp)/.x by A1,Def5;
end;
hence thesis by Th1;
end;

definition let C,c,I; let F be Function of I,the Morphisms of C;
pred c is_a_coproduct_wrt F means
:Def18:  F is Injections_family of c,I &
for d for F' being Injections_family of d,I st doms F = doms F'
ex h st h in Hom(c,d) &
for k st k in Hom(c,d) holds
(for x st x in I holds k*(F/.x) = F'/.x) iff h = k;
end;

theorem
for F being Function of I,the Morphisms of C holds
c is_a_product_wrt F iff c opp is_a_coproduct_wrt F opp
proof let F be Function of I,the Morphisms of C;
thus c is_a_product_wrt F implies c opp is_a_coproduct_wrt F opp
proof assume
A1:   c is_a_product_wrt F;
then F is Projections_family of c,I by Def15;
hence F opp is Injections_family of c opp,I by Th74;
let d be Object of C opp, F' be Injections_family of d,I such that
A2:   doms(F opp) = doms F';
reconsider oppF' = opp F' as Projections_family of opp d,I by Th75;
now let x; assume
A3:   x in I;
hence (cods F)/.x = cod(F/.x) by Def4
.= dom((F/.x)opp) by OPPCAT_1:9
.= dom(F opp/.x) by A3,Def5
.= (doms F')/.x by A2,A3,Def3
.= dom(F'/.x) by A3,Def3
.= cod(opp(F'/.x)) by OPPCAT_1:10
.= cod(oppF'/.x) by A3,Def6
.= (cods oppF')/.x by A3,Def4;
end;
then cods F = cods oppF' by Th1;
then consider h such that
A4:   h in Hom(opp d,c) and
A5:   for k st k in Hom(opp d,c) holds
(for x st x in I holds (F/.x)*k = oppF'/.x ) iff h = k by A1,Def15;
take h opp;
h opp in Hom(c opp,(opp d) opp) by A4,OPPCAT_1:13;
hence h opp in Hom(c opp,d) by OPPCAT_1:5;
let k be Morphism of C opp; assume
A6:   k in Hom(c opp,d);
then opp k in Hom(opp d,opp(c opp)) by OPPCAT_1:14;
then A7:   opp k in Hom(opp d,c) by OPPCAT_1:4;
thus (for x st x in I holds k*(F opp/.x) = F'/.x ) implies h opp = k
proof assume
A8:    for x st x in I holds k*(F opp/.x) = F'/.x;
now let x such that
A9:     x in I;
F is Projections_family of c,I by A1,Def15;
then dom(F/.x) = c by A9,Th45;
then cod((F/.x)opp) = c opp by OPPCAT_1:11;
then cod(F opp/.x) = c opp by A9,Def5;
then A10:     dom k = cod(F opp/.x) by A6,CAT_1:18;
opp(k*(F opp/.x)) = opp(F'/.x) by A8,A9;
hence oppF'/.x = opp(k*(F opp/.x)) by A9,Def6
.= (opp(F opp/.x))*(opp k) by A10,OPPCAT_1:19
.= (opp((F/.x)opp))*(opp k) by A9,Def5
.= (F/.x)*(opp k) by OPPCAT_1:7;
end;
then h = opp k by A5,A7;
hence h opp = k by OPPCAT_1:8;
end;
assume
A11:   h opp = k;
let x such that
A12:   x in I;
F is Projections_family of c,I by A1,Def15;
then dom(F/.x) = c by A12,Th45;
then A13:   cod opp k = dom(F/.x) by A7,CAT_1:18;
h = opp k by A11,OPPCAT_1:7;
then (F/.x)*(opp k) = oppF'/.x by A5,A7,A12;
then ((opp k) opp)*((F/.x)opp) = (oppF'/.x)opp by A13,OPPCAT_1:17;
then k*((F/.x)opp) = (oppF'/.x)opp by OPPCAT_1:8;
hence k*(F opp/.x) = (oppF'/.x)opp by A12,Def5
.= (opp(F'/.x))opp by A12,Def6
.= F'/.x by OPPCAT_1:8;
end;
assume
A14:  c opp is_a_coproduct_wrt F opp;
then F opp is Injections_family of c opp,I by Def18;
hence F is Projections_family of c,I by Th74;
let d; let F' be Projections_family of d,I such that
A15:  cods F = cods F';
reconsider F'opp = F' opp as Injections_family of d opp,I by Th74;
now let x; assume
A16:  x in I;
hence (doms(F opp))/.x = dom((F opp)/.x) by Def3
.= dom((F/.x) opp) by A16,Def5
.= cod(F/.x) by OPPCAT_1:9
.= (cods F')/.x by A15,A16,Def4
.= cod(F'/.x) by A16,Def4
.= dom((F'/.x)opp) by OPPCAT_1:9
.= dom((F' opp)/.x) by A16,Def5
.= (doms(F' opp))/.x by A16,Def3;

end;
then doms(F opp) = doms(F'opp) by Th1;
then consider h being Morphism of C opp such that
A17:  h in Hom(c opp,d opp) and
A18:  for k being Morphism of C opp st k in Hom(c opp,d opp) holds
(for x st x in I holds k*(F opp/.x) = F'opp/.x) iff h = k by A14,Def18;
take opp h;
opp h in Hom(opp(d opp),opp(c opp)) by A17,OPPCAT_1:14;
then opp h in Hom(d,opp(c opp)) by OPPCAT_1:4;
hence opp h in Hom(d,c) by OPPCAT_1:4;
let k; assume
A19:  k in Hom(d,c);
then A20:  k opp in Hom(c opp,d opp) by OPPCAT_1:13;
thus (for x st x in I holds (F/.x)*k = F'/.x) implies opp h = k
proof assume
A21:  for x st x in I holds (F/.x)*k = F'/.x;
now let x such that
A22:    x in I;
F opp is Injections_family of c opp,I by A14,Def18;
then cod(F opp/.x) = c opp by A22,Th67;
then cod((F/.x)opp) = c opp by A22,Def5;
then dom(F/.x) = c opp by OPPCAT_1:9;
then dom(F/.x) = c by OPPCAT_1:def 2;
then A23:    cod k = dom(F/.x) by A19,CAT_1:18;
(F/.x)*k = F'/.x by A21,A22;
then (k opp)*((F/.x)opp) = (F'/.x) opp by A23,OPPCAT_1:17;
hence F'opp/.x = (k opp)*((F/.x)opp) by A22,Def5
.= (k opp)*(F opp/.x) by A22,Def5;
end;
then h = k opp by A18,A20;
hence opp h = k by OPPCAT_1:7;
end;
assume
A24:  opp h = k;
let x such that
A25:  x in I;
F opp is Injections_family of c opp,I by A14,Def18;
then cod(F opp/.x) = c opp by A25,Th67;
then cod((F/.x)opp) = c opp by A25,Def5;
then dom(F/.x) = c opp by OPPCAT_1:9;
then dom(F/.x) = c by OPPCAT_1:def 2;
then A26:  cod k = dom(F/.x) by A19,CAT_1:18;
h = k opp by A24,OPPCAT_1:8;
then (k opp)*(F opp/.x) = F'opp/.x by A18,A20,A25;
then (k opp)*(F opp/.x) = (F'/.x)opp by A25,Def5;
hence F'/.x = (k opp)*(F opp/.x) by OPPCAT_1:def 4
.= (k opp)*((F/.x)opp) by A25,Def5
.= ((F/.x)*k) opp by A26,OPPCAT_1:17
.= (F/.x)*k by OPPCAT_1:def 4;
end;

theorem Th78:
for F being Injections_family of c,I, F' being Injections_family of d,I
st c is_a_coproduct_wrt F & d is_a_coproduct_wrt F' & doms F = doms F'
holds c,d are_isomorphic
proof
let F be Injections_family of c,I, F' be Injections_family of d,I such that
A1:  c is_a_coproduct_wrt F and
A2:  d is_a_coproduct_wrt F' and
A3:  doms F = doms F';
consider f such that
A4:  f in Hom(c,d) and
A5:  for k st k in Hom(c,d) holds
(for x st x in I holds k*(F/.x) = F'/.x ) iff f = k by A1,A3,Def18;
consider g such that
A6:  g in Hom(d,c) and
A7:  for k st k in Hom(d,c) holds
(for x st x in I holds k*(F'/.x) = F/.x ) iff g = k by A2,A3,Def18;
thus Hom(c,d) <> {} by A4;
reconsider f as Morphism of c,d by A4,CAT_1:def 7;
take f,g;
A8:  cod f = d & dom g = d & dom f = c & cod g = c by A4,A6,CAT_1:18;
hence dom g = cod f & cod g = dom f;
doms F' = doms F';
then consider fg being Morphism of C such that fg in Hom(d,d) and
A9:  for k st k in Hom(d,d) holds
(for x st x in I holds k*(F'/.x) = F'/.x) iff fg = k by A2,Def18;
A10:
now set k = id d;
thus k in Hom(d,d) by CAT_1:55;
let x;
assume x in I;
then cod(F'/.x) = d by Th67;
hence k*(F'/.x) = F'/.x by CAT_1:46;
end;
now cod(f*g) = d & dom(f*g) = d by A8,CAT_1:42;
hence f*g in Hom(d,d) by CAT_1:18;
let x; assume
A11:   x in I;
then cod(F'/.x) = d by Th67;
hence f*g*(F'/.x) = f*(g*(F'/.x)) by A8,CAT_1:43
.= f*(F/.x) by A6,A7,A11
.= F'/.x by A4,A5,A11;
end;
hence f*g = fg by A9 .= id cod f by A8,A9,A10;
A12:
now set k = id c;
thus k in Hom(c,c) by CAT_1:55;
let x;
assume x in I;
then cod(F/.x) = c by Th67;
hence k*(F/.x) = F/.x by CAT_1:46;
end;
doms F = doms F;
then consider gf being Morphism of C such that gf in Hom(c,c) and
A13:  for k st k in Hom(c,c) holds
(for x st x in I holds k*(F/.x) = F/.x ) iff gf = k by A1,Def18;
now cod(g*f) = c & dom(g*f) = c by A8,CAT_1:42;
hence g*f in Hom(c,c) by CAT_1:18;
let x; assume
A14:   x in I;
then cod(F/.x) = c by Th67;
hence g*f*(F/.x) = g*(f*(F/.x)) by A8,CAT_1:43
.= g*(F'/.x) by A4,A5,A14
.= F/.x by A6,A7,A14;
end;
hence g*f = gf by A13 .= id dom f by A8,A12,A13;
end;

theorem Th79:
for F being Injections_family of c,I
st c is_a_coproduct_wrt F &
for x1,x2 st x1 in I & x2 in I holds Hom(dom(F/.x1),dom(F/.x2)) <> {}
for x st x in I holds F/.x is coretraction
proof let F be Injections_family of c,I such that
A1:  c is_a_coproduct_wrt F and
A2:  for x1,x2 st x1 in I & x2 in I holds Hom(dom(F/.x1),dom(F/.x2)) <> {};
let x such that
A3:  x in I;
set d = dom(F/.x);
defpred P[set,set] means
(\$1 = x implies \$2 = id d) &
(\$1 <> x implies \$2 in Hom(dom(F/.\$1),d));
A4:  for y st y in I holds ex z st z in the Morphisms of C & P[y,z]
proof let y; assume y in I;
then A5:  Hom(dom(F/.y),d) <> {} by A2,A3;
consider z being Element of Hom(dom(F/.y),d);
A6:   z is Morphism of dom(F/.y),d by A5,CAT_1:21;
per cases;
suppose
A7:    y = x;
take z = id d;
thus z in the Morphisms of C;
thus (y = x implies z = id d) & (y <> x implies z in Hom(dom(F/.y),d))
by A7;
suppose
A8:    y <> x;
take z;
thus z in the Morphisms of C by A6;
thus (y = x implies z = id d) & (y <> x implies z in Hom(dom(F/.y),d))
by A5,A8;
end;
consider F' being Function such that
A9:  dom F' = I & rng F' c= the Morphisms of C and
A10:  for y st y in I holds P[y,F'.y] from NonUniqBoundFuncEx(A4);
reconsider F' as Function of I,the Morphisms of C by A9,FUNCT_2:def 1,
RELSET_1:11;
now
now let y; assume
A11:   y in I;
then F'.y = F'/.y & F'.x = F'/.x by A3,Def1;
then (y = x implies F'/.y = id d) &
(y <> x implies F'/.y in Hom(dom(F/.y),d)) by A10,A11;
then cod(F'/.y) = d by CAT_1:18,44;
hence (cods F')/.y = d by A11,Def4 .= (I-->d)/.y by A11,Th2;
end;
hence cods F' = I --> d by Th1;
hence F' is Injections_family of d,I by Def17;
now let y; assume
A12:   y in I;
then F'.y = F'/.y & F'.x = F'/.x by A3,Def1;
then (y = x implies F'/.y = id d) &
(y <> x implies F'/.y in Hom(dom(F/.y),d)) by A10,A12;
then dom(F'/.y) = dom(F/.y) by CAT_1:18,44;
hence (doms F')/.y = dom(F/.y) by A12,Def3 .= (doms F)/.y by A12,Def3;
end;
hence doms F = doms F' by Th1;
end;
then consider i such that
A13:  i in Hom(c,d) and
A14:  for k st k in Hom(c,d) holds
(for y st y in I holds k*(F/.y) = F'/.y) iff i = k by A1,Def18;
take i;
thus dom i = c by A13,CAT_1:18 .= cod(F/.x) by A3,Th67;
thus i*(F/.x) = F'/.x by A3,A13,A14 .= F'.x by A3,Def1 .= id d by A3,A10;
end;

theorem Th80:
for F being Injections_family of a,I
st a is_a_coproduct_wrt F & dom f = a & cod f = b & f is invertible
holds b is_a_coproduct_wrt f*F
proof let F be Injections_family of a,I such that
A1:  a is_a_coproduct_wrt F and
A2:  dom f = a & cod f = b and
A3:  f is invertible;
thus f*F is Injections_family of b,I by A2,Th72;
let c;
let F' be Injections_family of c,I such that
A4:  doms(f*F) = doms F';
cods F = I-->dom f by A2,Def17;
then doms F = doms F' by A4,Th21;
then consider h such that
A5:  h in Hom(a,c) and
A6:  for k st k in Hom(a,c) holds
(for x st x in I holds k*(F/.x) = F'/.x) iff h = k by A1,Def18;
consider g such that
A7:  dom g = cod f & cod g = dom f and
A8:  f*g = id cod f and
A9:  g*f = id dom f by A3,CAT_1:def 12;
take hg = h*g;
A10:  dom h = a & cod h = c by A5,CAT_1:18;
then cod(h*g) = c & dom(h*g) = b by A2,A7,CAT_1:42;
hence hg in Hom(b,c) by CAT_1:18;
let k; assume k in Hom(b,c);
then A11:  cod k = c & dom k = b by CAT_1:18;
thus (for x st x in I holds k*((f*F)/.x) = F'/.x) implies hg = k
proof assume
A12:  for x st x in I holds k*((f*F)/.x) = F'/.x;
now cod(k*f) = c & dom(k*f) = a by A2,A11,CAT_1:42;
hence k*f in Hom(a,c) by CAT_1:18;
let x; assume
A13:    x in I;
then cod(F/.x) = a by Th67;
hence k*f*(F/.x) = k*(f*(F/.x)) by A2,A11,CAT_1:43
.= k*((f*F)/.x) by A13,Def8
.= F'/.x by A12,A13;
end;
then k*f*g = h*g by A6;
hence hg = k*(id b) by A2,A7,A8,A11,CAT_1:43 .= k by A11,CAT_1:47;
end;
assume
A14:  hg = k;
let x; assume
A15:  x in I;
then A16:  cod(F/.x) = a by Th67;
then A17:  cod(f*(F/.x)) = b by A2,CAT_1:42;
thus k*((f*F)/.x) = k*(f*(F/.x)) by A15,Def8
.= h*(g*(f*(F/.x))) by A2,A7,A10,A14,A17,CAT_1:43
.= h*((id dom f)*(F/.x)) by A2,A7,A9,A16,CAT_1:43
.= h*(F/.x) by A2,A16,CAT_1:46
.= F'/.x by A5,A6,A15;
end;

theorem Th81:
for F being Injections_family of a,{} holds
a is_a_coproduct_wrt F iff a is initial
proof let F be Injections_family of a,{};
thus a is_a_coproduct_wrt F implies a is initial
proof assume
A1:   a is_a_coproduct_wrt F;
let b;
consider F' being Injections_family of b,{};
doms F = {} & doms F' = {} by PARTFUN1:57;
then consider h such that
A2:   h in Hom(a,b) and
A3:   for k st k in Hom(a,b) holds
(for x st x in {} holds k*(F/.x) = F'/.x ) iff h = k by A1,Def18;
thus
Hom(a,b)<>{} by A2;
reconsider f = h as Morphism of a,b by A2,CAT_1:def 7;
take f;
let g be Morphism of a,b;
g in Hom(a,b) & for x st x in {} holds g*(F/.x) = F'/.x
by A2,CAT_1:def 7;
hence f=g by A3;
end;
assume
A4:  a is initial;
thus F is Injections_family of a,{};
let b;
let F' be Injections_family of b,{} such that doms F = doms F';
consider h being Morphism of a,b such that
A5:  for g being Morphism of a,b holds h = g by A4,CAT_1:def 16;
take h;
Hom(a,b)<>{} by A4,CAT_1:def 16;
hence h in Hom(a,b) by CAT_1:def 7;
let k;
assume k in Hom(a,b);
then k is Morphism of a,b by CAT_1:def 7;
hence (for x st x in {} holds k*(F/.x) = F'/.x ) iff h = k by A5;
end;

theorem
a is_a_coproduct_wrt {y} --> id a
proof set F = {y} --> id a;
cod(id a) = a by CAT_1:44;
hence F is Injections_family of a,{y} by Th69;
let b; let F' be Injections_family of b,{y} such that
A1:  doms F = doms F';
take h = F'/.y;
A2:  y in {y} by TARSKI:def 1;
now
thus cod h = b by A2,Th67;
thus dom h = (doms F)/.y by A1,A2,Def3
.= dom(F/.y) by A2,Def3
.= dom(id a) by A2,Th2
.= a by CAT_1:44;
end;
hence h in Hom(a,b) by CAT_1:18;
let k; assume k in Hom(a,b);
then A3:  dom k = a by CAT_1:18;
thus (for x st x in {y} holds k*(F/.x) = F'/.x) implies h = k
proof assume
A4:   for x st x in {y} holds k*(F/.x) = F'/.x;
thus k = k*(id a) by A3,CAT_1:47
.= k*(F/.y) by A2,Th2
.= h by A2,A4;
end;
assume
A5:  h = k;
let x; assume
A6:  x in {y};
hence F'/.x = k by A5,TARSKI:def 1
.= k*(id a) by A3,CAT_1:47
.= k*(F/.x) by A6,Th2;
end;

theorem
for F being Injections_family of a,I
st a is_a_coproduct_wrt F &
for x st x in I holds dom(F/.x) is initial
holds a is initial
proof let F be Injections_family of a,I such that
A1:  a is_a_coproduct_wrt F and
A2:  for x st x in I holds dom(F/.x) is initial;
now
thus I = {} implies a is initial by A1,Th81;
let b;
deffunc f(set) = init(dom(F/.\$1),b);
consider F' being Function of I, the Morphisms of C such that
A3:  for x st x in I holds F'/.x = f(x) from LambdaIdx;
now let x; assume
A4:  x in I;
then A5:  dom(F/.x) is initial by A2;
thus (cods F')/.x = cod(F'/.x) by A4,Def4
.= cod(init(dom(F/.x),b)) by A3,A4
.= b by A5,Th42
.= (I-->b)/.x by A4,Th2;
end;
then cods F' = I --> b by Th1;
then reconsider F' as Injections_family of b,I by Def17;
now let x; assume
A6:  x in I;
then A7:  dom(F/.x) is initial by A2;
thus (doms F)/.x = dom(F/.x) by A6,Def3
.= dom(init(dom(F/.x),b)) by A7,Th42
.= dom(F'/.x) by A3,A6
.= (doms F')/.x by A6,Def3;
end;
then doms F = doms F' by Th1;
then consider h such that
A8:  h in Hom(a,b) and
A9:  for k st k in Hom(a,b) holds
(for x st x in I holds k*(F/.x) = F'/.x) iff h = k by A1,Def18;
thus
Hom(a,b)<>{} by A8;
reconsider h as Morphism of a,b by A8,CAT_1:def 7;
take h; let g be Morphism of a,b;
now
thus g in Hom(a,b) by A8,CAT_1:def 7;
let x;
set c = dom(F/.x);
assume
A10:   x in I;
then c is initial by A2;
then consider f being Morphism of c,b such that
A11:   for f' being Morphism of c,b holds f = f' by CAT_1:def 16;
cod g = b & dom g = a & cod(F/.x) = a by A8,A10,Th67,CAT_1:23;
then cod(g*(F/.x)) = b & dom(g*(F/.x)) = c by CAT_1:42;
then g*(F/.x) in Hom(c,b) by CAT_1:18;
then A12:   g*(F/.x) is Morphism of c,b by CAT_1:def 7;
F'/.x = init(c,b) by A3,A10;
hence F'/.x = f by A11 .= g*(F/.x) by A11,A12;
end;
hence h = g by A9;
end;
hence thesis by CAT_1:def 16;
end;

definition let C,c,i1,i2;
pred c is_a_coproduct_wrt i1,i2 means
:Def19:
cod i1 = c & cod i2 = c &
for d,f,g st f in Hom(dom i1,d) & g in Hom(dom i2,d)
ex h st h in Hom(c,d) &
for k st k in Hom(c,d) holds k*i1 = f & k*i2 = g iff h = k;
end;

theorem
c is_a_product_wrt p1,p2 iff c opp is_a_coproduct_wrt p1 opp, p2 opp
proof set i1 = p1 opp,i2 = p2 opp;
thus c is_a_product_wrt p1,p2
implies c opp is_a_coproduct_wrt p1 opp, p2 opp
proof assume that
A1:  dom p1 = c & dom p2 = c and
A2:  for d,f,g st f in Hom(d,cod p1) & g in Hom(d,cod p2)
ex h st h in Hom(d,c) &
for k st k in Hom(d,c) holds p1*k = f & p2*k = g iff h = k;
dom p1 = c opp & dom p2 = c opp by A1,OPPCAT_1:def 2;
hence
A3:  cod i1 = c opp & cod i2 = c opp by OPPCAT_1:9;
let d be Object of C opp, f,g be Morphism of C opp;
assume f in Hom(dom i1,d) & g in Hom(dom i2,d);
then opp f in Hom(opp d, opp(dom i1)) & opp g in Hom(opp d,opp(dom i2))
by OPPCAT_1:14;
then opp f in Hom(opp d, cod opp i1) & opp g in Hom(opp d,cod opp i2)
by OPPCAT_1:12;
then opp f in Hom(opp d, cod p1) & opp g in Hom(opp d,cod p2)
by OPPCAT_1:7;
then consider h such that
A4:  h in Hom(opp d,c) and
A5:  for k st k in Hom(opp d,c)
holds p1*k = opp f & p2*k = opp g iff h = k by A2;
take h opp;
h opp in Hom(c opp,(opp d) opp) by A4,OPPCAT_1:13;
hence h opp in Hom(c opp,d) by OPPCAT_1:5;
let k be Morphism of C opp;
assume
A6:  k in Hom(c opp,d);
then opp k in Hom(opp d,opp(c opp)) by OPPCAT_1:14;
then opp k in Hom(opp d,c) by OPPCAT_1:4;
then p1*(opp k) = opp f & p2*(opp k) = opp g iff h = opp k by A5;
then p1*(opp k) = f opp & p2*(opp k) = g opp iff h = k opp
by OPPCAT_1:def 5;
then p1*(opp k) = f & p2*(opp k) = g iff h = k by OPPCAT_1:def 4;
then ((opp i1)*(opp k) = f & (opp i2)*(opp k) = g iff h opp = k)
& dom k = c opp by A6,CAT_1:18,OPPCAT_1:7,def 4;
then opp(k*i1) = f & opp(k*i2) = g iff h opp = k by A3,OPPCAT_1:19;
then (k*i1)opp = f & (k*i2)opp = g iff h opp = k by OPPCAT_1:def 5;
hence k*i1 = f & k*i2 = g iff h opp = k by OPPCAT_1:def 4;
end;
assume that
A7:  cod i1 = c opp & cod i2 = c opp and
A8:  for d being Object of C opp, f,g being Morphism of C opp
st f in Hom(dom i1,d) & g in Hom(dom i2,d)
ex h being Morphism of C opp st h in Hom(c opp,d) &
for k being Morphism of C opp
st k in Hom(c opp,d) holds k*i1 = f & k*i2 = g iff h = k;
dom p1 = c opp & dom p2 = c opp by A7,OPPCAT_1:9;
hence
A9:  dom p1 = c & dom p2 = c by OPPCAT_1:def 2;
let d,f,g;
assume f in Hom(d,cod p1) & g in Hom(d,cod p2);
then f opp in Hom((cod p1) opp,d opp) & g opp in Hom((cod p2)opp,d opp)
by OPPCAT_1:13;
then f opp in Hom(dom (p1 opp),d opp) & g opp in Hom(dom (p2 opp),d opp)
by OPPCAT_1:11;
then consider h being Morphism of C opp such that
A10:  h in Hom(c opp,d opp) and
A11:  for k being Morphism of C opp st k in Hom(c opp,d opp)
holds k*i1 = f opp & k*i2 = g opp iff h = k by A8;
take opp h;
h = (opp h) opp by OPPCAT_1:8;
hence opp h in Hom(d,c) by A10,OPPCAT_1:13;
let k;
assume
A12:  k in Hom(d,c);
then k opp in Hom(c opp,d opp) by OPPCAT_1:13;
then (k opp)*i1 = f opp & (k opp)*i2 = g opp iff h = k opp by A11;
then ((k opp)*i1 = f & (k opp)*i2 = g iff h opp = k opp) & cod k = c
by A12,CAT_1:18,OPPCAT_1:def 4;
then (p1*k) opp = f & (p2*k) opp = g iff h opp = k
by A9,OPPCAT_1:17,def 4;
hence thesis by OPPCAT_1:def 4,def 5;
end;

theorem Th85:
x1 <> x2 implies
(c is_a_coproduct_wrt i1,i2 iff c is_a_coproduct_wrt (x1,x2)-->(i1,i2))
proof set F = (x1,x2)-->(i1,i2), I = {x1,x2};
assume
A1:  x1 <> x2;
thus c is_a_coproduct_wrt i1,i2 implies c is_a_coproduct_wrt F
proof assume
A2:   c is_a_coproduct_wrt i1,i2;
then cod i1 = c & cod i2 = c by Def19;
hence F is Injections_family of c,I by Th70;
let b; let F' be Injections_family of b,I such that
A3:   doms F = doms F';
set f = F'/.x1, g = F'/.x2;
A4:   x1 in I & x2 in I by TARSKI:def 2;
then (doms F)/.x1 = dom(F/.x1) & (doms F)/.x2 = dom(F/.x2) by Def3;
then dom f = dom(F/.x1) & dom g = dom(F/.x2) by A3,A4,Def3;
then dom f = dom i1 & dom g = dom i2 & cod f = b & cod g = b
by A1,A4,Th7,Th67;
then f in Hom(dom i1,b) & g in Hom(dom i2,b) by CAT_1:18;
then consider h such that
A5:   h in Hom(c,b) and
A6:   for k st k in Hom(c,b) holds k*i1 = f & k*i2 = g iff h = k by A2,Def19;
take h;
thus h in Hom(c,b) by A5;
let k such that
A7:   k in Hom(c,b);
thus (for x st x in I holds k*(F/.x) = F'/.x ) implies h = k
proof assume for x st x in I holds k*(F/.x) = F'/.x;
then k*(F/.x1) = f & k*(F/.x2) = g by A4;
then k*i1 = f & k*i2 = g by A1,Th7;
hence h = k by A6,A7;
end;
assume
A8:   h = k;
let x such that
A9:   x in I;
k*i1 = f & k*i2 = g by A6,A7,A8;
then k*(F/.x1) = f & k*(F/.x2) = g & (x = x1 or x = x2)
by A1,A9,Th7,TARSKI:def 2;
hence thesis;
end;
assume
A10:  c is_a_coproduct_wrt F;
then x1 in I & x2 in I & F is Injections_family of c,I by Def18,TARSKI:def 2
;
then cod(F/.x1) = c & cod(F/.x2) = c by Th67;
hence cod i1 = c & cod i2 = c by A1,Th7;
let d,f,g such that
A11:  f in Hom(dom i1,d) and
A12:  g in Hom(dom i2,d);
cod f = d & cod g = d by A11,A12,CAT_1:18;
then reconsider F' = (x1,x2) --> (f,g) as Injections_family of d,I by Th70;
doms F = (x1,x2)-->(dom i1,dom i2) by Th10
.= (x1,x2)-->(dom f,dom i2) by A11,CAT_1:18
.= (x1,x2)-->(dom f,dom g) by A12,CAT_1:18
.= doms F' by Th10;
then consider h such that
A13:  h in Hom(c,d) and
A14:  for k st k in Hom(c,d) holds
(for x st x in I holds k*(F/.x) = F'/.x ) iff h = k by A10,Def18;
take h;
thus h in Hom(c,d) by A13;
let k such that
A15:  k in Hom(c,d);
thus k*i1 = f & k*i2 = g implies h = k
proof assume
A16:  k*i1 = f & k*i2 = g;
now let x;
assume x in I;
then x = x1 or x = x2 by TARSKI:def 2;
then F/.x = i1 & F'/.x = f or F/.x = i2 & F'/.x = g by A1,Th7;
hence k*(F/.x) = F'/.x by A16;
end;
hence h = k by A14,A15;
end;
assume h = k;
then x1 in I & x2 in I & for x st x in I holds k*(F/.x) = F'/.x
by A14,A15,TARSKI:def 2;
then k*(F/.x1) = F'/.x1 & k*(F/.x2) = F'/.x2;
then k*(F/.x1) = f & k*(F/.x2) = g by A1,Th7;
hence k*i1 = f & k*i2 = g by A1,Th7;
end;

theorem
c is_a_coproduct_wrt i1,i2 & d is_a_coproduct_wrt j1,j2 &
dom i1 = dom j1 & dom i2 = dom j2 implies c,d are_isomorphic
proof assume that
A1:  c is_a_coproduct_wrt i1,i2 and
A2:  d is_a_coproduct_wrt j1,j2 and
A3:  dom i1 = dom j1 & dom i2 = dom j2;
set I = {0,1}, F = (0,1)-->(i1,i2), F' = (0,1)-->(j1,j2);
now cod i1 = c & cod i2 = c & cod j1 = d & cod j2 = d by A1,A2,Def19;
hence F is Injections_family of c,I & F' is Injections_family of d,I
by Th70;
thus c is_a_coproduct_wrt F & d is_a_coproduct_wrt F' by A1,A2,Th85;
thus doms F = (0,1)-->(dom j1,dom j2) by A3,Th10 .= doms F' by Th10;
end;
hence thesis by Th78;
end;

theorem
Hom(a,c) <> {} & Hom(b,c) <> {} implies
for i1 being Morphism of a,c, i2 being Morphism of b,c
holds c is_a_coproduct_wrt i1,i2 iff
for d st Hom(a,d)<>{} & Hom(b,d)<>{} holds
Hom(c,d) <> {} &
for f being Morphism of a,d, g being Morphism of b,d
ex h being Morphism of c,d st
for k being Morphism of c,d holds k*i1 = f & k*i2 = g iff h = k
proof assume
A1:  Hom(a,c) <> {} & Hom(b,c) <> {};
let i1 be Morphism of a,c, i2 be Morphism of b,c;
thus c is_a_coproduct_wrt i1,i2 implies
for d st Hom(a,d)<>{} & Hom(b,d)<>{} holds
Hom(c,d) <> {} &
for f being Morphism of a,d, g being Morphism of b,d
ex h being Morphism of c,d st
for k being Morphism of c,d holds k*i1 = f & k*i2 = g iff h = k
proof assume that cod i1 = c & cod i2 = c and
A2:  for d,f,g st f in Hom(dom i1,d) & g in Hom(dom i2,d)
ex h st h in Hom(c,d) &
for k st k in Hom(c,d) holds k*i1 = f & k*i2 = g iff h = k;
let d such that
A3:  Hom(a,d)<>{} & Hom(b,d)<>{};
consider f being Morphism of a,d, g being Morphism of b,d;
A4:   dom i1 = a & dom i2 = b by A1,CAT_1:23;
then f in Hom(dom i1,d) & g in Hom(dom i2,d) by A3,CAT_1:def 7;
then A5: ex h st h in Hom(c,d) &
for k st k in Hom(c,d) holds k*i1 = f & k*i2 = g iff h = k by A2;
hence
Hom(c,d) <> {};
let f be Morphism of a,d, g be Morphism of b,d;
f in Hom(dom i1,d) & g in Hom(dom i2,d) by A3,A4,CAT_1:def 7;
then consider h such that
A6:  h in Hom(c,d) and
A7:  for k st k in Hom(c,d) holds k*i1 = f & k*i2 = g iff h = k by A2;
reconsider h as Morphism of c,d by A6,CAT_1:def 7;
take h;
let k be Morphism of c,d;
k*i1 = k*(i1 qua Morphism of C) & k*i2 = k*(i2 qua Morphism of C) &
k in Hom(c,d) by A1,A5,CAT_1:def 7,def 13;
hence thesis by A7;
end;
assume
A8:  for d st Hom(a,d)<>{} & Hom(b,d)<>{} holds
Hom(c,d) <> {} &
for f being Morphism of a,d, g being Morphism of b,d
ex h being Morphism of c,d st
for k being Morphism of c,d holds k*i1 = f & k*i2 = g iff h = k;
thus cod i1 = c & cod i2 = c by A1,CAT_1:23;
let d,f,g such that
A9:  f in Hom(dom i1,d) and
A10:  g in Hom(dom i2,d);
A11:  dom i1 = a & dom i2 = b by A1,CAT_1:23;
then f is Morphism of a,d & g is Morphism of b,d &
Hom(a,d) <> {} & Hom(b,d) <> {} by A9,A10,CAT_1:def 7;
then consider h being Morphism of c,d such that
A12:  for k being Morphism of c,d holds k*i1 = f & k*i2 = g iff h = k by A8;
reconsider h' = h as Morphism of C;
take h';
A13:  Hom(c,d) <> {} by A8,A9,A10,A11;
hence h' in Hom(c,d) by CAT_1:def 7;
let k;
assume k in Hom(c,d);
then reconsider k' = k as Morphism of c,d by CAT_1:def 7;
k*i1 = k'*i1 & k*i2 = k'*i2 by A1,A13,CAT_1:def 13;
hence thesis by A12;
end;

theorem
c is_a_coproduct_wrt i1,i2 &
Hom(dom i1,dom i2) <> {} & Hom(dom i2,dom i1) <> {}
implies i1 is coretraction & i2 is coretraction
proof assume that
A1:  c is_a_coproduct_wrt i1,i2 and
A2:  Hom(dom i1,dom i2) <> {} & Hom(dom i2,dom i1) <> {};
set I = {0,1}, F = (0,1)-->(i1,i2);
A3:  F/.0 = i1 & F/.1 = i2 by Th7;
now cod i1 = c & cod i2 = c by A1,Def19;
hence F is Injections_family of c,I by Th70;
thus c is_a_coproduct_wrt F by A1,Th85;
let x1,x2; assume x1 in I & x2 in I;
then (x1 = 0 or x1 = 1) & (x2 = 0 or x2 = 1) by TARSKI:def 2;
hence Hom(dom(F/.x1),dom(F/.x2)) <> {} by A2,A3,CAT_1:56;
end;
then 0 in I & 1 in I & for x st x in I holds F/.x is coretraction
by Th79,TARSKI:def 2;
hence thesis by A3;
end;

theorem Th89:
c is_a_coproduct_wrt i1,i2 & h in Hom(c,c) & h*i1 = i1 & h*i2 = i2
implies h = id c
proof
assume that
A1:  cod i1 = c and
A2:  cod i2 = c and
A3:  for d,f,g st f in Hom(dom i1,d) & g in Hom(dom i2,d)
ex h st h in Hom(c,d) &
for k st k in Hom(c,d) holds k*i1 = f & k*i2 = g iff h = k and
A4:  h in Hom(c,c) and
A5:  h*i1 = i1 & h*i2 = i2;
i1 in Hom(dom i1,c) & i2 in Hom(dom i2,c) by A1,A2,CAT_1:18;
then consider i such that i in Hom(c,c) and
A6:  for k st k in Hom(c,c) holds k*i1 = i1 & k*i2 = i2 iff i = k by A3;
id c in Hom(c,c) & (id c)*i1 = i1 & (id c)*i2 = i2 by A1,A2,CAT_1:46,55;
hence id c = i by A6 .= h by A4,A5,A6;
end;

theorem
c is_a_coproduct_wrt i1,i2 & dom f = c & cod f = d & f is invertible
implies d is_a_coproduct_wrt f*i1,f*i2
proof
assume that
A1:  c is_a_coproduct_wrt i1,i2 and
A2:  dom f = c & cod f = d & f is invertible;
cod i1 = c & cod i2 = c by A1,Def19;
then c is_a_coproduct_wrt (0,1)-->(i1,i2) &
(0,1)-->(i1,i2) is Injections_family of c,{0,1} by A1,Th70,Th85;
then d is_a_coproduct_wrt f*((0,1)-->(i1,i2)) by A2,Th80;
then d is_a_coproduct_wrt (0,1)-->(f*i1,f*i2) by Th19;
hence d is_a_coproduct_wrt f*i1,f*i2 by Th85;
end;

theorem
c is_a_coproduct_wrt i1,i2 & dom i2 is initial
implies dom i1,c are_isomorphic
proof set a = dom i1, b = dom i2;
assume that
A1: c is_a_coproduct_wrt i1,i2 and
A2: b is initial;
A3:  cod i1 = c & cod i2 = c by A1,Def19;
hence Hom(a,c)<>{} by CAT_1:19;
reconsider i = i1 as Morphism of a,c by A3,CAT_1:22;
take i;
set f = id(a),g = init(b,a);
cod g = a & dom g = b by A2,Th42;
then f in Hom(a,a) & g in Hom(b,a) by CAT_1:18,55;
then consider h such that
A4:  h in Hom(c,a) and
A5:  for k st k in Hom(c,a) holds k*i1 = f & k*i2 = g iff h = k by A1,Def19;
take h;
thus dom h = cod i & cod h = dom i by A3,A4,CAT_1:18;
now
A6:  cod h = a & dom h = c by A4,CAT_1:18;
then A7:  cod(i*h) = c & dom(i*h) = c by A3,CAT_1:42;
hence i*h in Hom(c,c) by CAT_1:18;
thus i*h*i1 = i*(h*i1) by A3,A6,CAT_1:43
.= i*(id dom i) by A4,A5
.= i by CAT_1:47;
cod(i*h*i2) = c & dom(i*h*i2) = b by A3,A7,CAT_1:42;
hence i*h*i2 = init(b,c) by A2,Th43 .= i2 by A2,A3,Th43;
end;
hence i*h = id cod i by A1,A3,Th89;
thus id dom i = h*i by A4,A5;
end;

theorem
c is_a_coproduct_wrt i1,i2 & dom i1 is initial
implies dom i2,c are_isomorphic
proof set a = dom i1, b = dom i2;
assume that
A1: c is_a_coproduct_wrt i1,i2 and
A2: a is initial;
A3:  cod i1 = c & cod i2 = c by A1,Def19;
hence Hom(b,c)<>{} by CAT_1:19;
reconsider i = i2 as Morphism of b,c by A3,CAT_1:22;
take i;
set f = id(b),g = init(a,b);
cod g = b & dom g = a by A2,Th42;
then f in Hom(b,b) & g in Hom(a,b) by CAT_1:18,55;
then consider h such that
A4:  h in Hom(c,b) and
A5:  for k st k in Hom(c,b) holds k*i1 = g & k*i2 = f iff h = k by A1,Def19;
take h;
thus dom h = cod i & cod h = dom i by A3,A4,CAT_1:18;
now
A6:  cod h = b & dom h = c by A4,CAT_1:18;
then A7:  cod(i*h) = c & dom(i*h) = c by A3,CAT_1:42;
hence i*h in Hom(c,c) by CAT_1:18;
cod(i*h*i1) = c & dom(i*h*i1) = a by A3,A7,CAT_1:42;
hence i*h*i1 = init(a,c) by A2,Th43 .= i1 by A2,A3,Th43;
thus i*h*i2 = i*(h*i2) by A3,A6,CAT_1:43
.= i*(id dom i) by A4,A5
.= i by CAT_1:47;
end;
hence i*h = id cod i by A1,A3,Th89;
thus id dom i = h*i by A4,A5;
end;
```