Article ENS_1, MML version 4.99.1005

:: ENS_1:funcnot 1 => ENS_1:func 1
definition
  let a1 be non empty set;
  func Funcs A1 -> set equals
    union {Funcs(b1,b2) where b1 is Element of a1, b2 is Element of a1: TRUE};
end;

:: ENS_1:def 1
theorem
for b1 being non empty set holds
   Funcs b1 = union {Funcs(b2,b3) where b2 is Element of b1, b3 is Element of b1: TRUE};

:: ENS_1:funcreg 1
registration
  let a1 be non empty set;
  cluster Funcs a1 -> non empty functional;
end;

:: ENS_1:th 1
theorem
for b1 being non empty set
for b2 being set holds
      b2 in Funcs b1
   iff
      ex b3, b4 being Element of b1 st
         (b4 = {} implies b3 = {}) & b2 is Function-like quasi_total Relation of b3,b4;

:: ENS_1:th 2
theorem
for b1 being non empty set
for b2, b3 being Element of b1 holds
Funcs(b2,b3) c= Funcs b1;

:: ENS_1:th 3
theorem
for b1 being non empty set
for b2 being non empty Element of bool b1 holds
   Funcs b2 c= Funcs b1;

:: ENS_1:funcnot 2 => ENS_1:func 2
definition
  let a1 be non empty set;
  func Maps A1 -> set equals
    {[[b1,b2],b3] where b1 is Element of a1, b2 is Element of a1, b3 is Element of Funcs a1: (b2 = {} implies b1 = {}) & b3 is Function-like quasi_total Relation of b1,b2};
end;

:: ENS_1:def 2
theorem
for b1 being non empty set holds
   Maps b1 = {[[b2,b3],b4] where b2 is Element of b1, b3 is Element of b1, b4 is Element of Funcs b1: (b3 = {} implies b2 = {}) & b4 is Function-like quasi_total Relation of b2,b3};

:: ENS_1:funcreg 2
registration
  let a1 be non empty set;
  cluster Maps a1 -> non empty;
end;

:: ENS_1:th 4
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   ex b3 being Element of Funcs b1 st
      ex b4, b5 being Element of b1 st
         b2 = [[b4,b5],b3] & (b5 = {} implies b4 = {}) & b3 is Function-like quasi_total Relation of b4,b5;

:: ENS_1:th 5
theorem
for b1 being non empty set
for b2, b3 being Element of b1
for b4 being Function-like quasi_total Relation of b2,b3
      st (b3 = {} implies b2 = {})
   holds [[b2,b3],b4] in Maps b1;

:: ENS_1:th 6
theorem
for b1 being non empty set holds
   Maps b1 c= [:[:b1,b1:],Funcs b1:];

:: ENS_1:th 7
theorem
for b1 being non empty set
for b2 being non empty Element of bool b1 holds
   Maps b2 c= Maps b1;

:: ENS_1:funcreg 3
registration
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  cluster a2 `2 -> Relation-like Function-like;
end;

:: ENS_1:funcnot 3 => ENS_1:func 3
definition
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  func dom A2 -> Element of a1 equals
    a2 `1 `1;
end;

:: ENS_1:def 4
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   dom b2 = b2 `1 `1;

:: ENS_1:funcnot 4 => ENS_1:func 4
definition
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  func cod A2 -> Element of a1 equals
    a2 `1 `2;
end;

:: ENS_1:def 5
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   cod b2 = b2 `1 `2;

:: ENS_1:th 8
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   b2 = [[dom b2,cod b2],b2 `2];

