:: ISOCAT_2 semantic presentation

definition
let c1, c2, c3 be non empty set ;
let c4 be Function of c1, Funcs c2,c3;
redefine func uncurry as uncurry c4 -> Function of [:a1,a2:],a3;
coherence
uncurry c4 is Function of [:c1,c2:],c3
proof end;
end;

theorem Th1: :: ISOCAT_2:1
for b1, b2, b3 being non empty set
for b4 being Function of b1, Funcs b2,b3 holds curry (uncurry b4) = b4
proof end;

theorem Th2: :: ISOCAT_2:2
for b1, b2, b3 being non empty set
for b4 being Function of b1, Funcs b2,b3
for b5 being Element of b1
for b6 being Element of b2 holds (uncurry b4) . [b5,b6] = (b4 . b5) . b6
proof end;

theorem Th3: :: ISOCAT_2:3
for b1 being set
for b2 being non empty set
for b3, b4 being Function of {b1},b2 st b3 . b1 = b4 . b1 holds
b3 = b4
proof end;

theorem Th4: :: ISOCAT_2:4
for b1, b2 being non empty set
for b3 being Element of b1
for b4 being Function of b1,b2 holds b4 . b3 in rng b4
proof end;

theorem Th5: :: ISOCAT_2:5
for b1, b2, b3 being non empty set
for b4, b5 being Function of b1,[:b2,b3:] st (pr1 b2,b3) * b4 = (pr1 b2,b3) * b5 & (pr2 b2,b3) * b4 = (pr2 b2,b3) * b5 holds
b4 = b5
proof end;

theorem Th6: :: ISOCAT_2:6
for b1 being Category
for b2 being Morphism of b1 holds (id (cod b2)) * b2 = b2
proof end;

theorem Th7: :: ISOCAT_2:7
for b1 being Category
for b2 being Morphism of b1 holds b2 * (id (dom b2)) = b2
proof end;

theorem Th8: :: ISOCAT_2:8
for b1, b2 being Category
for b3 being set holds
( b3 is Object of (Functors b1,b2) iff b3 is Functor of b1,b2 )
proof end;

theorem Th9: :: ISOCAT_2:9
for b1, b2 being Category
for b3 being Morphism of (Functors b1,b2) ex b4, b5 being Functor of b1,b2ex b6 being natural_transformation of b4,b5 st
( b4 is_naturally_transformable_to b5 & dom b3 = b4 & cod b3 = b5 & b3 = [[b4,b5],b6] )
proof end;

