:: Category of Functors between Alternative Categories
::  by Robert Nieszczerzewski
::
:: Received June 12, 1997
:: Copyright (c) 1997-2019 Association of Mizar Users
::           (Stowarzyszenie Uzytkownikow Mizara, Bialystok, Poland).
:: This code can be distributed under the GNU General Public Licence
:: version 3.0 or later, or the Creative Commons Attribution-ShareAlike
:: License version 3.0 or later, subject to the binding interpretation
:: detailed in file COPYING.interpretation.
:: See COPYING.GPL and COPYING.CC-BY-SA for the full text of these
:: licenses, or see http://www.gnu.org/licenses/gpl.html and
:: http://creativecommons.org/licenses/by-sa/3.0/.

environ

 vocabularies RELAT_2, ALTCAT_1, XBOOLE_0, MSUALG_6, FUNCTOR0, CAT_1, FUNCT_1,
      PZFMISC1, NATTRA_1, PBOOLE, STRUCT_0, SUBSET_1, REALSET1, RELAT_1,
      FUNCT_2, CARD_3, CAT_2, ZFMISC_1, TARSKI, FUNCTOR2;
 notations TARSKI, XBOOLE_0, ZFMISC_1, SUBSET_1, FUNCTOR0, XTUPLE_0, MCART_1,
      DOMAIN_1, RELAT_1, STRUCT_0, CARD_3, FUNCT_1, PBOOLE, FUNCT_2, BINOP_1,
      MULTOP_1, ALTCAT_1;
 constructors DOMAIN_1, CARD_3, FUNCTOR0, RELSET_1, XTUPLE_0;
 registrations XBOOLE_0, SUBSET_1, RELSET_1, STRUCT_0, ALTCAT_1, FUNCTOR0,
      PBOOLE, FUNCT_1, RELAT_1;
 requirements SUBSET, BOOLE;
 definitions ALTCAT_1;
 equalities ALTCAT_1, BINOP_1, XTUPLE_0;
 theorems MULTOP_1, FUNCT_2, ZFMISC_1, ALTCAT_1, PBOOLE, BINOP_1, TARSKI,
      ALTCAT_2, FUNCTOR0, CARD_3, XBOOLE_0, PARTFUN1, RELAT_1, XTUPLE_0;
 schemes TARSKI, PBOOLE, MSSUBFAM, XBOOLE_0;

begin

registration
  let A be transitive with_units non empty AltCatStr, B be with_units non
  empty AltCatStr;
  cluster -> feasible id-preserving for Functor of A, B;
  coherence by FUNCTOR0:def 25;
end;

registration
  let A be transitive with_units non empty AltCatStr, B be with_units non
  empty AltCatStr;
  cluster covariant -> Covariant comp-preserving for Functor of A, B;
  coherence by FUNCTOR0:def 26;
  cluster Covariant comp-preserving -> covariant for Functor of A, B;
  coherence by FUNCTOR0:def 26;
  cluster contravariant -> Contravariant comp-reversing for Functor of A, B;
  coherence by FUNCTOR0:def 27;
  cluster Contravariant comp-reversing -> contravariant for Functor of A, B;
  coherence by FUNCTOR0:def 27;
end;

theorem Th1:
  for A,B being transitive with_units non empty AltCatStr, F
being covariant Functor of A,B for a being Object of A holds F.idm a = idm (F.a
  )
proof
  let A,B be transitive with_units non empty AltCatStr, F be covariant
  Functor of A,B;
  let a be Object of A;
  <^a,a^> <> {} & <^F.a,F.a^> <> {} by ALTCAT_2:def 7;
  hence F.idm a = Morph-Map(F,a,a).idm a by FUNCTOR0:def 15
    .= idm (F.a) by FUNCTOR0:def 20;
end;

begin :: Transformations

definition
  let A,B be transitive with_units non empty AltCatStr,
      F1,F2 be Functor of A,B;
  pred F1 is_transformable_to F2 means

  for a being Object of A holds <^ F1.a,F2.a^> <> {};
  reflexivity by ALTCAT_2:def 7;
end;

theorem Th2:
  for A,B being transitive with_units non empty AltCatStr, F,F1,
  F2 being Functor of A,B holds F is_transformable_to F1 & F1
  is_transformable_to F2 implies F is_transformable_to F2
proof
  let A,B be transitive with_units non empty AltCatStr,
  F,F1,F2 be Functor of A,B;
  assume
A1: F is_transformable_to F1 & F1 is_transformable_to F2;
  let a be Object of A;
  <^F.a,F1.a^> <> {} & <^F1.a,F2.a^> <> {} by A1;
  hence thesis by ALTCAT_1:def 2;
end;

definition
  let A,B be transitive with_units non empty AltCatStr,
  F1,F2 be Functor of A,B;
  assume
A1: F1 is_transformable_to F2;
  mode transformation of F1,F2 -> ManySortedSet of the carrier of A means
    :Def2: for a being Object of A holds it.a is Morphism of F1.a,F2.a;
  existence
  proof
    defpred P[Object of A,object] means $2 in <^F1.$1,F2.$1^>;
A2: for a being Element of A ex j being object st P[a,j]
    proof
      let a be Element of A;
      <^F1.a,F2.a^> <> {} by A1;
      then ex j being object st j in <^F1.a,F2.a^> by XBOOLE_0:def 1;
      hence thesis;
    end;
    consider t being ManySortedSet of the carrier of A such that
A3: for a being Element of A holds P[a,t.a] from PBOOLE:sch 6(A2);
    take t;
    thus thesis by A3;
  end;
end;

definition
  let A,B be transitive with_units non empty AltCatStr;
  let F be Functor of A,B;
  func idt F -> transformation of F,F means
  :Def3:
  for a being Object of A holds it.a = idm (F.a);
  existence
  proof
    defpred P[Object of A,object] means $2 = idm (F.$1);
A1: for a being Element of A ex j being object st P[a,j];
    consider t being ManySortedSet of the carrier of A such that
A2: for a being Element of A holds P[a,t.a] from PBOOLE:sch 6(A1);
    for a be Object of A holds t.a is Morphism of F.a,F.a
    proof
      let a be Element of A;
      P[a,t.a] by A2;
      hence thesis;
    end;
    then t is transformation of F,F by Def2;
    hence thesis by A2;
  end;
  uniqueness
  proof
    let it1,it2 be transformation of F,F such that
A3: for a being Object of A holds it1.a = idm (F.a) and
A4: for a being Object of A holds it2.a = idm (F.a);
    now
      let a be object;
      assume a in the carrier of A;
      then reconsider o = a as Object of A;
      thus it1.a = idm (F.o) by A3
        .= it2.a by A4;
    end;
    hence it1 = it2 by PBOOLE:3;
  end;