:: ENS_1:th 9
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   (cod b2 = {} implies dom b2 = {}) &
    b2 `2 is Function-like quasi_total Relation of dom b2,cod b2;

:: ENS_1:th 10
theorem
for b1 being non empty set
for b2 being Relation-like Function-like set
for b3, b4 being set
      st [[b3,b4],b2] in Maps b1
   holds (b4 = {} implies b3 = {}) & b2 is Function-like quasi_total Relation of b3,b4;

:: ENS_1:funcnot 5 => ENS_1:func 5
definition
  let a1 be non empty set;
  let a2 be Element of a1;
  func id$ A2 -> Element of Maps a1 equals
    [[a2,a2],id a2];
end;

:: ENS_1:def 6
theorem
for b1 being non empty set
for b2 being Element of b1 holds
   id$ b2 = [[b2,b2],id b2];

:: ENS_1:th 11
theorem
for b1 being non empty set
for b2 being Element of b1 holds
   (id$ b2) `2 = id b2 & dom id$ b2 = b2 & cod id$ b2 = b2;

:: ENS_1:funcnot 6 => ENS_1:func 6
definition
  let a1 be non empty set;
  let a2, a3 be Element of Maps a1;
  assume cod a2 = dom a3;
  func A3 * A2 -> Element of Maps a1 equals
    [[dom a2,cod a3],a2 `2 * (a3 `2)];
end;

:: ENS_1:def 7
theorem
for b1 being non empty set
for b2, b3 being Element of Maps b1
      st cod b2 = dom b3
   holds b3 * b2 = [[dom b2,cod b3],b2 `2 * (b3 `2)];

:: ENS_1:th 12
theorem
for b1 being non empty set
for b2, b3 being Element of Maps b1
      st dom b2 = cod b3
   holds (b2 * b3) `2 = b3 `2 * (b2 `2) &
    dom (b2 * b3) = dom b3 &
    cod (b2 * b3) = cod b2;

:: ENS_1:th 13
theorem
for b1 being non empty set
for b2, b3, b4 being Element of Maps b1
      st dom b2 = cod b3 & dom b4 = cod b2
   holds b4 * (b2 * b3) = (b4 * b2) * b3;

:: ENS_1:th 14
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   b2 * id$ dom b2 = b2 & (id$ cod b2) * b2 = b2;

:: ENS_1:funcnot 7 => ENS_1:func 7
definition
  let a1 be non empty set;
  let a2, a3 be Element of a1;
  func Maps(A2,A3) -> set equals
    {[[a2,a3],b1] where b1 is Element of Funcs a1: [[a2,a3],b1] in Maps a1};
end;

:: ENS_1:def 8
theorem
for b1 being non empty set
for b2, b3 being Element of b1 holds
Maps(b2,b3) = {[[b2,b3],b4] where b4 is Element of Funcs b1: [[b2,b3],b4] in Maps b1};

:: ENS_1:th 15
theorem
for b1 being non empty set
for b2, b3 being Element of b1
for b4 being Function-like quasi_total Relation of b2,b3
      st (b3 = {} implies b2 = {})
   holds [[b2,b3],b4] in Maps(b2,b3);

:: ENS_1:th 16
theorem
for b1 being non empty set
for b2, b3 being Element of b1
for b4 being Element of Maps b1
      st b4 in Maps(b2,b3)
   holds b4 = [[b2,b3],b4 `2];

:: ENS_1:th 17
theorem
for b1 being non empty set
for b2, b3 being Element of b1 holds
Maps(b2,b3) c= Maps b1;

:: ENS_1:th 18
theorem
for b1 being non empty set holds
   Maps b1 = union {Maps(b2,b3) where b2 is Element of b1, b3 is Element of b1: TRUE};

:: ENS_1:th 19
theorem
for b1 being non empty set
for b2, b3 being Element of b1
for b4 being Element of Maps b1 holds
      b4 in Maps(b2,b3)
   iff
      dom b4 = b2 & cod b4 = b3;

:: ENS_1:th 20
theorem
for b1 being non empty set
for b2, b3 being Element of b1
for b4 being Element of Maps b1
      st b4 in Maps(b2,b3)
   holds b4 `2 in Funcs(b2,b3);

:: ENS_1:attrnot 1 => ENS_1:attr 1
definition
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  attr a2 is surjective means
    proj2 (a2 `2) = cod a2;
end;