definition
let c1, c2 be Category;
let c3 be Object of c1;
func c3 |-> c2 -> Functor of Functors a1,a2,a2 means :Def1: :: ISOCAT_2:def 1
for b1, b2 being Functor of a1,a2
for b3 being natural_transformation of b1,b2 st b1 is_naturally_transformable_to b2 holds
a4 . [[b1,b2],b3] = b3 . a3;
existence
ex b1 being Functor of Functors c1,c2,c2 st
for b2, b3 being Functor of c1,c2
for b4 being natural_transformation of b2,b3 st b2 is_naturally_transformable_to b3 holds
b1 . [[b2,b3],b4] = b4 . c3
proof end;
uniqueness
for b1, b2 being Functor of Functors c1,c2,c2 st ( for b3, b4 being Functor of c1,c2
for b5 being natural_transformation of b3,b4 st b3 is_naturally_transformable_to b4 holds
b1 . [[b3,b4],b5] = b5 . c3 ) & ( for b3, b4 being Functor of c1,c2
for b5 being natural_transformation of b3,b4 st b3 is_naturally_transformable_to b4 holds
b2 . [[b3,b4],b5] = b5 . c3 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def1 defines |-> ISOCAT_2:def 1 :
for b1, b2 being Category
for b3 being Object of b1
for b4 being Functor of Functors b1,b2,b2 holds
( b4 = b3 |-> b2 iff for b5, b6 being Functor of b1,b2
for b7 being natural_transformation of b5,b6 st b5 is_naturally_transformable_to b6 holds
b4 . [[b5,b6],b7] = b7 . b3 );

Lemma11: for b1, b2 being set holds
( the Objects of (1Cat b1,b2) = {b1} & the Morphisms of (1Cat b1,b2) = {b2} )
proof end;

theorem Th10: :: ISOCAT_2:10
canceled;

theorem Th11: :: ISOCAT_2:11
for b1 being Category
for b2, b3 being set holds Functors (1Cat b2,b3),b1 ~= b1
proof end;

theorem Th12: :: ISOCAT_2:12
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Object of b1
for b6 being Object of b2 holds (b4 ?- b5) . b6 = b4 . [b5,b6]
proof end;

theorem Th13: :: ISOCAT_2:13
for b1, b2 being Category
for b3, b4 being Object of b1
for b5, b6 being Object of b2 holds
( ( Hom b3,b4 <> {} & Hom b5,b6 <> {} ) iff Hom [b3,b5],[b4,b6] <> {} )
proof end;

theorem Th14: :: ISOCAT_2:14
for b1, b2 being Category
for b3, b4 being Object of b1
for b5, b6 being Object of b2 st Hom [b3,b5],[b4,b6] <> {} holds
for b7 being Morphism of b1
for b8 being Morphism of b2 holds
( [b7,b8] is Morphism of [b3,b5],[b4,b6] iff ( b7 is Morphism of b3,b4 & b8 is Morphism of b5,b6 ) )
proof end;

theorem Th15: :: ISOCAT_2:15
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st b4 is_naturally_transformable_to b5 holds
for b6 being natural_transformation of b4,b5
for b7 being Object of b1 holds
( b4 ?- b7 is_naturally_transformable_to b5 ?- b7 & (curry b6) . b7 is natural_transformation of b4 ?- b7,b5 ?- b7 )
proof end;

definition
let c1, c2, c3 be Category;
let c4 be Functor of [:c1,c2:],c3;
let c5 be Morphism of c1;
func curry c4,c5 -> Function of the Morphisms of a2,the Morphisms of a3 equals :: ISOCAT_2:def 2
(curry a4) . a5;
coherence
(curry c4) . c5 is Function of the Morphisms of c2,the Morphisms of c3
proof end;
end;

:: deftheorem Def2 defines curry ISOCAT_2:def 2 :
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Morphism of b1 holds curry b4,b5 = (curry b4) . b5;

theorem Th16: :: ISOCAT_2:16
for b1, b2 being Category
for b3, b4 being Object of b1
for b5, b6 being Object of b2
for b7 being Morphism of b1
for b8 being Morphism of b2 st b7 in Hom b3,b4 & b8 in Hom b5,b6 holds
[b7,b8] in Hom [b3,b5],[b4,b6]
proof end;

theorem Th17: :: ISOCAT_2:17
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5, b6 being Object of b1 st Hom b5,b6 <> {} holds
for b7 being Morphism of b5,b6 holds
( b4 ?- b5 is_naturally_transformable_to b4 ?- b6 & (curry b4,b7) * the Id of b2 is natural_transformation of b4 ?- b5,b4 ?- b6 )
proof end;

definition
let c1, c2, c3 be Category;
let c4 be Functor of [:c1,c2:],c3;
let c5 be Morphism of c1;
func c4 ?- c5 -> natural_transformation of a4 ?- (dom a5),a4 ?- (cod a5) equals :: ISOCAT_2:def 3
(curry a4,a5) * the Id of a2;
coherence
(curry c4,c5) * the Id of c2 is natural_transformation of c4 ?- (dom c5),c4 ?- (cod c5)
proof end;
correctness
;
end;

:: deftheorem Def3 defines ?- ISOCAT_2:def 3 :
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Morphism of b1 holds b4 ?- b5 = (curry b4,b5) * the Id of b2;

theorem Th18: :: ISOCAT_2:18
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Morphism of b1 holds b4 ?- (dom b5) is_naturally_transformable_to b4 ?- (cod b5)
proof end;

theorem Th19: :: ISOCAT_2:19
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Morphism of b1
for b6 being Object of b2 holds (b4 ?- b5) . b6 = b4 . [b5,(id b6)]
proof end;

theorem Th20: :: ISOCAT_2:20
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Object of b1 holds id (b4 ?- b5) = b4 ?- (id b5)
proof end;

theorem Th21: :: ISOCAT_2:21
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5, b6 being Morphism of b1 st dom b5 = cod b6 holds
for b7 being natural_transformation of b4 ?- (dom b6),b4 ?- (dom b5) st b7 = b4 ?- b6 holds
b4 ?- (b5 * b6) = (b4 ?- b5) `*` b7
proof end;

definition
let c1, c2, c3 be Category;
let c4 be Functor of [:c1,c2:],c3;
func export c4 -> Functor of a1, Functors a2,a3 means :Def4: :: ISOCAT_2:def 4
for b1 being Morphism of a1 holds a5 . b1 = [[(a4 ?- (dom b1)),(a4 ?- (cod b1))],(a4 ?- b1)];
existence
ex b1 being Functor of c1, Functors c2,c3 st
for b2 being Morphism of c1 holds b1 . b2 = [[(c4 ?- (dom b2)),(c4 ?- (cod b2))],(c4 ?- b2)]
proof end;
uniqueness
for b1, b2 being Functor of c1, Functors c2,c3 st ( for b3 being Morphism of c1 holds b1 . b3 = [[(c4 ?- (dom b3)),(c4 ?- (cod b3))],(c4 ?- b3)] ) & ( for b3 being Morphism of c1 holds b2 . b3 = [[(c4 ?- (dom b3)),(c4 ?- (cod b3))],(c4 ?- b3)] ) holds
b1 = b2
proof end;
end;

:: deftheorem Def4 defines export ISOCAT_2:def 4 :
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Functor of b1, Functors b2,b3 holds
( b5 = export b4 iff for b6 being Morphism of b1 holds b5 . b6 = [[(b4 ?- (dom b6)),(b4 ?- (cod b6))],(b4 ?- b6)] );

Lemma23: for b1, b2 being Category
for b3, b4 being Functor of b1,b2 st b3 is_transformable_to b4 holds
for b5 being transformation of b3,b4
for b6 being Object of b1 holds b5 . b6 in Hom (b3 . b6),(b4 . b6)
proof end;

theorem Th22: :: ISOCAT_2:22
canceled;

theorem Th23: :: ISOCAT_2:23
canceled;

theorem Th24: :: ISOCAT_2:24
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Object of b1 holds (export b4) . b5 = b4 ?- b5
proof end;

theorem Th25: :: ISOCAT_2:25
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3
for b5 being Object of b1 holds (export b4) . b5 is Functor of b2,b3
proof end;

theorem Th26: :: ISOCAT_2:26
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st export b4 = export b5 holds
b4 = b5
proof end;

theorem Th27: :: ISOCAT_2:27
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st b4 is_naturally_transformable_to b5 holds
for b6 being natural_transformation of b4,b5 holds
( export b4 is_naturally_transformable_to export b5 & ex b7 being natural_transformation of export b4, export b5 st
for b8 being Function of [:the Objects of b1,the Objects of b2:],the Morphisms of b3 st b6 = b8 holds
for b9 being Object of b1 holds b7 . b9 = [[((export b4) . b9),((export b5) . b9)],((curry b8) . b9)] )
proof end;

definition
let c1, c2, c3 be Category;
let c4, c5 be Functor of [:c1,c2:],c3;
assume E28: c4 is_naturally_transformable_to c5 ;
let c6 be natural_transformation of c4,c5;
func export c6 -> natural_transformation of export a4, export a5 means :Def5: :: ISOCAT_2:def 5
for b1 being Function of [:the Objects of a1,the Objects of a2:],the Morphisms of a3 st a6 = b1 holds
for b2 being Object of a1 holds a7 . b2 = [[((export a4) . b2),((export a5) . b2)],((curry b1) . b2)];
existence
ex b1 being natural_transformation of export c4, export c5 st
for b2 being Function of [:the Objects of c1,the Objects of c2:],the Morphisms of c3 st c6 = b2 holds
for b3 being Object of c1 holds b1 . b3 = [[((export c4) . b3),((export c5) . b3)],((curry b2) . b3)]
by E28, Th27;
uniqueness
for b1, b2 being natural_transformation of export c4, export c5 st ( for b3 being Function of [:the Objects of c1,the Objects of c2:],the Morphisms of c3 st c6 = b3 holds
for b4 being Object of c1 holds b1 . b4 = [[((export c4) . b4),((export c5) . b4)],((curry b3) . b4)] ) & ( for b3 being Function of [:the Objects of c1,the Objects of c2:],the Morphisms of c3 st c6 = b3 holds
for b4 being Object of c1 holds b2 . b4 = [[((export c4) . b4),((export c5) . b4)],((curry b3) . b4)] ) holds
b1 = b2
proof end;
end;

:: deftheorem Def5 defines export ISOCAT_2:def 5 :
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st b4 is_naturally_transformable_to b5 holds
for b6 being natural_transformation of b4,b5
for b7 being natural_transformation of export b4, export b5 holds
( b7 = export b6 iff for b8 being Function of [:the Objects of b1,the Objects of b2:],the Morphisms of b3 st b6 = b8 holds
for b9 being Object of b1 holds b7 . b9 = [[((export b4) . b9),((export b5) . b9)],((curry b8) . b9)] );

theorem Th28: :: ISOCAT_2:28
for b1, b2, b3 being Category
for b4 being Functor of [:b1,b2:],b3 holds id (export b4) = export (id b4)
proof end;

theorem Th29: :: ISOCAT_2:29
for b1, b2, b3 being Category
for b4, b5, b6 being Functor of [:b1,b2:],b3 st b4 is_naturally_transformable_to b5 & b5 is_naturally_transformable_to b6 holds
for b7 being natural_transformation of b4,b5
for b8 being natural_transformation of b5,b6 holds export (b8 `*` b7) = (export b8) `*` (export b7)
proof end;

theorem Th30: :: ISOCAT_2:30
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st b4 is_naturally_transformable_to b5 holds
for b6, b7 being natural_transformation of b4,b5 st export b6 = export b7 holds
b6 = b7
proof end;

theorem Th31: :: ISOCAT_2:31
for b1, b2, b3 being Category
for b4 being Functor of b1, Functors b2,b3 ex b5 being Functor of [:b1,b2:],b3 st b4 = export b5
proof end;

theorem Th32: :: ISOCAT_2:32
for b1, b2, b3 being Category
for b4, b5 being Functor of [:b1,b2:],b3 st export b4 is_naturally_transformable_to export b5 holds
for b6 being natural_transformation of export b4, export b5 holds
( b4 is_naturally_transformable_to b5 & ex b7 being natural_transformation of b4,b5 st b6 = export b7 )
proof end;

definition
let c1, c2, c3 be Category;
func export c1,c2,c3 -> Functor of Functors [:a1,a2:],a3, Functors a1,(Functors a2,a3) means :Def6: :: ISOCAT_2:def 6
for b1, b2 being Functor of [:a1,a2:],a3 st b1 is_naturally_transformable_to b2 holds
for b3 being natural_transformation of b1,b2 holds a4 . [[b1,b2],b3] = [[(export b1),(export b2)],(export b3)];
existence
ex b1 being Functor of Functors [:c1,c2:],c3, Functors c1,(Functors c2,c3) st
for b2, b3 being Functor of [:c1,c2:],c3 st b2 is_naturally_transformable_to b3 holds
for b4 being natural_transformation of b2,b3 holds b1 . [[b2,b3],b4] = [[(export b2),(export b3)],(export b4)]
proof end;
uniqueness
for b1, b2 being Functor of Functors [:c1,c2:],c3, Functors c1,(Functors c2,c3) st ( for b3, b4 being Functor of [:c1,c2:],c3 st b3 is_naturally_transformable_to b4 holds
for b5 being natural_transformation of b3,b4 holds b1 . [[b3,b4],b5] = [[(export b3),(export b4)],(export b5)] ) & ( for b3, b4 being Functor of [:c1,c2:],c3 st b3 is_naturally_transformable_to b4 holds
for b5 being natural_transformation of b3,b4 holds b2 . [[b3,b4],b5] = [[(export b3),(export b4)],(export b5)] ) holds
b1 = b2
proof end;
end;

:: deftheorem Def6 defines export ISOCAT_2:def 6 :
for b1, b2, b3 being Category
for b4 being Functor of Functors [:b1,b2:],b3, Functors b1,(Functors b2,b3) holds
( b4 = export b1,b2,b3 iff for b5, b6 being Functor of [:b1,b2:],b3 st b5 is_naturally_transformable_to b6 holds
for b7 being natural_transformation of b5,b6 holds b4 . [[b5,b6],b7] = [[(export b5),(export b6)],(export b7)] );

theorem Th33: :: ISOCAT_2:33
for b1, b2, b3 being Category holds export b1,b2,b3 is_an_isomorphism
proof end;

theorem Th34: :: ISOCAT_2:34
for b1, b2, b3 being Category holds Functors [:b1,b2:],b3 ~= Functors b1,(Functors b2,b3)
proof end;

theorem Th35: :: ISOCAT_2:35
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6 being Functor of b2,b3 st b4 is_naturally_transformable_to b5 holds
for b7 being natural_transformation of b4,b5 holds b6 * b7 = b6 * b7
proof end;

definition
let c1, c2 be Category;
redefine func pr1 as pr1 c1,c2 -> Functor of [:a1,a2:],a1;
coherence
pr1 c1,c2 is Functor of [:c1,c2:],c1
;
redefine func pr2 as pr2 c1,c2 -> Functor of [:a1,a2:],a2;
coherence
pr2 c1,c2 is Functor of [:c1,c2:],c2
;
end;

definition
let c1, c2, c3 be Category;
let c4 be Functor of c1,c2;
let c5 be Functor of c1,c3;
redefine func <: as <:c4,c5:> -> Functor of a1,[:a2,a3:];
coherence
<:c4,c5:> is Functor of c1,[:c2,c3:]
proof end;
end;

definition
let c1, c2, c3 be Category;
let c4 be Functor of c1,[:c2,c3:];
func Pr1 c4 -> Functor of a1,a2 equals :: ISOCAT_2:def 7
(pr1 a2,a3) * a4;
correctness
coherence
(pr1 c2,c3) * c4 is Functor of c1,c2
;
;
func Pr2 c4 -> Functor of a1,a3 equals :: ISOCAT_2:def 8
(pr2 a2,a3) * a4;
correctness
coherence
(pr2 c2,c3) * c4 is Functor of c1,c3
;
;
end;

:: deftheorem Def7 defines Pr1 ISOCAT_2:def 7 :
for b1, b2, b3 being Category
for b4 being Functor of b1,[:b2,b3:] holds Pr1 b4 = (pr1 b2,b3) * b4;

:: deftheorem Def8 defines Pr2 ISOCAT_2:def 8 :
for b1, b2, b3 being Category
for b4 being Functor of b1,[:b2,b3:] holds Pr2 b4 = (pr2 b2,b3) * b4;

theorem Th36: :: ISOCAT_2:36
for b1, b2, b3 being Category
for b4 being Functor of b1,b2
for b5 being Functor of b1,b3 holds
( Pr1 <:b4,b5:> = b4 & Pr2 <:b4,b5:> = b5 )
proof end;

theorem Th37: :: ISOCAT_2:37
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,[:b2,b3:] st Pr1 b4 = Pr1 b5 & Pr2 b4 = Pr2 b5 holds
b4 = b5
proof end;

definition
let c1, c2, c3 be Category;
let c4, c5 be Functor of c1,[:c2,c3:];
let c6 be natural_transformation of c4,c5;
func Pr1 c6 -> natural_transformation of Pr1 a4, Pr1 a5 equals :: ISOCAT_2:def 9
(pr1 a2,a3) * a6;
coherence
(pr1 c2,c3) * c6 is natural_transformation of Pr1 c4, Pr1 c5
;
func Pr2 c6 -> natural_transformation of Pr2 a4, Pr2 a5 equals :: ISOCAT_2:def 10
(pr2 a2,a3) * a6;
coherence
(pr2 c2,c3) * c6 is natural_transformation of Pr2 c4, Pr2 c5
;
end;

:: deftheorem Def9 defines Pr1 ISOCAT_2:def 9 :
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,[:b2,b3:]
for b6 being natural_transformation of b4,b5 holds Pr1 b6 = (pr1 b2,b3) * b6;

:: deftheorem Def10 defines Pr2 ISOCAT_2:def 10 :
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,[:b2,b3:]
for b6 being natural_transformation of b4,b5 holds Pr2 b6 = (pr2 b2,b3) * b6;

theorem Th38: :: ISOCAT_2:38
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,[:b2,b3:] st b4 is_naturally_transformable_to b5 holds
( Pr1 b4 is_naturally_transformable_to Pr1 b5 & Pr2 b4 is_naturally_transformable_to Pr2 b5 ) by ISOCAT_1:27;

theorem Th39: :: ISOCAT_2:39
for b1, b2, b3 being Category
for b4, b5, b6, b7 being Functor of b1,[:b2,b3:] st b4 is_naturally_transformable_to b5 & b6 is_naturally_transformable_to b7 holds
for b8 being natural_transformation of b4,b5
for b9 being natural_transformation of b6,b7 st Pr1 b8 = Pr1 b9 & Pr2 b8 = Pr2 b9 holds
b8 = b9
proof end;

theorem Th40: :: ISOCAT_2:40
for b1, b2, b3 being Category
for b4 being Functor of b1,[:b2,b3:] holds
( id (Pr1 b4) = Pr1 (id b4) & id (Pr2 b4) = Pr2 (id b4) ) by ISOCAT_1:38;

theorem Th41: :: ISOCAT_2:41
for b1, b2, b3 being Category
for b4, b5, b6 being Functor of b1,[:b2,b3:] st b4 is_naturally_transformable_to b5 & b5 is_naturally_transformable_to b6 holds
for b7 being natural_transformation of b4,b5
for b8 being natural_transformation of b5,b6 holds
( Pr1 (b8 `*` b7) = (Pr1 b8) `*` (Pr1 b7) & Pr2 (b8 `*` b7) = (Pr2 b8) `*` (Pr2 b7) ) by ISOCAT_1:32;

Lemma43: for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_transformable_to b5 & b6 is_transformable_to b7 holds
for b8 being transformation of b4,b5
for b9 being transformation of b6,b7
for b10 being Object of b1 holds <:b8,b9:> . b10 = [(b8 . b10),(b9 . b10)]
proof end;

theorem Th42: :: ISOCAT_2:42
for b1, b2, b3 being Category
for b4 being Functor of b1,b2
for b5 being Functor of b1,b3
for b6, b7 being Object of b1 st Hom b6,b7 <> {} holds
for b8 being Morphism of b6,b7 holds <:b4,b5:> . b8 = [(b4 . b8),(b5 . b8)]
proof end;

theorem Th43: :: ISOCAT_2:43
for b1, b2, b3 being Category
for b4 being Functor of b1,b2
for b5 being Functor of b1,b3
for b6 being Object of b1 holds <:b4,b5:> . b6 = [(b4 . b6),(b5 . b6)]
proof end;

Lemma46: for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_transformable_to b5 & b6 is_transformable_to b7 holds
for b8 being transformation of b4,b5
for b9 being transformation of b6,b7
for b10 being Object of b1 holds <:b8,b9:> . b10 in Hom (<:b4,b6:> . b10),(<:b5,b7:> . b10)
proof end;

theorem Th44: :: ISOCAT_2:44
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_transformable_to b5 & b6 is_transformable_to b7 holds
<:b4,b6:> is_transformable_to <:b5,b7:>
proof end;

definition
let c1, c2, c3 be Category;
let c4, c5 be Functor of c1,c2;
let c6, c7 be Functor of c1,c3;
assume E48: ( c4 is_transformable_to c5 & c6 is_transformable_to c7 ) ;
let c8 be transformation of c4,c5;
let c9 be transformation of c6,c7;
func <:c8,c9:> -> transformation of <:a4,a6:>,<:a5,a7:> equals :Def11: :: ISOCAT_2:def 11
<:a8,a9:>;
coherence
<:c8,c9:> is transformation of <:c4,c6:>,<:c5,c7:>
proof end;
end;

:: deftheorem Def11 defines <: ISOCAT_2:def 11 :
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_transformable_to b5 & b6 is_transformable_to b7 holds
for b8 being transformation of b4,b5
for b9 being transformation of b6,b7 holds <:b8,b9:> = <:b8,b9:>;

theorem Th45: :: ISOCAT_2:45
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_transformable_to b5 & b6 is_transformable_to b7 holds
for b8 being transformation of b4,b5
for b9 being transformation of b6,b7
for b10 being Object of b1 holds <:b8,b9:> . b10 = [(b8 . b10),(b9 . b10)]
proof end;

Lemma50: for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_naturally_transformable_to b5 & b6 is_naturally_transformable_to b7 holds
for b8 being natural_transformation of b4,b5
for b9 being natural_transformation of b6,b7
for b10, b11 being Object of b1 st Hom b10,b11 <> {} holds
for b12 being Morphism of b10,b11 holds (<:b8,b9:> . b11) * (<:b4,b6:> . b12) = (<:b5,b7:> . b12) * (<:b8,b9:> . b10)
proof end;

theorem Th46: :: ISOCAT_2:46
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_naturally_transformable_to b5 & b6 is_naturally_transformable_to b7 holds
<:b4,b6:> is_naturally_transformable_to <:b5,b7:>
proof end;

definition
let c1, c2, c3 be Category;
let c4, c5 be Functor of c1,c2;
let c6, c7 be Functor of c1,c3;
assume that
E52: c4 is_naturally_transformable_to c5 and
E53: c6 is_naturally_transformable_to c7 ;
let c8 be natural_transformation of c4,c5;
let c9 be natural_transformation of c6,c7;
func <:c8,c9:> -> natural_transformation of <:a4,a6:>,<:a5,a7:> equals :Def12: :: ISOCAT_2:def 12
<:a8,a9:>;
coherence
<:c8,c9:> is natural_transformation of <:c4,c6:>,<:c5,c7:>
proof end;
end;

:: deftheorem Def12 defines <: ISOCAT_2:def 12 :
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_naturally_transformable_to b5 & b6 is_naturally_transformable_to b7 holds
for b8 being natural_transformation of b4,b5
for b9 being natural_transformation of b6,b7 holds <:b8,b9:> = <:b8,b9:>;

theorem Th47: :: ISOCAT_2:47
for b1, b2, b3 being Category
for b4, b5 being Functor of b1,b2
for b6, b7 being Functor of b1,b3 st b4 is_naturally_transformable_to b5 & b6 is_naturally_transformable_to b7 holds
for b8 being natural_transformation of b4,b5
for b9 being natural_transformation of b6,b7 holds
( Pr1 <:b8,b9:> = b8 & Pr2 <:b8,b9:> = b9 )
proof end;

definition
let c1, c2, c3 be Category;
func distribute c1,c2,c3 -> Functor of Functors a1,[:a2,a3:],[:(Functors a1,a2),(Functors a1,a3):] means :Def13: :: ISOCAT_2:def 13
for b1, b2 being Functor of a1,[:a2,a3:] st b1 is_naturally_transformable_to b2 holds
for b3 being natural_transformation of b1,b2 holds a4 . [[b1,b2],b3] = [[[(Pr1 b1),(Pr1 b2)],(Pr1 b3)],[[(Pr2 b1),(Pr2 b2)],(Pr2 b3)]];
existence
ex b1 being Functor of Functors c1,[:c2,c3:],[:(Functors c1,c2),(Functors c1,c3):] st
for b2, b3 being Functor of c1,[:c2,c3:] st b2 is_naturally_transformable_to b3 holds
for b4 being natural_transformation of b2,b3 holds b1 . [[b2,b3],b4] = [[[(Pr1 b2),(Pr1 b3)],(Pr1 b4)],[[(Pr2 b2),(Pr2 b3)],(Pr2 b4)]]
proof end;
uniqueness
for b1, b2 being Functor of Functors c1,[:c2,c3:],[:(Functors c1,c2),(Functors c1,c3):] st ( for b3, b4 being Functor of c1,[:c2,c3:] st b3 is_naturally_transformable_to b4 holds
for b5 being natural_transformation of b3,b4 holds b1 . [[b3,b4],b5] = [[[(Pr1 b3),(Pr1 b4)],(Pr1 b5)],[[(Pr2 b3),(Pr2 b4)],(Pr2 b5)]] ) & ( for b3, b4 being Functor of c1,[:c2,c3:] st b3 is_naturally_transformable_to b4 holds
for b5 being natural_transformation of b3,b4 holds b2 . [[b3,b4],b5] = [[[(Pr1 b3),(Pr1 b4)],(Pr1 b5)],[[(Pr2 b3),(Pr2 b4)],(Pr2 b5)]] ) holds
b1 = b2
proof end;
end;

:: deftheorem Def13 defines distribute ISOCAT_2:def 13 :
for b1, b2, b3 being Category
for b4 being Functor of Functors b1,[:b2,b3:],[:(Functors b1,b2),(Functors b1,b3):] holds
( b4 = distribute b1,b2,b3 iff for b5, b6 being Functor of b1,[:b2,b3:] st b5 is_naturally_transformable_to b6 holds
for b7 being natural_transformation of b5,b6 holds b4 . [[b5,b6],b7] = [[[(Pr1 b5),(Pr1 b6)],(Pr1 b7)],[[(Pr2 b5),(Pr2 b6)],(Pr2 b7)]] );

theorem Th48: :: ISOCAT_2:48
for b1, b2, b3 being Category holds distribute b1,b2,b3 is_an_isomorphism
proof end;

theorem Th49: :: ISOCAT_2:49
for b1, b2, b3 being Category holds Functors b1,[:b2,b3:] ~= [:(Functors b1,b2),(Functors b1,b3):]
proof end;