Article MSAFREE, MML version 4.99.1005

:: MSAFREE:th 1
theorem
for b1 being set
for b2 being non empty set
for b3 being Function-like quasi_total Relation of b1,b2 *
for b4 being ManySortedSet of b2
for b5 being Element of b2 *
for b6 being set
      st b6 in b1 & b5 = b3 . b6
   holds (b4 # * b3) . b6 = product (b5 * b4);

:: MSAFREE:funcnot 1 => MSAFREE:func 1
definition
  let a1 be set;
  let a2, a3 be ManySortedSet of a1;
  let a4 be ManySortedSubset of a2;
  let a5 be ManySortedFunction of a2,a3;
  func A5 || A4 -> ManySortedFunction of a4,a3 means
    for b1 being set
       st b1 in a1
    for b2 being Function-like quasi_total Relation of a2 . b1,a3 . b1
          st b2 = a5 . b1
       holds it . b1 = b2 | (a4 . b1);
end;

:: MSAFREE:def 1
theorem
for b1 being set
for b2, b3 being ManySortedSet of b1
for b4 being ManySortedSubset of b2
for b5 being ManySortedFunction of b2,b3
for b6 being ManySortedFunction of b4,b3 holds
      b6 = b5 || b4
   iff
      for b7 being set
         st b7 in b1
      for b8 being Function-like quasi_total Relation of b2 . b7,b3 . b7
            st b8 = b5 . b7
         holds b6 . b7 = b8 | (b4 . b7);

:: MSAFREE:funcnot 2 => MSAFREE:func 2
definition
  let a1 be set;
  let a2 be ManySortedSet of a1;
  let a3 be set;
  assume a3 in a1;
  func coprod(A3,A2) -> set means
    for b1 being set holds
          b1 in it
       iff
          ex b2 being set st
             b2 in a2 . a3 & b1 = [b2,a3];
end;

:: MSAFREE:def 2
theorem
for b1 being set
for b2 being ManySortedSet of b1
for b3 being set
   st b3 in b1
for b4 being set holds
      b4 = coprod(b3,b2)
   iff
      for b5 being set holds
            b5 in b4
         iff
            ex b6 being set st
               b6 in b2 . b3 & b5 = [b6,b3];

:: MSAFREE:funcnot 3 => CARD_3:func 2
notation
  let a1 be set;
  let a2 be ManySortedSet of a1;
  synonym coprod a2 for disjoin a1;
end;

:: MSAFREE:funcnot 4 => MSAFREE:func 3
definition
  let a1 be set;
  let a2 be ManySortedSet of a1;
  redefine func coprod A2 -> ManySortedSet of a1 means
    for b1 being set
          st b1 in a1
       holds it . b1 = coprod(b1,a2);
end;

:: MSAFREE:def 3
theorem
for b1 being set
for b2, b3 being ManySortedSet of b1 holds
   b3 = coprod b2
iff
   for b4 being set
         st b4 in b1
      holds b3 . b4 = coprod(b4,b2);

:: MSAFREE:funcreg 1
registration
  let a1 be non empty set;
  let a2 be non-empty ManySortedSet of a1;
  cluster disjoin a2 -> Relation-like non-empty Function-like;
end;

:: MSAFREE:funcreg 2
registration
  let a1 be non empty set;
  let a2 be non-empty ManySortedSet of a1;
  cluster Union a2 -> non empty;
end;

:: MSAFREE:th 2
theorem
for b1 being set
for b2 being ManySortedSet of b1
for b3 being set
      st b3 in b1
   holds    b2 . b3 <> {}
   iff
      (coprod b2) . b3 <> {};

:: MSAFREE:modenot 1 => MSAFREE:mode 1
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
  mode GeneratorSet of A2 -> ManySortedSubset of the Sorts of a2 means
    the Sorts of GenMSAlg it = the Sorts of a2;
end;

:: MSAFREE:dfs 4
definiens
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
  let a3 be ManySortedSubset of the Sorts of a2;
To prove
     a3 is GeneratorSet of a2
it is sufficient to prove
  thus the Sorts of GenMSAlg a3 = the Sorts of a2;

:: MSAFREE:def 4
theorem
for b1 being non empty non void ManySortedSign
for b2 being MSAlgebra over b1
for b3 being ManySortedSubset of the Sorts of b2 holds
      b3 is GeneratorSet of b2
   iff
      the Sorts of GenMSAlg b3 = the Sorts of b2;

:: MSAFREE:th 3
theorem
for b1 being non empty non void ManySortedSign
for b2 being strict non-empty MSAlgebra over b1
for b3 being ManySortedSubset of the Sorts of b2 holds
      b3 is GeneratorSet of b2
   iff
      GenMSAlg b3 = b2;

:: MSAFREE:attrnot 1 => MSAFREE:attr 1
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
  let a3 be GeneratorSet of a2;
  attr a3 is free means
    for b1 being non-empty MSAlgebra over a1
    for b2 being ManySortedFunction of a3,the Sorts of b1 holds
       ex b3 being ManySortedFunction of the Sorts of a2,the Sorts of b1 st
          b3 is_homomorphism a2,b1 & b3 || a3 = b2;
end;

:: MSAFREE:dfs 5
definiens
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
  let a3 be GeneratorSet of a2;
To prove
     a3 is free
it is sufficient to prove
  thus for b1 being non-empty MSAlgebra over a1
    for b2 being ManySortedFunction of a3,the Sorts of b1 holds
       ex b3 being ManySortedFunction of the Sorts of a2,the Sorts of b1 st
          b3 is_homomorphism a2,b1 & b3 || a3 = b2;

:: MSAFREE:def 5
theorem
for b1 being non empty non void ManySortedSign
for b2 being MSAlgebra over b1
for b3 being GeneratorSet of b2 holds
      b3 is free(b1, b2)
   iff
      for b4 being non-empty MSAlgebra over b1
      for b5 being ManySortedFunction of b3,the Sorts of b4 holds
         ex b6 being ManySortedFunction of the Sorts of b2,the Sorts of b4 st
            b6 is_homomorphism b2,b4 & b6 || b3 = b5;

:: MSAFREE:attrnot 2 => MSAFREE:attr 2
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
  attr a2 is free means
    ex b1 being GeneratorSet of a2 st
       b1 is free(a1, a2);
end;

:: MSAFREE:dfs 6
definiens
  let a1 be non empty non void ManySortedSign;
  let a2 be MSAlgebra over a1;
To prove
     a2 is free
it is sufficient to prove
  thus ex b1 being GeneratorSet of a2 st
       b1 is free(a1, a2);

:: MSAFREE:def 6
theorem
for b1 being non empty non void ManySortedSign
for b2 being MSAlgebra over b1 holds
      b2 is free(b1)
   iff
      ex b3 being GeneratorSet of b2 st
         b3 is free(b1, b2);

:: MSAFREE:th 4
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1 holds
   Union coprod b2 misses [:the OperSymbols of b1,{the carrier of b1}:];

:: MSAFREE:funcreg 3
registration
  let a1 be non void ManySortedSign;
  cluster the OperSymbols of a1 -> non empty;
end;

:: MSAFREE:funcnot 5 => MSAFREE:func 4
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be ManySortedSet of the carrier of a1;
  func REL A2 -> Relation of [:the OperSymbols of a1,{the carrier of a1}:] \/ Union coprod a2,([:the OperSymbols of a1,{the carrier of a1}:] \/ Union coprod a2) * means
    for b1 being Element of [:the OperSymbols of a1,{the carrier of a1}:] \/ Union coprod a2
    for b2 being Element of ([:the OperSymbols of a1,{the carrier of a1}:] \/ Union coprod a2) * holds
          [b1,b2] in it
       iff
          b1 in [:the OperSymbols of a1,{the carrier of a1}:] &
           (for b3 being Element of the OperSymbols of a1
                 st [b3,the carrier of a1] = b1
              holds len b2 = len the_arity_of b3 &
               (for b4 being set
                     st b4 in dom b2
                  holds (b2 . b4 in [:the OperSymbols of a1,{the carrier of a1}:] implies for b5 being Element of the OperSymbols of a1
                         st [b5,the carrier of a1] = b2 . b4
                      holds the_result_sort_of b5 = (the_arity_of b3) . b4) &
                   (b2 . b4 in Union coprod a2 implies b2 . b4 in coprod((the_arity_of b3) . b4,a2))));
end;

:: MSAFREE:def 9
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1
for b3 being Relation of [:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2,([:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2) * holds
      b3 = REL b2
   iff
      for b4 being Element of [:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2
      for b5 being Element of ([:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2) * holds
            [b4,b5] in b3
         iff
            b4 in [:the OperSymbols of b1,{the carrier of b1}:] &
             (for b6 being Element of the OperSymbols of b1
                   st [b6,the carrier of b1] = b4
                holds len b5 = len the_arity_of b6 &
                 (for b7 being set
                       st b7 in dom b5
                    holds (b5 . b7 in [:the OperSymbols of b1,{the carrier of b1}:] implies for b8 being Element of the OperSymbols of b1
                           st [b8,the carrier of b1] = b5 . b7
                        holds the_result_sort_of b8 = (the_arity_of b6) . b7) &
                     (b5 . b7 in Union coprod b2 implies b5 . b7 in coprod((the_arity_of b6) . b7,b2))));

:: MSAFREE:th 5
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1
for b4 being Element of ([:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2) * holds
      [[b3,the carrier of b1],b4] in REL b2
   iff
      len b4 = len the_arity_of b3 &
       (for b5 being set
             st b5 in dom b4
          holds (b4 . b5 in [:the OperSymbols of b1,{the carrier of b1}:] implies for b6 being Element of the OperSymbols of b1
                 st [b6,the carrier of b1] = b4 . b5
              holds the_result_sort_of b6 = (the_arity_of b3) . b5) &
           (b4 . b5 in Union coprod b2 implies b4 . b5 in coprod((the_arity_of b3) . b5,b2)));

:: MSAFREE:funcnot 6 => MSAFREE:func 5
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be ManySortedSet of the carrier of a1;
  func DTConMSA A2 -> DTConstrStr equals
    DTConstrStr(#[:the OperSymbols of a1,{the carrier of a1}:] \/ Union coprod a2,REL a2#);
end;

:: MSAFREE:def 10
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1 holds
   DTConMSA b2 = DTConstrStr(#[:the OperSymbols of b1,{the carrier of b1}:] \/ Union coprod b2,REL b2#);

:: MSAFREE:funcreg 4
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be ManySortedSet of the carrier of a1;
  cluster DTConMSA a2 -> non empty strict;
end;

:: MSAFREE:th 6
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1 holds
   NonTerminals DTConMSA b2 c= [:the OperSymbols of b1,{the carrier of b1}:] &
    Union coprod b2 c= Terminals DTConMSA b2 &
    (b2 is non-empty implies NonTerminals DTConMSA b2 = [:the OperSymbols of b1,{the carrier of b1}:] &
     Terminals DTConMSA b2 = Union coprod b2);

:: MSAFREE:funcreg 5
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  cluster DTConMSA a2 -> with_terminals with_nonterminals with_useful_nonterminals;
end;

:: MSAFREE:th 7
theorem
for b1 being non empty non void ManySortedSign
for b2 being ManySortedSet of the carrier of b1
for b3 being set holds
   (b3 in Terminals DTConMSA b2 & b2 is non-empty implies ex b4 being Element of the carrier of b1 st
       ex b5 being set st
          b5 in b2 . b4 & b3 = [b5,b4]) &
    (for b4 being Element of the carrier of b1
    for b5 being set
          st b5 in b2 . b4
       holds [b5,b4] in Terminals DTConMSA b2);

:: MSAFREE:funcnot 7 => MSAFREE:func 6
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the OperSymbols of a1;
  func Sym(A3,A2) -> Element of the carrier of DTConMSA a2 equals
    [a3,the carrier of a1];
end;

:: MSAFREE:def 11
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1 holds
   Sym(b3,b2) = [b3,the carrier of b1];

:: MSAFREE:funcnot 8 => MSAFREE:func 7
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of a1;
  func FreeSort(A2,A3) -> Element of bool TS DTConMSA a2 equals
    {b1 where b1 is Element of TS DTConMSA a2: (for b2 being set
          st b2 in a2 . a3
       holds b1 <> root-tree [b2,a3] implies ex b2 being Element of the OperSymbols of a1 st
       [b2,the carrier of a1] = b1 . {} &
        the_result_sort_of b2 = a3)};
end;

:: MSAFREE:def 12
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the carrier of b1 holds
   FreeSort(b2,b3) = {b4 where b4 is Element of TS DTConMSA b2: (for b5 being set
         st b5 in b2 . b3
      holds b4 <> root-tree [b5,b3] implies ex b5 being Element of the OperSymbols of b1 st
      [b5,the carrier of b1] = b4 . {} &
       the_result_sort_of b5 = b3)};

:: MSAFREE:funcreg 6
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of a1;
  cluster FreeSort(a2,a3) -> non empty;
end;

:: MSAFREE:funcnot 9 => MSAFREE:func 8
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  func FreeSort A2 -> ManySortedSet of the carrier of a1 means
    for b1 being Element of the carrier of a1 holds
       it . b1 = FreeSort(a2,b1);
end;

:: MSAFREE:def 13
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being ManySortedSet of the carrier of b1 holds
      b3 = FreeSort b2
   iff
      for b4 being Element of the carrier of b1 holds
         b3 . b4 = FreeSort(b2,b4);

:: MSAFREE:funcreg 7
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  cluster FreeSort a2 -> non-empty;
end;

:: MSAFREE:th 8
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1
for b4 being set
      st b4 in ((FreeSort b2) # * the Arity of b1) . b3
   holds b4 is FinSequence of TS DTConMSA b2;

:: MSAFREE:th 9
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1
for b4 being FinSequence of TS DTConMSA b2 holds
      b4 in ((FreeSort b2) # * the Arity of b1) . b3
   iff
      dom b4 = dom the_arity_of b3 &
       (for b5 being natural set
             st b5 in dom b4
          holds b4 . b5 in FreeSort(b2,(the_arity_of b3) /. b5));

:: MSAFREE:th 10
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1
for b4 being FinSequence of TS DTConMSA b2 holds
      Sym(b3,b2) ==> roots b4
   iff
      b4 in ((FreeSort b2) # * the Arity of b1) . b3;

:: MSAFREE:th 12
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   union proj2 FreeSort b2 = TS DTConMSA b2;

:: MSAFREE:th 13
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3, b4 being Element of the carrier of b1
      st b3 <> b4
   holds (FreeSort b2) . b3 misses (FreeSort b2) . b4;

:: MSAFREE:funcnot 10 => MSAFREE:func 9
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the OperSymbols of a1;
  func DenOp(A3,A2) -> Function-like quasi_total Relation of ((FreeSort a2) # * the Arity of a1) . a3,((FreeSort a2) * the ResultSort of a1) . a3 means
    for b1 being FinSequence of TS DTConMSA a2
          st Sym(a3,a2) ==> roots b1
       holds it . b1 = (Sym(a3,a2)) -tree b1;
end;

:: MSAFREE:def 14
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the OperSymbols of b1
for b4 being Function-like quasi_total Relation of ((FreeSort b2) # * the Arity of b1) . b3,((FreeSort b2) * the ResultSort of b1) . b3 holds
      b4 = DenOp(b3,b2)
   iff
      for b5 being FinSequence of TS DTConMSA b2
            st Sym(b3,b2) ==> roots b5
         holds b4 . b5 = (Sym(b3,b2)) -tree b5;

:: MSAFREE:funcnot 11 => MSAFREE:func 10
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  func FreeOper A2 -> ManySortedFunction of (FreeSort a2) # * the Arity of a1,(FreeSort a2) * the ResultSort of a1 means
    for b1 being Element of the OperSymbols of a1 holds
       it . b1 = DenOp(b1,a2);
end;

:: MSAFREE:def 15
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being ManySortedFunction of (FreeSort b2) # * the Arity of b1,(FreeSort b2) * the ResultSort of b1 holds
      b3 = FreeOper b2
   iff
      for b4 being Element of the OperSymbols of b1 holds
         b3 . b4 = DenOp(b4,b2);

:: MSAFREE:funcnot 12 => MSAFREE:func 11
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  func FreeMSA A2 -> MSAlgebra over a1 equals
    MSAlgebra(#FreeSort a2,FreeOper a2#);
end;

:: MSAFREE:def 16
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   FreeMSA b2 = MSAlgebra(#FreeSort b2,FreeOper b2#);

:: MSAFREE:funcreg 8
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  cluster FreeMSA a2 -> strict non-empty;
end;

:: MSAFREE:funcnot 13 => MSAFREE:func 12
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of a1;
  func FreeGen(A3,A2) -> Element of bool ((FreeSort a2) . a3) means
    for b1 being set holds
          b1 in it
       iff
          ex b2 being set st
             b2 in a2 . a3 & b1 = root-tree [b2,a3];
end;

:: MSAFREE:def 17
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the carrier of b1
for b4 being Element of bool ((FreeSort b2) . b3) holds
      b4 = FreeGen(b3,b2)
   iff
      for b5 being set holds
            b5 in b4
         iff
            ex b6 being set st
               b6 in b2 . b3 & b5 = root-tree [b6,b3];

:: MSAFREE:funcreg 9
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of a1;
  cluster FreeGen(a3,a2) -> non empty;
end;

:: MSAFREE:th 14
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the carrier of b1 holds
   FreeGen(b3,b2) = {root-tree b4 where b4 is Element of the carrier of DTConMSA b2: b4 in Terminals DTConMSA b2 & b4 `2 = b3};

:: MSAFREE:funcnot 14 => MSAFREE:func 13
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  func FreeGen A2 -> GeneratorSet of FreeMSA a2 means
    for b1 being Element of the carrier of a1 holds
       it . b1 = FreeGen(b1,a2);
end;

:: MSAFREE:def 18
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being GeneratorSet of FreeMSA b2 holds
      b3 = FreeGen b2
   iff
      for b4 being Element of the carrier of b1 holds
         b3 . b4 = FreeGen(b4,b2);

:: MSAFREE:th 15
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   FreeGen b2 is non-empty;

:: MSAFREE:th 16
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   union proj2 FreeGen b2 = {root-tree b3 where b3 is Element of the carrier of DTConMSA b2: b3 in Terminals DTConMSA b2};

:: MSAFREE:funcnot 15 => MSAFREE:func 14
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of a1;
  func Reverse(A3,A2) -> Function-like quasi_total Relation of FreeGen(a3,a2),a2 . a3 means
    for b1 being Element of the carrier of DTConMSA a2
          st root-tree b1 in FreeGen(a3,a2)
       holds it . root-tree b1 = b1 `1;
end;

:: MSAFREE:def 19
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the carrier of b1
for b4 being Function-like quasi_total Relation of FreeGen(b3,b2),b2 . b3 holds
      b4 = Reverse(b3,b2)
   iff
      for b5 being Element of the carrier of DTConMSA b2
            st root-tree b5 in FreeGen(b3,b2)
         holds b4 . root-tree b5 = b5 `1;

:: MSAFREE:funcnot 16 => MSAFREE:func 15
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  func Reverse A2 -> ManySortedFunction of FreeGen a2,a2 means
    for b1 being Element of the carrier of a1 holds
       it . b1 = Reverse(b1,a2);
end;

:: MSAFREE:def 20
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being ManySortedFunction of FreeGen b2,b2 holds
      b3 = Reverse b2
   iff
      for b4 being Element of the carrier of b1 holds
         b3 . b4 = Reverse(b4,b2);

:: MSAFREE:funcnot 17 => MSAFREE:func 16
definition
  let a1 be non empty non void ManySortedSign;
  let a2, a3 be non-empty ManySortedSet of the carrier of a1;
  let a4 be ManySortedFunction of FreeGen a2,a3;
  let a5 be Element of the carrier of DTConMSA a2;
  assume a5 in Terminals DTConMSA a2;
  func pi(A4,A3,A5) -> Element of Union a3 means
    for b1 being Relation-like Function-like set
          st b1 = a4 . (a5 `2)
       holds it = b1 . root-tree a5;
end;

:: MSAFREE:def 21
theorem
for b1 being non empty non void ManySortedSign
for b2, b3 being non-empty ManySortedSet of the carrier of b1
for b4 being ManySortedFunction of FreeGen b2,b3
for b5 being Element of the carrier of DTConMSA b2
   st b5 in Terminals DTConMSA b2
for b6 being Element of Union b3 holds
      b6 = pi(b4,b3,b5)
   iff
      for b7 being Relation-like Function-like set
            st b7 = b4 . (b5 `2)
         holds b6 = b7 . root-tree b5;

:: MSAFREE:funcnot 18 => MSAFREE:func 17
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty ManySortedSet of the carrier of a1;
  let a3 be Element of the carrier of DTConMSA a2;
  assume ex b1 being Relation-like Function-like FinSequence-like set st
       a3 ==> b1;
  func @(A2,A3) -> Element of the OperSymbols of a1 means
    [it,the carrier of a1] = a3;
end;

:: MSAFREE:def 22
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1
for b3 being Element of the carrier of DTConMSA b2
   st ex b4 being Relation-like Function-like FinSequence-like set st
        b3 ==> b4
for b4 being Element of the OperSymbols of b1 holds
      b4 = @(b2,b3)
   iff
      [b4,the carrier of b1] = b3;

:: MSAFREE:funcnot 19 => MSAFREE:func 18
definition
  let a1 be non empty non void ManySortedSign;
  let a2 be non-empty MSAlgebra over a1;
  let a3 be Element of the OperSymbols of a1;
  let a4 be Relation-like Function-like FinSequence-like set;
  assume a4 in Args(a3,a2);
  func pi(A3,A2,A4) -> Element of Union the Sorts of a2 equals
    (Den(a3,a2)) . a4;
end;

:: MSAFREE:def 23
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty MSAlgebra over b1
for b3 being Element of the OperSymbols of b1
for b4 being Relation-like Function-like FinSequence-like set
      st b4 in Args(b3,b2)
   holds pi(b3,b2,b4) = (Den(b3,b2)) . b4;

:: MSAFREE:th 17
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   FreeGen b2 is free(b1, FreeMSA b2);

:: MSAFREE:th 18
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty ManySortedSet of the carrier of b1 holds
   FreeMSA b2 is free(b1);

:: MSAFREE:exreg 1
registration
  let a1 be non empty non void ManySortedSign;
  cluster strict non-empty free MSAlgebra over a1;
end;

:: MSAFREE:exreg 2
registration
  let a1 be non empty non void ManySortedSign;
  let a2 be free MSAlgebra over a1;
  cluster Relation-like Function-like free GeneratorSet of a2;
end;

:: MSAFREE:th 19
theorem
for b1 being non empty non void ManySortedSign
for b2 being non-empty MSAlgebra over b1 holds
   ex b3 being strict non-empty free MSAlgebra over b1 st
      ex b4 being ManySortedFunction of the Sorts of b3,the Sorts of b2 st
         b4 is_epimorphism b3,b2;

:: MSAFREE:th 20
theorem
for b1 being non empty non void ManySortedSign
for b2 being strict non-empty MSAlgebra over b1 holds
   ex b3 being strict non-empty free MSAlgebra over b1 st
      ex b4 being ManySortedFunction of the Sorts of b3,the Sorts of b2 st
         b4 is_epimorphism b3,b2 & Image b4 = b2;