:: ENS_1:dfs 8
definiens
  let a1 be non empty set;
  let a2 be Element of Maps a1;
To prove
     a2 is surjective
it is sufficient to prove
  thus proj2 (a2 `2) = cod a2;

:: ENS_1:def 9
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
      b2 is surjective(b1)
   iff
      proj2 (b2 `2) = cod b2;

:: ENS_1:prednot 1 => ENS_1:attr 1
notation
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  synonym a2 is_a_surjection for surjective;
end;

:: ENS_1:funcnot 8 => ENS_1:func 8
definition
  let a1 be non empty set;
  func fDom A1 -> Function-like quasi_total Relation of Maps a1,a1 means
    for b1 being Element of Maps a1 holds
       it . b1 = dom b1;
end;

:: ENS_1:def 10
theorem
for b1 being non empty set
for b2 being Function-like quasi_total Relation of Maps b1,b1 holds
      b2 = fDom b1
   iff
      for b3 being Element of Maps b1 holds
         b2 . b3 = dom b3;

:: ENS_1:funcnot 9 => ENS_1:func 9
definition
  let a1 be non empty set;
  func fCod A1 -> Function-like quasi_total Relation of Maps a1,a1 means
    for b1 being Element of Maps a1 holds
       it . b1 = cod b1;
end;

:: ENS_1:def 11
theorem
for b1 being non empty set
for b2 being Function-like quasi_total Relation of Maps b1,b1 holds
      b2 = fCod b1
   iff
      for b3 being Element of Maps b1 holds
         b2 . b3 = cod b3;

:: ENS_1:funcnot 10 => ENS_1:func 10
definition
  let a1 be non empty set;
  func fComp A1 -> Function-like Relation of [:Maps a1,Maps a1:],Maps a1 means
    (for b1, b2 being Element of Maps a1 holds
        [b1,b2] in proj1 it
     iff
        dom b1 = cod b2) &
     (for b1, b2 being Element of Maps a1
           st dom b1 = cod b2
        holds it . [b1,b2] = b1 * b2);
end;

:: ENS_1:def 12
theorem
for b1 being non empty set
for b2 being Function-like Relation of [:Maps b1,Maps b1:],Maps b1 holds
      b2 = fComp b1
   iff
      (for b3, b4 being Element of Maps b1 holds
          [b3,b4] in proj1 b2
       iff
          dom b3 = cod b4) &
       (for b3, b4 being Element of Maps b1
             st dom b3 = cod b4
          holds b2 . [b3,b4] = b3 * b4);

:: ENS_1:funcnot 11 => ENS_1:func 11
definition
  let a1 be non empty set;
  func fId A1 -> Function-like quasi_total Relation of a1,Maps a1 means
    for b1 being Element of a1 holds
       it . b1 = id$ b1;
end;

:: ENS_1:def 13
theorem
for b1 being non empty set
for b2 being Function-like quasi_total Relation of b1,Maps b1 holds
      b2 = fId b1
   iff
      for b3 being Element of b1 holds
         b2 . b3 = id$ b3;