end;

definition
  let A,B be transitive with_units non empty AltCatStr,
  F1,F2 be Functor of A,B;
  assume
A1: F1 is_transformable_to F2;
  let t be transformation of F1,F2;
  let a be Object of A;
  func t!a -> Morphism of F1.a, F2.a means
  :Def4:
  it = t.a;
  existence
  proof
    t.a is Morphism of F1.a,F2.a by A1,Def2;
    hence thesis;
  end;
  correctness;
end;

definition
  let A,B be transitive with_units non empty AltCatStr,
      F,F1,F2 be Functor of A,B;
  assume
A1: F is_transformable_to F1 & F1 is_transformable_to F2;
  let t1 be transformation of F,F1;
  let t2 be transformation of F1,F2;
  func t2`*`t1 -> transformation of F,F2 means
  :Def5:
  for a being Object of A holds it!a = (t2!a) * (t1!a);
  existence
  proof
    defpred P[Object of A,object] means $2 = (t2!$1) * (t1!$1);
A2: for a being Element of A ex j being object st P[a,j];
    consider t being ManySortedSet of the carrier of A such that
A3: for a being Element of A holds P[a,t.a] from PBOOLE:sch 6(A2);
A4: F is_transformable_to F2 by A1,Th2;
    for a be Object of A holds t.a is Morphism of F.a,F2.a
    proof
      let o be Element of A;
      P[o,t.o] by A3;
      hence thesis;
    end;
    then reconsider t9 = t as transformation of F,F2 by A4,Def2;
    take t9;
    let a be Element of A;
    P[a,t.a] by A3;
    hence thesis by A4,Def4;
  end;
  uniqueness
  proof
    let it1,it2 be transformation of F,F2 such that
A5: for a being Object of A holds it1!a = (t2!a)*(t1!a) and
A6: for a being Object of A holds it2!a = (t2!a)*(t1!a);
A7: F is_transformable_to F2 by A1,Th2;
    now
      let a be object;
      assume a in the carrier of A;
      then reconsider o = a as Object of A;
      thus (it1 qua ManySortedSet of the carrier of A).a = it1!o by A7,Def4
        .= (t2!o)*(t1!o) by A5
        .= it2!o by A6
        .= (it2 qua ManySortedSet of the carrier of A).a by A7,Def4;
    end;
    hence it1 = it2 by PBOOLE:3;
  end;
end;

theorem Th3:
  for A,B being transitive with_units non empty AltCatStr, F1,F2
being Functor of A,B holds F1 is_transformable_to F2 implies for t1,
  t2 being transformation of F1,F2 st for a being Object of A holds t1!a = t2!a
  holds t1 = t2
proof
  let A,B be transitive with_units non empty AltCatStr, F1,F2 be
  Functor of A,B;
  assume
A1: F1 is_transformable_to F2;
  let t1,t2 be transformation of F1,F2;
  assume
A2: for a being Object of A holds t1!a = t2!a;
  now
    let a be object;
    assume a in the carrier of A;
    then reconsider o = a as Object of A;
    thus (t1 qua ManySortedSet of the carrier of A).a = t1!o by A1,Def4
      .= t2!o by A2
      .= (t2 qua ManySortedSet of the carrier of A).a by A1,Def4;
  end;
  hence thesis by PBOOLE:3;
end;

theorem Th4:
  for A,B being transitive with_units non empty AltCatStr, F
being Functor of A,B holds for a being Object of A holds (idt F)!a =
  idm(F.a)
proof
  let A,B be transitive with_units non empty AltCatStr, F be
  Functor of A,B;
  let a be Object of A;
  thus (idt F)!a = (idt F qua ManySortedSet of the carrier of A).a by Def4
    .= idm (F.a) by Def3;
end;

theorem Th5:
  for A,B being transitive with_units non empty AltCatStr, F1,F2
  being Functor of A,B holds F1 is_transformable_to F2 implies for t
  being transformation of F1,F2 holds (idt F2)`*`t = t & t`*`(idt F1) = t
proof
  let A,B be transitive with_units non empty AltCatStr, F1,F2 be
  Functor of A,B;
  assume
A1: F1 is_transformable_to F2;
  let t be transformation of F1,F2;
  now
    let a be Object of A;
A2: <^F1.a,F2.a^> <> {} by A1;
    thus ((idt F2)`*`t)!a = ((idt F2)!a)*(t!a) by A1,Def5
      .= (idm(F2.a))*(t!a) by Th4
      .= t!a by A2,ALTCAT_1:20;
  end;
  hence (idt F2)`*`t = t by A1,Th3;
  now
    let a be Object of A;
A3: <^F1.a,F2.a^> <> {} by A1;
    thus (t`*`(idt F1))!a = (t!a)*((idt F1)!a) by A1,Def5
      .= (t!a)*(idm(F1.a)) by Th4
      .= t!a by A3,ALTCAT_1:def 17;
  end;
  hence thesis by A1,Th3;
end;

theorem Th6:
  for A,B being category, F,F1,F2,F3 being Functor of A,B
  holds F is_transformable_to F1 & F1 is_transformable_to F2 & F2
  is_transformable_to F3 implies for t1 being transformation of F,F1, t2 being
transformation of F1,F2, t3 being transformation of F2,F3 holds t3`*`t2`*`t1 =
  t3`*`(t2`*`t1)
proof
  let A,B be category, F,F1,F2,F3 be Functor of A,B;
  assume that
A1: F is_transformable_to F1 and
A2: F1 is_transformable_to F2 and
A3: F2 is_transformable_to F3;
  let t1 be transformation of F,F1, t2 be transformation of F1,F2, t3 be
  transformation of F2,F3;
A4: F1 is_transformable_to F3 by A2,A3,Th2;
A5: F is_transformable_to F2 by A1,A2,Th2;
  now
    let a be Object of A;
A6: <^F2.a,F3.a^> <> {} by A3;
A7: <^F.a,F1.a^> <> {} & <^F1.a,F2.a^> <> {} by A1,A2;
    thus (t3`*`t2`*`t1)!a = ((t3`*`t2)!a)*(t1!a) by A1,A4,Def5
      .= (t3!a)*(t2!a)*(t1!a) by A2,A3,Def5
      .= (t3!a)*((t2!a)*(t1!a)) by A7,A6,ALTCAT_1:21
      .= (t3!a)*((t2`*`t1)!a) by A1,A2,Def5
      .= (t3`*`(t2`*`t1))!a by A3,A5,Def5;
  end;
  hence thesis by A1,A4,Th2,Th3;
end;

begin :: Natural transformations

