reserve
  a,b for object, I,J for set, f for Function, R for Relation,
  i,j,n for Nat, m for (Element of NAT),
  S for non empty non void ManySortedSign,
  s,s1,s2 for SortSymbol of S,
  o for OperSymbol of S,
  X for non-empty ManySortedSet of the carrier of S,
  x,x1,x2 for (Element of X.s), x11 for (Element of X.s1),
  T for all_vars_including inheriting_operations free_in_itself
  (X,S)-terms MSAlgebra over S,
  g for Translation of Free(S,X),s1,s2,
  h for Endomorphism of Free(S,X);
reserve
  r,r1,r2 for (Element of T),
  t,t1,t2 for (Element of Free(S,X));
reserve
  Y for infinite-yielding ManySortedSet of the carrier of S,
  y,y1 for (Element of Y.s), y11 for (Element of Y.s1),
  Q for all_vars_including inheriting_operations free_in_itself
  (Y,S)-terms MSAlgebra over S,
  q,q1 for (Element of Args(o,Free(S,Y))),
  u,u1,u2 for (Element of Q),
  v,v1,v2 for (Element of Free(S,Y)),
  Z for non-trivial ManySortedSet of the carrier of S,
  z,z1 for (Element of Z.s),
  l,l1 for (Element of Free(S,Z)),
  R for all_vars_including inheriting_operations free_in_itself
  (Z,S)-terms MSAlgebra over S,
  k,k1 for Element of Args(o,Free(S,Z));
reserve c,c1,c2 for set, d,d1 for DecoratedTree;
reserve
  w for (Element of Args(o,T)),
  p,p1 for Element of Args(o,Free(S,X));
reserve C for (context of x), C1 for (context of y), C9 for (context of z),
  C11 for (context of x11), C12 for (context of y11), D for context of s,X;
reserve
  S9 for sufficiently_rich non empty non void ManySortedSign,
  s9 for SortSymbol of S9,
  o9 for s9-dependent OperSymbol of S9,
  X9 for non-trivial ManySortedSet of the carrier of S9,
  x9 for (Element of X9.s9);
reserve h1 for x-constant Homomorphism of Free(S,X), T,
  h2 for y-constant Homomorphism of Free(S,Y), Q;

theorem
  T is struct-invariant implies for r being Element of T,s holds
  Hom(T,x1,x2).s.r = Hom(Free(S,X),x1,x2).s.r
  proof assume
AA: for o for p being Element of Args(o,T) st Den(o,T).p = Den(o,Free(S,X)).p
    for s,x1,x2 holds
    Den(o,T).(Hom(T,x1,x2)#p) = Den(o,Free(S,X)).(Hom(T,x1,x2)#p);
    set h = Hom(T,x1,x2);
    set g = Hom(Free(S,X),x1,x2);
    defpred P[Element of T] means
    h.(the_sort_of $1).$1 = g.(the_sort_of $1).$1;
A1: for s,x,r st r = x-term holds P[r]
    proof let s1,x11,r; assume
A2:   r = x11-term;
      then
A3:   the_sort_of r = the_sort_of @r = s1 by SORT,Lem00;
      per cases;
      suppose s = s1 & x11 = x1;
        then h.s1.r = x2-term & g.s1.r = x2-term by A2,HOM;
        hence thesis by A3;
      end;
      suppose s = s1 & x11 = x2;
        then h.s1.r = x1-term & g.s1.r = x1-term by A2,HOM;
        hence thesis by A3;
      end;
      suppose s <> s1 or x11 <> x1 & x11 <> x2;
        then h.s1.r = r & g.s1.r = r by A2,HOM;
        hence thesis by A3;
      end;
    end;
A4: for o,p,r st r = o-term p &
    for t being Element of T st t in rng p holds P[t]
    holds P[r]
    proof
      let o,p,r;
      assume Z0: r = o-term p;
      assume Z1: for t being Element of T st t in rng p holds P[t];
A6:   r = Den(o,Free(S,X)).p by Z0,MSAFREE4:13;
A7:   r in (the Sorts of T).the_sort_of r &
      the_sort_of r = the_sort_of @r = the_result_sort_of o
      by Z0,SORT,Lem00;
      then reconsider q = p as Element of Args(o,T) by A6,MSAFREE4:def 8;
      r = Den(o,T).q by A6,A7,MSAFREE4:def 8;
      then
A8:   Den(o,T).(Hom(T,x1,x2)#q) = Den(o,Free(S,X)).(Hom(T,x1,x2)#q)
      by AA,A6;
      g#p = h#q
      proof
B1:     dom (g#p) = dom the_arity_of o = dom (h#q) by MSUALG_3:6;
        hence len (g#p) = len (h#q) by FINSEQ_3:29;
        let i be Nat; assume
C0:     1 <= i <= len(g#p);
        then
C1:     i in dom(g#p) by FINSEQ_3:25;
C3:     dom p = dom the_arity_of o by MSUALG_6:2;
        then
C5:     q/.i = q.i in (the Sorts of T).((the_arity_of o)/.i)
        by C0,B1,PARTFUN1:def 6,FINSEQ_3:25,MSUALG_6:2;
        then
C4:     the_sort_of (q/.i) = (the_arity_of o)/.i & p.i in rng p
        by B1,C1,C3,SORT,FUNCT_1:def 3;
        thus ((g)#p).i = ((g).((the_arity_of o)/.i)).(q/.i)
        by C0,C3,C5,B1,FINSEQ_3:25,MSUALG_3:def 6
        .= ((h).((the_arity_of o)/.i)).(q/.i) by C4,C5,Z1
        .= ((h)#q).i by C0,C3,C5,B1,FINSEQ_3:25,MSUALG_3:def 6;
      end;
      then g.(the_result_sort_of o).r = Den(o,Free(S,X)).(h#q)
      by A6,MSUALG_6:def 2,MSUALG_3:def 7
      .= h.(the_result_sort_of o).(Den(o,T).q)
      by A8,MSUALG_6:def 2,MSUALG_3:def 7
      .= h.(the_result_sort_of o).r by A6,A7,MSAFREE4:def 8;
      hence P[r] by A7;
    end;
    let r be Element of T,s;
A9: P[r] from TermAlgebraInd(A1,A4);
    the_sort_of r = s by SORT;
    hence thesis by A9;
  end;