:: ENS_1:funcnot 12 => ENS_1:func 12
definition
  let a1 be non empty set;
  func Ens A1 -> CatStr equals
    CatStr(#a1,Maps a1,fDom a1,fCod a1,fComp a1,fId a1#);
end;

:: ENS_1:def 14
theorem
for b1 being non empty set holds
   Ens b1 = CatStr(#b1,Maps b1,fDom b1,fCod b1,fComp b1,fId b1#);

:: ENS_1:th 21
theorem
for b1 being non empty set holds
   CatStr(#b1,Maps b1,fDom b1,fCod b1,fComp b1,fId b1#) is non void Category-like CatStr;

:: ENS_1:funcreg 4
registration
  let a1 be non empty set;
  cluster Ens a1 -> strict non void Category-like;
end;

:: ENS_1:th 22
theorem
for b1 being non empty set
for b2 being Element of b1 holds
   b2 is Element of the Vertices of Ens b1;

:: ENS_1:funcnot 13 => ENS_1:func 13
definition
  let a1 be non empty set;
  let a2 be Element of a1;
  func @ A2 -> Element of the Vertices of Ens a1 equals
    a2;
end;

:: ENS_1:def 15
theorem
for b1 being non empty set
for b2 being Element of b1 holds
   @ b2 = b2;

:: ENS_1:th 23
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1 holds
   b2 is Element of b1;

:: ENS_1:funcnot 14 => ENS_1:func 14
definition
  let a1 be non empty set;
  let a2 be Element of the Vertices of Ens a1;
  func @ A2 -> Element of a1 equals
    a2;
end;

:: ENS_1:def 16
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1 holds
   @ b2 = b2;

:: ENS_1:th 24
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   b2 is Element of the Edges of Ens b1;

:: ENS_1:funcnot 15 => ENS_1:func 15
definition
  let a1 be non empty set;
  let a2 be Element of Maps a1;
  func @ A2 -> Element of the Edges of Ens a1 equals
    a2;
end;

:: ENS_1:def 17
theorem
for b1 being non empty set
for b2 being Element of Maps b1 holds
   @ b2 = b2;

:: ENS_1:th 25
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1 holds
   b2 is Element of Maps b1;

:: ENS_1:funcnot 16 => ENS_1:func 16
definition
  let a1 be non empty set;
  let a2 be Element of the Edges of Ens a1;
  func @ A2 -> Element of Maps a1 equals
    a2;
end;

:: ENS_1:def 18
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1 holds
   @ b2 = b2;

:: ENS_1:th 26
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1 holds
   dom b2 = dom @ b2 & cod b2 = cod @ b2;

:: ENS_1:th 27
theorem
for b1 being non empty set
for b2, b3 being Element of the Vertices of Ens b1 holds
Hom(b2,b3) = Maps(@ b2,@ b3);

:: ENS_1:th 28
theorem
for b1 being non empty set
for b2, b3 being Element of the Edges of Ens b1
      st dom b2 = cod b3
   holds b2 * b3 = (@ b2) * @ b3;

:: ENS_1:th 29
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1 holds
   id b2 = id$ @ b2;

:: ENS_1:th 30
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1
      st b2 = {}
   holds b2 is initial(Ens b1);

:: ENS_1:th 31
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1
      st {} in b1 & b2 is initial(Ens b1)
   holds b2 = {};

:: ENS_1:th 32
theorem
for b1 being non empty universal set
for b2 being Element of the Vertices of Ens b1
      st b2 is initial(Ens b1)
   holds b2 = {};

:: ENS_1:th 33
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1
      st ex b3 being set st
           b2 = {b3}
   holds b2 is terminal(Ens b1);

:: ENS_1:th 34
theorem
for b1 being non empty set
for b2 being Element of the Vertices of Ens b1
      st b1 <> {{}} & b2 is terminal(Ens b1)
   holds ex b3 being set st
      b2 = {b3};

:: ENS_1:th 35
theorem
for b1 being non empty universal set
for b2 being Element of the Vertices of Ens b1
      st b2 is terminal(Ens b1)
   holds ex b3 being set st
      b2 = {b3};

:: ENS_1:th 36
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1 holds
      b2 is monic(Ens b1)
   iff
      (@ b2) `2 is one-to-one;

:: ENS_1:th 37
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1
      st b2 is epi(Ens b1) &
         (ex b3 being Element of b1 st
            ex b4, b5 being set st
               b4 in b3 & b5 in b3 & b4 <> b5)
   holds @ b2 is surjective(b1);

:: ENS_1:th 38
theorem
for b1 being non empty set
for b2 being Element of the Edges of Ens b1
      st @ b2 is surjective(b1)
   holds b2 is epi(Ens b1);

:: ENS_1:th 39
theorem
for b1 being non empty universal set
for b2 being Element of the Edges of Ens b1
      st b2 is epi(Ens b1)
   holds @ b2 is surjective(b1);

:: ENS_1:th 40
theorem
for b1 being non empty set
for b2 being non empty Element of bool b1 holds
   Ens b2 is_full_subcategory_of Ens b1;

:: ENS_1:funcnot 17 => ENS_1:func 17
definition
  let a1 be non void Category-like CatStr;
  func Hom A1 -> set equals
    {Hom(b1,b2) where b1 is Element of the Vertices of a1, b2 is Element of the Vertices of a1: TRUE};
end;

:: ENS_1:def 19
theorem
for b1 being non void Category-like CatStr holds
   Hom b1 = {Hom(b2,b3) where b2 is Element of the Vertices of b1, b3 is Element of the Vertices of b1: TRUE};

:: ENS_1:funcreg 5
registration
  let a1 be non void Category-like CatStr;
  cluster Hom a1 -> non empty;
end;

:: ENS_1:th 41
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Vertices of b1 holds
Hom(b2,b3) in Hom b1;

:: ENS_1:th 42
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1 holds
   (Hom(b2,cod b3) = {} implies Hom(b2,dom b3) = {}) &
    (Hom(dom b3,b2) = {} implies Hom(cod b3,b2) = {});

:: ENS_1:funcnot 18 => ENS_1:func 18
definition
  let a1 be non void Category-like CatStr;
  let a2 be Element of the Vertices of a1;
  let a3 be Element of the Edges of a1;
  func hom(A2,A3) -> Function-like quasi_total Relation of Hom(a2,dom a3),Hom(a2,cod a3) means
    for b1 being Element of the Edges of a1
          st b1 in Hom(a2,dom a3)
       holds it . b1 = a3 * b1;
end;

:: ENS_1:def 20
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1
for b4 being Function-like quasi_total Relation of Hom(b2,dom b3),Hom(b2,cod b3) holds
      b4 = hom(b2,b3)
   iff
      for b5 being Element of the Edges of b1
            st b5 in Hom(b2,dom b3)
         holds b4 . b5 = b3 * b5;

:: ENS_1:funcnot 19 => ENS_1:func 19
definition
  let a1 be non void Category-like CatStr;
  let a2 be Element of the Vertices of a1;
  let a3 be Element of the Edges of a1;
  func hom(A3,A2) -> Function-like quasi_total Relation of Hom(cod a3,a2),Hom(dom a3,a2) means
    for b1 being Element of the Edges of a1
          st b1 in Hom(cod a3,a2)
       holds it . b1 = b1 * a3;
end;

:: ENS_1:def 21
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1
for b4 being Function-like quasi_total Relation of Hom(cod b3,b2),Hom(dom b3,b2) holds
      b4 = hom(b3,b2)
   iff
      for b5 being Element of the Edges of b1
            st b5 in Hom(cod b3,b2)
         holds b4 . b5 = b5 * b3;

:: ENS_1:th 43
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Vertices of b1 holds
hom(b2,id b3) = id Hom(b2,b3);

:: ENS_1:th 44
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Vertices of b1 holds
hom(id b2,b3) = id Hom(b2,b3);

:: ENS_1:th 45
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3, b4 being Element of the Edges of b1
      st dom b3 = cod b4
   holds hom(b2,b3 * b4) = (hom(b2,b3)) * hom(b2,b4);

:: ENS_1:th 46
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3, b4 being Element of the Edges of b1
      st dom b3 = cod b4
   holds hom(b3 * b4,b2) = (hom(b4,b2)) * hom(b3,b2);

:: ENS_1:th 47
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1 holds
   [[Hom(b2,dom b3),Hom(b2,cod b3)],hom(b2,b3)] is Element of Maps Hom b1;

:: ENS_1:th 48
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1 holds
   [[Hom(cod b3,b2),Hom(dom b3,b2)],hom(b3,b2)] is Element of Maps Hom b1;

:: ENS_1:funcnot 20 => ENS_1:func 20
definition
  let a1 be non void Category-like CatStr;
  let a2 be Element of the Vertices of a1;
  func hom?- A2 -> Function-like quasi_total Relation of the Edges of a1,Maps Hom a1 means
    for b1 being Element of the Edges of a1 holds
       it . b1 = [[Hom(a2,dom b1),Hom(a2,cod b1)],hom(a2,b1)];
end;

:: ENS_1:def 22
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Function-like quasi_total Relation of the Edges of b1,Maps Hom b1 holds
      b3 = hom?- b2
   iff
      for b4 being Element of the Edges of b1 holds
         b3 . b4 = [[Hom(b2,dom b4),Hom(b2,cod b4)],hom(b2,b4)];

:: ENS_1:funcnot 21 => ENS_1:func 21
definition
  let a1 be non void Category-like CatStr;
  let a2 be Element of the Vertices of a1;
  func hom-? A2 -> Function-like quasi_total Relation of the Edges of a1,Maps Hom a1 means
    for b1 being Element of the Edges of a1 holds
       it . b1 = [[Hom(cod b1,a2),Hom(dom b1,a2)],hom(b1,a2)];
end;

:: ENS_1:def 23
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Function-like quasi_total Relation of the Edges of b1,Maps Hom b1 holds
      b3 = hom-? b2
   iff
      for b4 being Element of the Edges of b1 holds
         b3 . b4 = [[Hom(cod b4,b2),Hom(dom b4,b2)],hom(b4,b2)];

:: ENS_1:th 49
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds hom?- b3 is Functor of b2,Ens b1;

:: ENS_1:th 50
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds hom-? b3 is Contravariant_Functor of b2,Ens b1;

:: ENS_1:th 51
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Edges of b1
      st Hom(dom b2,cod b3) = {}
   holds Hom(cod b2,dom b3) = {};

:: ENS_1:funcnot 22 => ENS_1:func 22
definition
  let a1 be non void Category-like CatStr;
  let a2, a3 be Element of the Edges of a1;
  func hom(A2,A3) -> Function-like quasi_total Relation of Hom(cod a2,dom a3),Hom(dom a2,cod a3) means
    for b1 being Element of the Edges of a1
          st b1 in Hom(cod a2,dom a3)
       holds it . b1 = (a3 * b1) * a2;
end;

:: ENS_1:def 24
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Edges of b1
for b4 being Function-like quasi_total Relation of Hom(cod b2,dom b3),Hom(dom b2,cod b3) holds
      b4 = hom(b2,b3)
   iff
      for b5 being Element of the Edges of b1
            st b5 in Hom(cod b2,dom b3)
         holds b4 . b5 = (b3 * b5) * b2;

:: ENS_1:th 52
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Edges of b1 holds
[[Hom(cod b2,dom b3),Hom(dom b2,cod b3)],hom(b2,b3)] is Element of Maps Hom b1;

:: ENS_1:th 53
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1
for b3 being Element of the Edges of b1 holds
   hom(id b2,b3) = hom(b2,b3) & hom(b3,id b2) = hom(b3,b2);

:: ENS_1:th 54
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Vertices of b1 holds
hom(id b2,id b3) = id Hom(b2,b3);

:: ENS_1:th 55
theorem
for b1 being non void Category-like CatStr
for b2, b3 being Element of the Edges of b1 holds
hom(b2,b3) = (hom(dom b2,b3)) * hom(b2,dom b3);

:: ENS_1:th 56
theorem
for b1 being non void Category-like CatStr
for b2, b3, b4, b5 being Element of the Edges of b1
      st cod b2 = dom b3 & dom b4 = cod b5
   holds hom(b3 * b2,b4 * b5) = (hom(b2,b4)) * hom(b3,b5);

:: ENS_1:funcnot 23 => ENS_1:func 23
definition
  let a1 be non void Category-like CatStr;
  func hom?? A1 -> Function-like quasi_total Relation of the Edges of [:a1,a1:],Maps Hom a1 means
    for b1, b2 being Element of the Edges of a1 holds
    it . [b1,b2] = [[Hom(cod b1,dom b2),Hom(dom b1,cod b2)],hom(b1,b2)];
end;

:: ENS_1:def 25
theorem
for b1 being non void Category-like CatStr
for b2 being Function-like quasi_total Relation of the Edges of [:b1,b1:],Maps Hom b1 holds
      b2 = hom?? b1
   iff
      for b3, b4 being Element of the Edges of b1 holds
      b2 . [b3,b4] = [[Hom(cod b3,dom b4),Hom(dom b3,cod b4)],hom(b3,b4)];

:: ENS_1:th 57
theorem
for b1 being non void Category-like CatStr
for b2 being Element of the Vertices of b1 holds
   hom?- b2 = (curry hom?? b1) . id b2 &
    hom-? b2 = (curry' hom?? b1) . id b2;

:: ENS_1:th 58
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
      st Hom b2 c= b1
   holds hom?? b2 is Functor of [:b2 opp,b2:],Ens b1;

:: ENS_1:funcnot 24 => ENS_1:func 24
definition
  let a1 be non empty set;
  let a2 be non void Category-like CatStr;
  let a3 be Element of the Vertices of a2;
  assume Hom a2 c= a1;
  func hom?-(A1,A3) -> Functor of a2,Ens a1 equals
    hom?- a3;
end;

:: ENS_1:def 26
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds hom?-(b1,b3) = hom?- b3;

:: ENS_1:funcnot 25 => ENS_1:func 25
definition
  let a1 be non empty set;
  let a2 be non void Category-like CatStr;
  let a3 be Element of the Vertices of a2;
  assume Hom a2 c= a1;
  func hom-?(A1,A3) -> Contravariant_Functor of a2,Ens a1 equals
    hom-? a3;
end;

:: ENS_1:def 27
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds hom-?(b1,b3) = hom-? b3;

:: ENS_1:funcnot 26 => ENS_1:func 26
definition
  let a1 be non empty set;
  let a2 be non void Category-like CatStr;
  assume Hom a2 c= a1;
  func hom??(A1,A2) -> Functor of [:a2 opp,a2:],Ens a1 equals
    hom?? a2;
end;

:: ENS_1:def 28
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
      st Hom b2 c= b1
   holds hom??(b1,b2) = hom?? b2;

:: ENS_1:th 59
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
for b4 being Element of the Edges of b2
      st Hom b2 c= b1
   holds (hom?-(b1,b3)) . b4 = [[Hom(b3,dom b4),Hom(b3,cod b4)],hom(b3,b4)];

:: ENS_1:th 60
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3, b4 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds (Obj hom?-(b1,b3)) . b4 = Hom(b3,b4);

:: ENS_1:th 61
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
for b4 being Element of the Edges of b2
      st Hom b2 c= b1
   holds (hom-?(b1,b3)) . b4 = [[Hom(cod b4,b3),Hom(dom b4,b3)],hom(b4,b3)];

:: ENS_1:th 62
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3, b4 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds (Obj hom-?(b1,b3)) . b4 = Hom(b4,b3);

:: ENS_1:th 63
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3, b4 being Element of the Edges of b2
      st Hom b2 c= b1
   holds (hom??(b1,b2)) . [b3 opp,b4] = [[Hom(cod b3,dom b4),Hom(dom b3,cod b4)],hom(b3,b4)];

:: ENS_1:th 64
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3, b4 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds (Obj hom??(b1,b2)) . [b3 opp,b4] = Hom(b3,b4);

:: ENS_1:th 65
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds (hom??(b1,b2)) ?- (b3 opp) = hom?-(b1,b3);

:: ENS_1:th 66
theorem
for b1 being non empty set
for b2 being non void Category-like CatStr
for b3 being Element of the Vertices of b2
      st Hom b2 c= b1
   holds (hom??(b1,b2)) -? b3 = hom-?(b1,b3);