Lm1: for A,B being transitive with_units non empty AltCatStr, F,G being
covariant Functor of A,B for a,b being Object of A st <^a,b^> <> {} for f being
Morphism of a,b holds (idt F)!b*F.f = F.f*((idt F)!a)
proof
  let A,B be transitive with_units non empty AltCatStr, F,G be covariant
  Functor of A,B;
  let a,b be Object of A such that
A1: <^a,b^> <> {};
  let f be Morphism of a,b;
A2: <^a,a^> <> {} by ALTCAT_2:def 7;
A3: <^b,b^> <> {} by ALTCAT_2:def 7;
  thus (idt F)!b*F.f = idm(F.b)*F.f by Th4
    .= F.idm b*F.f by Th1
    .= F.(idm b*f) by A1,A3,FUNCTOR0:def 23
    .= F.f by A1,ALTCAT_1:20
    .= F.(f*idm a) by A1,ALTCAT_1:def 17
    .= F.f*F.idm a by A1,A2,FUNCTOR0:def 23
    .= F.f*idm(F.a) by Th1
    .= F.f*((idt F)!a) by Th4;
end;

definition
  let A,B be transitive with_units non empty AltCatStr, F1,F2 be covariant
  Functor of A,B;
  pred F1 is_naturally_transformable_to F2 means

  F1 is_transformable_to
F2 & ex t being transformation of F1,F2 st for a,b being Object of A st <^a,b^>
  <> {} for f being Morphism of a,b holds t!b*F1.f = F2.f*(t!a);
  reflexivity
proof
  let F be covariant Functor of A,B;
  thus F is_transformable_to F;
  take idt F;
  thus thesis by Lm1;
end;
end;

theorem
  for A,B be transitive with_units non empty AltCatStr, F be
  covariant Functor of A,B holds F is_naturally_transformable_to F;

Lm2: for A,B be category, F,F1,F2 be covariant Functor of A,B holds F
is_transformable_to F1 & F1 is_transformable_to F2 implies for t1 being
transformation of F,F1 st for a,b being Object of A st <^a,b^> <> {} for f
being Morphism of a,b holds t1!b*F.f = F1.f*(t1!a) for t2 being transformation
of F1,F2 st for a,b being Object of A st <^a,b^> <> {} for f being Morphism of
a,b holds t2!b*F1.f = F2.f*(t2!a) for a,b being Object of A st <^a,b^><>{} for
f being Morphism of a,b holds (t2`*`t1)!b*F.f = F2.f*((t2`*`t1)!a)
proof
  let A,B be category, F,F1,F2 be covariant Functor of A,B;
  assume that
A1: F is_transformable_to F1 and
A2: F1 is_transformable_to F2;
  let t1 be transformation of F,F1 such that
A3: for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a
  ,b holds t1!b*F.f = F1.f*(t1!a);
  let t2 be transformation of F1,F2 such that
A4: for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a
  ,b holds t2!b*F1.f = F2.f*(t2!a);
  let a,b be Object of A;
A5: <^F.b,F1.b^> <> {} by A1;
A6: <^F.a,F1.a^> <> {} by A1;
A7: <^F1.b,F2.b^> <> {} by A2;
A8: <^F1.a,F2.a^> <> {} by A2;
  assume
A9: <^a,b^> <> {};
  then
A10: <^F.a,F.b^> <> {} by FUNCTOR0:def 18;
  let f be Morphism of a,b;
A11: <^F2.a,F2.b^> <> {} by A9,FUNCTOR0:def 18;
A12: <^F1.a,F1.b^> <> {} by A9,FUNCTOR0:def 18;
  thus ((t2`*`t1)!b)*(F.f) = ((t2!b)*(t1!b))*F.f by A1,A2,Def5
    .= t2!b*(t1!b*F.f) by A10,A5,A7,ALTCAT_1:21
    .= t2!b*(F1.f*(t1!a)) by A3,A9
    .= t2!b*F1.f*(t1!a) by A6,A7,A12,ALTCAT_1:21
    .= F2.f*(t2!a)*(t1!a) by A4,A9
    .= F2.f*((t2!a)*(t1!a)) by A6,A8,A11,ALTCAT_1:21
    .= F2.f*((t2`*`t1)!a) by A1,A2,Def5;
end;

theorem Th8:
  for A,B be category, F,F1,F2 be covariant Functor of A,B holds F
is_naturally_transformable_to F1 & F1 is_naturally_transformable_to F2 implies
  F is_naturally_transformable_to F2
proof
  let A,B be category, F,F1,F2 be covariant Functor of A,B;
  assume
A1: F is_transformable_to F1;
  given t1 being transformation of F,F1 such that
A2: for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a
  ,b holds t1!b*F.f = F1.f*(t1!a);
  assume
A3: F1 is_transformable_to F2;
  given t2 being transformation of F1,F2 such that
A4: for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a
  ,b holds t2!b*F1.f = F2.f*(t2!a);
  thus F is_transformable_to F2 by A1,A3,Th2;
  take t2`*`t1;
  thus thesis by A1,A2,A3,A4,Lm2;
end;

definition
  let A,B be transitive with_units non empty AltCatStr, F1,F2 be covariant
  Functor of A,B;
  assume
A1: F1 is_naturally_transformable_to F2;
  mode natural_transformation of F1,F2 -> transformation of F1,F2 means
    :Def7:
for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a,b holds it
    !b*F1.f = F2.f*(it!a);
  existence by A1;
end;

definition
  let A,B be transitive with_units non empty AltCatStr, F be covariant
  Functor of A,B;
  redefine func idt F -> natural_transformation of F,F;
  coherence
  proof
    F is_naturally_transformable_to F & for a,b being Object of A st <^a,b
^> <> {} for f being Morphism of a,b holds (idt F)!b*F.f = F.f*((idt F)!a) by
Lm1;
    hence thesis by Def7;
  end;
end;

definition
  let A,B be category, F,F1,F2 be covariant Functor of A,B such that
A1: F is_naturally_transformable_to F1 & F1 is_naturally_transformable_to F2;
  let t1 be natural_transformation of F,F1;
  let t2 be natural_transformation of F1,F2;
  func t2`*`t1 -> natural_transformation of F,F2 means
  :Def8:
  it = t2`*`t1;
  existence
  proof
A2: F is_naturally_transformable_to F2 by A1,Th8;
A3: ( for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a
,b holds t1!b*F.f = F1.f*(t1!a))& for a,b being Object of A st <^a,b^> <> {}
    for f being Morphism of a,b holds t2!b*F1.f = F2.f*(t2!a) by A1,Def7;
    F is_transformable_to F1 & F1 is_transformable_to F2 by A1;
    then
    for a,b being Object of A st <^a,b^> <> {} for f being Morphism of a,b
    holds (t2`*`t1)!b*F.f = F2.f*((t2`*`t1)!a) by A3,Lm2;
    then t2`*`t1 is natural_transformation of F,F2 by A2,Def7;
    hence thesis;
  end;
  correctness;
end;

theorem
  for A,B be transitive with_units non empty AltCatStr, F1,F2 be
covariant Functor of A,B holds F1 is_naturally_transformable_to F2 implies for
t being natural_transformation of F1,F2 holds (idt F2)`*`t = t & t`*`(idt F1) =
  t
by Th5;

theorem
  for A,B be transitive with_units non empty AltCatStr, F,F1,F2 be
  covariant Functor of A,B holds F is_naturally_transformable_to F1 & F1
is_naturally_transformable_to F2 implies for t1 being natural_transformation of
F,F1 for t2 being natural_transformation of F1,F2 for a being Object of A holds
  (t2`*`t1)!a = (t2!a)*(t1!a)
by Def5;

theorem
  for A,B be category, F,F1,F2,F3 be covariant Functor of A,B for t be
  natural_transformation of F,F1, t1 be natural_transformation of F1,F2 holds F
  is_naturally_transformable_to F1 & F1 is_naturally_transformable_to F2 & F2
is_naturally_transformable_to F3 implies for t3 being natural_transformation of
  F2,F3 holds t3`*`t1`*`t = t3`*`(t1`*`t)
proof
  let A,B be category, F,F1,F2,F3 be covariant Functor of A,B;
  let t be natural_transformation of F,F1, t1 be natural_transformation of F1,
  F2;
  assume that
A1: F is_naturally_transformable_to F1 and
A2: F1 is_naturally_transformable_to F2 and
A3: F2 is_naturally_transformable_to F3;
A4: F is_naturally_transformable_to F2 by A1,A2,Th8;
  let t3 be natural_transformation of F2,F3;
A5: F2 is_transformable_to F3 by A3;
A6: F is_transformable_to F1 & F1 is_transformable_to F2 by A1,A2;
  F1 is_naturally_transformable_to F3 by A2,A3,Th8;
  hence t3`*`t1`*`t = t3`*`t1`*`(t qua transformation of F,F1) by A1,Def8
    .= (t3 qua transformation of F2,F3)`*`t1`*`t by A2,A3,Def8
    .= t3`*`(t1`*`(t qua transformation of F,F1)) by A6,A5,Th6
    .= (t3 qua transformation of F2,F3)`*`(t1`*`t) by A1,A2,Def8
    .= t3 `*`(t1`*`t) by A3,A4,Def8;
end;

begin :: Category of Functors

definition
  let I be set;
  let A,B be ManySortedSet of I;
  func Funcs(A,B) -> set means
  :Def9:
  for x be set holds x in it iff x is
ManySortedFunction of A,B if for i being set st i in I holds B.i = {} implies A
  .i = {} otherwise it = {};
  existence
  proof
    thus (for i being set st i in I holds B.i = {} implies A.i = {}) implies
ex IT being set st for x be set holds x in IT iff x is ManySortedFunction of A,
    B
    proof
      deffunc F(object) = Funcs(A.$1,B.$1);
      assume
A1:   for i being set st i in I holds B.i = {} implies A.i = {};
      consider F being ManySortedSet of I such that
A2:   for i be object st i in I holds F.i = F(i) from PBOOLE:sch 4;
      take product F;
      let x be set;
      thus x in product F implies x is ManySortedFunction of A,B
      proof
        assume x in product F;
        then consider g be Function such that
A3:     x = g and
A4:     dom g = dom F and
A5:     for i be object st i in dom F holds g.i in F.i by CARD_3:def 5;
A6:     for i be object st i in I holds g.i is Function of A.i,B.i
        proof
          let i be object such that
A7:       i in I;
          dom F = I & F.i = Funcs(A.i,B.i) by A2,A7,PARTFUN1:def 2;
          hence thesis by A5,A7,FUNCT_2:66;
        end;
        dom F = I by PARTFUN1:def 2;
        then reconsider g as ManySortedSet of I by A4,PARTFUN1:def 2
,RELAT_1:def 18;
        g is ManySortedFunction of A,B by A6,PBOOLE:def 15;
        hence thesis by A3;
      end;
      assume
A8:   x is ManySortedFunction of A,B;
      then reconsider g = x as ManySortedSet of I;
A9:   for i be set st i in I holds g.i in Funcs(A.i,B.i)
      proof
        let i be set;
        assume
A10:    i in I;
        then
A11:    B.i = {} implies A.i = {} by A1;
        g.i is Function of A.i, B.i by A8,A10,PBOOLE:def 15;
        hence thesis by A11,FUNCT_2:8;
      end;
A12:  for i be set st i in I holds g.i in F.i
      proof
        let i be set;
        assume
A13:    i in I;
        then F.i = Funcs(A.i,B.i) by A2;
        hence thesis by A9,A13;
      end;
A14:  for i be object st i in dom F holds g.i in F.i
      proof
A15:    dom F = I by PARTFUN1:def 2;
        let i be object;
        assume i in dom F;
        hence thesis by A12,A15;
      end;
      dom g = I by PARTFUN1:def 2;
      then dom g = dom F by PARTFUN1:def 2;
      hence thesis by A14,CARD_3:def 5;
    end;
    thus thesis;
  end;
  uniqueness
  proof
    let it1,it2 be set;
    hereby
      assume for i being set st i in I holds B.i = {} implies A.i = {};
      assume that
A16:  for x being set holds x in it1 iff x is ManySortedFunction of A ,B and
A17:  for x being set holds x in it2 iff x is ManySortedFunction of A ,B;
      now
        let x be object;
        x in it1 iff x is ManySortedFunction of A,B by A16;
        hence x in it1 iff x in it2 by A17;
      end;
      hence it1 = it2 by TARSKI:2;
    end;
    thus thesis;
  end;
  consistency;
end;

definition
  let A,B be transitive with_units non empty AltCatStr;
  func Funct(A,B) -> set means
  :Def10:
  for x being object holds x in it iff x is covariant strict Functor of A,B;
  existence
  proof
    set A9 = Funcs([:the carrier of A,the carrier of A:], [:the carrier of B,
    the carrier of B:]);
    set sAA = the set of all (the Arrows of B)*f where f is Element of A9;
    set f = the Element of A9;
    (the Arrows of B)*f in sAA;
    then reconsider sAA as non empty set;
    defpred R[object,object] means
     ex f be Covariant bifunction of the carrier of A,
the carrier of B, m be MSUnTrans of f, the Arrows of A, the Arrows of B st $1 =
    [f,m] & $2 = FunctorStr (#f,m#) & $2 is covariant Functor of A,B;
    defpred P[object,object] means
      ex AA being ManySortedSet of [:the carrier of A,
    the carrier of A:] st $1 = AA & $2 = Funcs(the Arrows of A, AA);
A1: for x,y,z being object st P[x,y] & P[x,z] holds y = z;
    consider XX being set such that
A2: for x being object holds x in XX iff
     ex y being object st y in sAA & P[y,x] from TARSKI:sch 1(A1);
A3: for x,y,z be object st R[x,y] & R[x,z] holds y = z
    proof
      let x,y,z be object;
      given f be Covariant bifunction of the carrier of A,the carrier of B, m
      be MSUnTrans of f, the Arrows of A, the Arrows of B such that
A4:   x = [f,m] and
A5:   y = FunctorStr (#f,m#) and
      y is covariant Functor of A,B;
      given f1 be Covariant bifunction of the carrier of A,the carrier of B,
      m1 be MSUnTrans of f1, the Arrows of A, the Arrows of B such that
A6:   x = [f1,m1] and
A7:   z = FunctorStr (#f1,m1#) and
      z is covariant Functor of A,B;
      f=f1 by A4,A6,XTUPLE_0:1;
      hence thesis by A4,A5,A6,A7,XTUPLE_0:1;
    end;
    consider X be set such that
A8: for x be object holds x in X iff
     ex y be object st y in [:A9,union XX:] & R[y,x] from TARSKI:sch 1(A3);
   take X;
    let x be object;
    thus x in X implies x is covariant strict Functor of A,B
    proof
      assume x in X;
      then ex y be object st y in [:A9,union XX:] &
       ex f be Covariant bifunction of the carrier of A,the carrier of B,
          m be MSUnTrans of f, the Arrows of A, the Arrows of B
      st y = [f,m] & x = FunctorStr (#f,m#) & x is covariant Functor of A,B
            by A8;
      hence thesis;
    end;
    assume x is covariant strict Functor of A,B;
    then reconsider F = x as covariant strict Functor of A,B;
    reconsider f = the ObjectMap of F as Covariant bifunction of the carrier
    of A,the carrier of B by FUNCTOR0:def 12;
    reconsider m = the MorphMap of F as MSUnTrans of f, the Arrows of A, the
    Arrows of B;
    reconsider y = [f,m] as set by TARSKI:1;
A9: for o1,o2 be Object of A st (the Arrows of A).(o1,o2) <> {} holds (
    the Arrows of B).(f.(o1,o2)) <> {}
    proof
      let o1,o2 be Object of A such that
A10:  (the Arrows of A).(o1,o2) <> {};
      (the Arrows of A).(o1,o2) = <^o1,o2^>;
      hence thesis by A10,FUNCTOR0:def 11;
    end;
A11: for o1,o2 be Object of A st (the Arrows of A).(o1,o2) <> {} holds (
    the Arrows of B).([F.o1,F.o2]) <> {}
    proof
      let o1,o2 be Object of A such that
A12:  (the Arrows of A).(o1,o2) <> {};
      f.(o1,o2) = [F.o1,F.o2] by FUNCTOR0:22;
      hence thesis by A9,A12;
    end;
    y in [:A9,union XX:]
    proof
      set I = [:the carrier of A,the carrier of A:];
      reconsider AA = (the Arrows of B)*f as ManySortedSet of [:the carrier of
      A,the carrier of A:];
A13:  for i be set st i in I & (the Arrows of A).i <> {} holds (the
      Arrows of B).(f.i) <> {}
      proof
        let i be set such that
A14:    i in I and
A15:    (the Arrows of A).i <> {};
        consider o1,o2 be object such that
A16:    o1 in the carrier of A & o2 in the carrier of A and
A17:    i = [o1,o2] by A14,ZFMISC_1:def 2;
        reconsider a1 = o1, a2 = o2 as Object of A by A16;
A18:    (the Arrows of B).(f.i) = (the Arrows of B).(f.(o1,o2)) by A17
          .= (the Arrows of B).([F.a1,F.a2]) by FUNCTOR0:22;
        (the Arrows of A).(o1,o2) <> {} by A15,A17;
        hence thesis by A11,A18;
      end;
      for i be set st i in I holds (the Arrows of A).i <> {} implies AA.i <> {}
      proof
        let i be set such that
A19:    i in I;
        assume
A20:    (the Arrows of A).i <> {};
        AA.i = (the Arrows of B).(f.i) by A19,FUNCT_2:15;
        hence thesis by A13,A19,A20;
      end;
      then m is ManySortedFunction of the Arrows of A,AA & for i be set st i
      in I holds AA.i = {} implies (the Arrows of A). i = {} by FUNCTOR0:def 4;
      then
A21:  m in Funcs(the Arrows of A,AA) by Def9;
A22:  f in A9 by FUNCT_2:8;
      then (the Arrows of B)*f in sAA;
      then Funcs(the Arrows of A,AA) in XX by A2;
      then m in union XX by A21,TARSKI:def 4;
      hence thesis by A22,ZFMISC_1:def 2;
    end;
    hence thesis by A8;
  end;
  uniqueness
  proof
    let it1,it2 be set such that
A23: for x being object holds x in it1 iff x is covariant strict Functor
    of A, B and
A24: for x being object
    holds x in it2 iff x is covariant strict Functor of A,B;
    now
      let x be object;
      x in it1 iff x is covariant strict Functor of A,B by A23;
      hence x in it1 iff x in it2 by A24;
    end;
    hence thesis by TARSKI:2;
  end;
end;

definition
  let A,B be category;
  func Functors(A,B) -> strict non empty transitive AltCatStr means
  the
carrier of it = Funct(A,B) & (for F,G being strict covariant Functor of A,B, x
  being set holds x in (the Arrows of it).(F,G) iff F
is_naturally_transformable_to G & x is natural_transformation of F,G) & for F,G
,H being strict covariant Functor of A,B st F is_naturally_transformable_to G &
  G is_naturally_transformable_to H for t1 being natural_transformation of F,G,
t2 being natural_transformation of G,H ex f being Function st f = (the Comp of
  it).(F,G,H) & f.(t2,t1) = t2`*`t1;
  existence
  proof
    defpred Q[object,object,object] means
    for f,g,h being strict covariant Functor of A
    ,B st [f,g,h] = $3 for t1 being natural_transformation of f,g for t2 being
natural_transformation of g,h st [t2,t1] = $2 & ex v being Function st v.$2 =
    $1 holds $1 = t2 `*` t1;
    defpred P[object,object] means
    ex D2 being set st D2 = $2 &
for f,g being strict covariant Functor of A,B st
[f,g] = $1 for x being set holds x in D2 iff f is_naturally_transformable_to g
    & x is natural_transformation of f,g;
A1: for i being object st i in [:Funct(A,B),Funct(A,B):]
ex j being object st P[ i,j]
    proof
      let i be object;
      assume i in [:Funct(A,B),Funct(A,B):];
      then consider f,g be object such that
A2:   f in Funct(A,B) & g in Funct(A,B) and
A3:   i = [f,g] by ZFMISC_1:def 2;
      reconsider f, g as strict covariant Functor of A,B by A2,Def10;
      defpred P[Object of A,object] means $2 = <^f.$1,g.$1^>;
      defpred P[object] means f is_naturally_transformable_to g & $1 is
      natural_transformation of f,g;
A4:   for a being Element of A ex j being object st P[a,j];
      consider N being ManySortedSet of the carrier of A such that
A5:   for a being Element of A holds P[a,N.a] from PBOOLE:sch 6(A4);
      consider j being set such that
A6:   for x being object holds x in j iff x in product N & P[x] from
      XBOOLE_0:sch 1;
      take j,j;
      thus j=j;
      let f9,g9 be strict covariant Functor of A,B such that
A7:   [f9,g9] = i;
      let x be set;
      thus x in j implies f9 is_naturally_transformable_to g9 & x is
      natural_transformation of f9,g9
      proof
        assume
A8:     x in j;
        f9 = f & g9 = g by A3,A7,XTUPLE_0:1;
        hence thesis by A6,A8;
      end;
      thus f9 is_naturally_transformable_to g9 & x is natural_transformation
      of f9,g9 implies x in j
      proof
A9:     f9 = f & g9 = g by A3,A7,XTUPLE_0:1;
        set I = the carrier of A;
        assume that
A10:    f9 is_naturally_transformable_to g9 and
A11:    x is natural_transformation of f9,g9;
        reconsider h = x as ManySortedSet of the carrier of A by A11;
A12:    f9 is_transformable_to g9 by A10;
A13:    for i9 be set st i9 in I holds h.i9 in N.i9
        proof
          let i9 be set;
          assume i9 in I;
          then reconsider i9 as Element of A;
A14:      P[i9,N.i9] by A5;
          <^f.i9,g.i9^> <> {} & h.i9 is Element of <^f.i9,g.i9^> by A11,A12,A9
,Def2;
          hence thesis by A14;
        end;
A15:    for i9 be object st i9 in dom N holds h.i9 in N.i9
        proof
A16:      dom N = I by PARTFUN1:def 2;
          let i9 be object;
          assume i9 in dom N;
          hence thesis by A13,A16;
        end;
        dom h = the carrier of A by PARTFUN1:def 2;
        then dom h = dom N by PARTFUN1:def 2;
        then x in product N by A15,CARD_3:9;
        hence thesis by A6,A10,A11,A9;
      end;
    end;
    consider a be ManySortedSet of [:Funct(A,B),Funct(A,B):] such that
A17: for i being object st i in [:Funct(A,B),Funct(A,B):] holds P[i,a.i]
    from PBOOLE:sch 3(A1);
A18: for o be object st o in [:Funct(A,B),Funct(A,B),Funct(A,B):]
     for x be object st x in {|a,a|}.o
      ex y be object st y in {|a|}.o & Q[y,x,o]
    proof
      let o be object;
      assume o in [:Funct(A,B),Funct(A,B),Funct(A,B):];
      then o in [:[:Funct(A,B),Funct(A,B):],Funct(A,B):] by ZFMISC_1:def 3;
      then consider ff,h be object such that
A19:  ff in [:Funct(A,B),Funct(A,B):] and
A20:  h in Funct(A,B) and
A21:  o = [ff,h] by ZFMISC_1:def 2;
      consider f,g be object such that
A22:  f in Funct(A,B) & g in Funct(A,B) and
A23:  ff = [f,g] by A19,ZFMISC_1:def 2;
A24:  o = [f,g,h] by A21,A23;
      reconsider T = Funct(A,B) as non empty set by A20;
      reconsider i = f, j = g, k = h as Element of T by A20,A22;
A25:  {|a|}.[i,j,k] = {|a|}.(i,j,k) by MULTOP_1:def 1
        .= a.(i,k) by ALTCAT_1:def 3;
A26:  {|a,a|}.[i,j,k] = {|a,a|}.(i,j,k) by MULTOP_1:def 1
        .= [:a.(j,k),a.(i,j):] by ALTCAT_1:def 4;
      for x be object st x in {|a,a|}.o
      ex y be object st y in {|a|}.o & Q[y,x, o]
      proof
        reconsider i9 = i,j9 = j, k9 = k as strict covariant Functor of A,B by
Def10;
        let x be object;
        assume x in {|a,a|}.o;
        then consider x2,x1 be object such that
A27:    x2 in a.(j,k) and
A28:    x1 in a.(i,j) and
A29:    x = [x2,x1] by A24,A26,ZFMISC_1:def 2;
A30:    x2 in a.[j,k] by A27;
A31:      P[[j,k],a.[j,k]] by A17;
        then
A32:    j9 is_naturally_transformable_to k9 by A30;
        reconsider x2 as natural_transformation of j9,k9 by A30,A31;
A33:    x1 in a.[i,j] by A28;
        P[[i,j],a.[i,j]] by A17;
        then reconsider x1 as natural_transformation of i9,j9 by A33;
        reconsider vv = x2 `*` x1 as natural_transformation of i9,k9;
A34:    for f,g,h being strict covariant Functor of A,B st [f,g,h] = o
for t1 being natural_transformation of f,g for t2 being natural_transformation
of g,h st [t2,t1] = x & ex v being Function st v.x = vv holds vv = t2 `*` t1
        proof
          let f,g,h be strict covariant Functor of A,B such that
A35:      [f,g,h] = o;
A36:      j9 = g by A24,A35,XTUPLE_0:3;
          then reconsider x2 as natural_transformation of g,h by A24,A35,
XTUPLE_0:3;
A37:      i9 = f & k9 = h by A24,A35,XTUPLE_0:3;
          let t1 be natural_transformation of f,g, t2 be
          natural_transformation of g,h such that
A38:      [t2,t1] = x and
          ex v being Function st v.x = vv;
          x2 = t2 by A29,A38,XTUPLE_0:1;
          hence thesis by A29,A38,A36,A37,XTUPLE_0:1;
        end;
        P[[i,j],a.[i,j]] by A17;
        then i9 is_naturally_transformable_to j9 by A33;
        then
A39:       i9 is_naturally_transformable_to k9 by A32,Th8;
        P[[i,k],a.[i,k]] by A17;
        then vv in a.[i9,k9] by A39;
        hence thesis by A24,A25,A34;
      end;
      hence thesis;
    end;
    consider c being ManySortedFunction of {|a,a|},{|a|} such that
A40: for i being object st i in [:Funct(A,B),Funct(A,B),Funct(A,B):]
  ex v being Function of {|a,a|}.i, {|a|}.i st v = c.i &
  for x be object st x
    in {|a,a|}.i holds Q[v.x,x,i] from MSSUBFAM:sch 1(A18);
    set F = AltCatStr (#Funct(A,B),a,c #);
A41: Funct(A,B) is non empty
    proof
      set f = the strict covariant Functor of A,B;
      f in Funct(A,B) by Def10;
      hence thesis;
    end;
    F is transitive
    proof
      let o1,o2,o3 be Object of F;
      reconsider a1 = o1, a2 = o2, a3 = o3 as strict covariant Functor of A,B
      by A41,Def10;
      assume that
A42:  <^o1,o2^> <> {} and
A43:  <^o2,o3^> <> {};
      consider x being object such that
A44:  x in a.[o2,o3] by A43,XBOOLE_0:def 1;
  [o2,o3] in [:Funct(A,B),Funct(A,B):] by A41,ZFMISC_1:def 2;
      then
A45:     P[[o2,o3],a.[o2,o3]] by A17;
      then
A46:  a2 is_naturally_transformable_to a3 by A44;
      reconsider x as natural_transformation of a2,a3 by A44,A45;
      consider y being object such that
A47:  y in a.[o1,o2] by A42,XBOOLE_0:def 1;
  [o1,o2] in [:Funct(A,B),Funct(A,B):] by A41,ZFMISC_1:def 2;
      then
A48:    P[[o1,o2],a.[o1,o2]] by A17;
      then reconsider y as natural_transformation of a1,a2 by A47;
      a1 is_naturally_transformable_to a2 by A47,A48;
      then
A49:  a1 is_naturally_transformable_to a3 by A46,Th8;
A50:   x `*` y is natural_transformation of a1,a3 & [o1,o3] in [:Funct(A,B
      ),Funct(A,B):] by A41,ZFMISC_1:def 2;
      then P[[o1,o3],a.[o1,o3]] by A17;
      hence thesis by A49,A50;
    end;
    then reconsider F as strict non empty transitive AltCatStr by A41;
    take F;
    thus the carrier of F = Funct(A,B);
    thus for f,g being strict covariant Functor of A,B, x being set holds x in
    (the Arrows of F).(f,g) iff f is_naturally_transformable_to g & x is
    natural_transformation of f,g
    proof
      let f,g be strict covariant Functor of A,B;
      let x be set;
      thus x in (the Arrows of F).(f,g) implies f
      is_naturally_transformable_to g & x is natural_transformation of f,g
      proof
        f in Funct(A,B) & g in Funct(A,B) by Def10;
        then
A51:    [f,g] in [:Funct(A,B),Funct(A,B):] by ZFMISC_1:def 2;
        assume
A52:       x in (the Arrows of F).(f,g);
         P[[f,g],a.[f,g]] by A17,A51;
        hence thesis by A52;
      end;
      thus f is_naturally_transformable_to g & x is natural_transformation of
      f,g implies x in (the Arrows of F).(f,g)
      proof
        f in Funct(A,B) & g in Funct(A,B) by Def10;
        then
A53:    [f,g] in [:Funct(A,B),Funct(A,B):] by ZFMISC_1:87;
        assume
A54
:      f is_naturally_transformable_to g & x is natural_transformation of f,g;
         P[[f,g],a.[f,g]] by A17,A53;
        hence thesis by A54;
      end;
    end;
    let f,g,h be strict covariant Functor of A,B such that
A55: f is_naturally_transformable_to g and
A56: g is_naturally_transformable_to h;
    let t1 be natural_transformation of f,g, t2 be natural_transformation of g
    ,h;
A57: f in Funct(A,B) by Def10;
    then reconsider T = Funct(A,B) as non empty set;
A58: g in Funct(A,B) by Def10;
    then
A59: [f,g] in [:Funct(A,B),Funct(A,B):] by A57,ZFMISC_1:87;
A60: h in Funct(A,B) by Def10;
    then [g,h] in [:Funct(A,B),Funct(A,B):] by A58,ZFMISC_1:87;
    then P[[g,h],a.[g,h]] by A17;
    then
A61: t2 in a.[g,h] by A56;
    reconsider i = f, j = g, k = h as Element of T by Def10;
A62: {|a,a|}.[i,j,k] = {|a,a|}.(i,j,k) by MULTOP_1:def 1
      .= [:a.(j,k),a.(i,j):] by ALTCAT_1:def 4;
    [:Funct(A,B),Funct(A,B),Funct(A,B):] = [:[:Funct(A,B),Funct(A,B):],
    Funct(A,B) :] & [f,g,h] = [[f,g],h] by ZFMISC_1:def 3;
    then [f,g,h] in [:Funct(A,B),Funct(A,B),Funct(A,B):] by A60,A59,ZFMISC_1:87
;
    then consider v be Function of {|a,a|}.[f,g,h], {|a|}.[f,g,h] such that
A63: v = c.[f,g,h] and
A64: for x be object st x in {|a,a|}.[f,g,h] holds Q[v.x,x,[f,g,h]] by A40;
    P[[f,g],a.[f,g]] by A17,A59;
    then t1 in a.[f,g] by A55;
    then [t2,t1] in {|a,a|}.[f,g,h] by A62,A61,ZFMISC_1:87;
    then
A65: v.(t2,t1) = t2`*`t1 by A64;
    v = c.(f,g,h) by A63,MULTOP_1:def 1;
    hence thesis by A65;
  end;
  uniqueness
  proof
    let C1,C2 be strict non empty transitive AltCatStr such that
A66: the carrier of C1 = Funct(A,B) and
A67: for F,G being strict covariant Functor of A,B, x being set holds
    x in (the Arrows of C1).(F,G) iff F is_naturally_transformable_to G & x is
    natural_transformation of F,G and
A68: for F,G,H being strict covariant Functor of A,B st F
    is_naturally_transformable_to G & G is_naturally_transformable_to H for t1
being natural_transformation of F,G, t2 being natural_transformation of G,H ex
    f being Function st f = (the Comp of C1).(F,G,H) & f.(t2,t1) = t2`*` t1 and
A69: the carrier of C2 = Funct(A,B) and
A70: for F,G being strict covariant Functor of A,B, x being set holds
    x in (the Arrows of C2).(F,G) iff F is_naturally_transformable_to G & x is
    natural_transformation of F,G and
A71: for F,G,H being strict covariant Functor of A,B st F
    is_naturally_transformable_to G & G is_naturally_transformable_to H for t1
being natural_transformation of F,G, t2 being natural_transformation of G,H ex
    f being Function st f = (the Comp of C2).(F,G,H) & f.(t2,t1) = t2`*`t1;
    set R = the carrier of C1, T = the carrier of C2, N = the Arrows of C1, M
    = the Arrows of C2, O = the Comp of C1, P = the Comp of C2;
A72: for i,j being object st i in R & j in T holds N.(i,j) = M.(i,j)
    proof
      let i,j be object such that
A73:  i in R and
A74:  j in T;
      reconsider g = j as strict covariant Functor of A,B by A69,A74,Def10;
      reconsider f = i as strict covariant Functor of A,B by A66,A73,Def10;
      now
        let x be object;
        x in N.(i,j) iff f is_naturally_transformable_to g & x is
        natural_transformation of f,g by A67;
        hence x in N.(i,j) iff x in M.(i,j) by A70;
      end;
      hence thesis by TARSKI:2;
    end;
    then
A75: the Arrows of C1 = the Arrows of C2 by A66,A69,ALTCAT_1:6;
    for i,j,k being object st i in R & j in R & k in R holds O.(i,j,k) = P.
    (i, j, k )
    proof
      let i,j,k be object;
      assume that
A76:  i in R and
A77:  j in R and
A78:  k in R;
      reconsider h = k as strict covariant Functor of A,B by A66,A78,Def10;
      reconsider g = j as strict covariant Functor of A,B by A66,A77,Def10;
      reconsider f = i as strict covariant Functor of A,B by A66,A76,Def10;
      per cases;
      suppose
A79:    N.(i,j) = {} or N.(j,k) = {};
        thus O.(i,j,k) = P.(i,j,k)
        proof
          per cases by A79;
          suppose
A80:        N.(i,j) = {};
            reconsider T as non empty set;
            reconsider i9 = i, j9 = j, k9 = k as Element of T by A66,A69,A76
,A77,A78;
            M.(i,j) = {} by A66,A69,A72,A80,ALTCAT_1:6;
            then
A81:        [:M.(j9,k9),M.(i9,j9):] = {} by ZFMISC_1:90;
A82:        {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A83:        {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= M.(i9,k9) by ALTCAT_1:def 3;
            P.[i9,j9,k9] = P.(i9,j9,k9) by MULTOP_1:def 1;
            then
A84:        P.(i9,j9,k9) is Function of [:M.(j9,k9),M.(i9,j9):], M.(i9,
            k9) by A82,A83,PBOOLE:def 15;
A85:        {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A86:        {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= M.(i9,k9) by ALTCAT_1:def 3;
            O.[i9,j9,k9] = O.(i9,j9,k9) by MULTOP_1:def 1;
            then O.(i9,j9,k9) is Function of [:M.(j9,k9),M.(i9,j9):], M.(i9,
            k9) by A66,A69,A75,A85,A86,PBOOLE:def 15;
            hence thesis by A81,A84;
          end;
          suppose
A87:        N.(j,k) = {};
            reconsider T as non empty set;
            reconsider i9 = i, j9 = j, k9 = k as Element of T by A66,A69,A76
,A77,A78;
            M.(j,k) = {} by A66,A69,A72,A87,ALTCAT_1:6;
            then
A88:        [:M.(j9,k9),M.(i9,j9):] = {} by ZFMISC_1:90;
A89:        {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A90:        {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= M.(i9,k9) by ALTCAT_1:def 3;
            P.[i9,j9,k9] = P.(i9,j9,k9) by MULTOP_1:def 1;
            then
A91:        P.(i9,j9,k9) is Function of [:M.(j9,k9),M.(i9,j9):], M.(i9,
            k9) by A89,A90,PBOOLE:def 15;
A92:        {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A93:        {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
              .= M.(i9,k9) by ALTCAT_1:def 3;
            O.[i9,j9,k9] = O.(i9,j9,k9) by MULTOP_1:def 1;
            then O.(i9,j9,k9) is Function of [:M.(j9,k9),M.(i9,j9):], M.(i9,
            k9) by A66,A69,A75,A92,A93,PBOOLE:def 15;
            hence thesis by A88,A91;
          end;
        end;
      end;
      suppose that
A94:    N.(i,j) <> {} and
A95:    N.(j,k) <> {};
        reconsider T as non empty set;
        reconsider i9 = i, j9 = j, k9 = k as Element of T by A66,A69,A76,A77
,A78;
A96:    {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
          .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A97:    {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
          .= M.(i9,k9) by ALTCAT_1:def 3;
        P.[i9,j9,k9] = P.(i9,j9,k9) by MULTOP_1:def 1;
        then reconsider
        t2 = P.(i,j,k) as Function of [:M.(j,k),M.(i,j):], M.(i,k)
        by A96,A97,PBOOLE:def 15;
A98:    {|M,M|}.[i9,j9,k9] = {|M,M|}.(i9,j9,k9) by MULTOP_1:def 1
          .= [:M.(j9,k9),M.(i9,j9):] by ALTCAT_1:def 4;
A99:    {|M|}.[i9,j9,k9] = {|M|}.(i9,j9,k9) by MULTOP_1:def 1
          .= M.(i9,k9) by ALTCAT_1:def 3;
        O.[i9,j9,k9] = O.(i9,j9,k9) by MULTOP_1:def 1;
        then reconsider
        t1 = O.(i,j,k) as Function of [:M.(j,k),M.(i,j):], M.(i,k)
        by A66,A69,A75,A98,A99,PBOOLE:def 15;
A100:    M.(j,k) <> {} by A66,A69,A72,A95,ALTCAT_1:6;
A101:    M.(i,j) <> {} by A66,A69,A72,A94,ALTCAT_1:6;
        for a being Element of M.(j,k) for b being Element of M.(i,j)
        holds t1.(a,b) = t2.(a,b)
        proof
          let a be Element of M.(j,k), b be Element of M.(i,j);
          a in M.(j,k) by A100;
          then
A102:      g is_naturally_transformable_to h by A70;
          reconsider a as natural_transformation of g,h by A70,A100;
          b in M.(i,j) by A101;
          then
A103:      f is_naturally_transformable_to g by A70;
          reconsider b as natural_transformation of f,g by A70,A101;
          (ex t19 be Function st t19 = O.(f,g,h) & t19.(a,b) = a `*` b )
& ex t29 be Function st t29 = P.(f,g,h) & t29.(a,b) = a `*` b by A68,A71,A102
,A103;
          hence thesis;
        end;
        hence thesis by BINOP_1:2;
      end;
    end;
    hence thesis by A66,A69,A75,ALTCAT_1:8;
  end;
end;
