reserve i for Nat,
  j for Element of NAT,
  X,Y,x,y,z for set;
reserve C for initialized ConstructorSignature,
  s for SortSymbol of C,
  o for OperSymbol of C,
  c for constructor OperSymbol of C;
reserve a,b for expression of C, an_Adj C;
reserve t, t1,t2 for expression of C, a_Type C;
reserve p for FinSequence of QuasiTerms C;
reserve e for expression of C;
reserve a,a9 for expression of C, an_Adj C;
reserve q for pure expression of C, a_Type C,
  A for finite Subset of QuasiAdjs C;
reserve T for quasi-type of C;
reserve f for valuation of C;
reserve x for variable;

theorem
  for f,g being irrelevant one-to-one valuation of C
  st for x,y being variable holds
  x in dom f & f.x = y-term C implies y in dom g & g.y = x-term C
  for e st variables_in e c= dom f
  holds e at f at g = e
proof
  let f,g be irrelevant one-to-one valuation of C such that
A1: for x,y being variable holds
  x in dom f & f.x = y-term C implies y in dom g & g.y = x-term C;
  let t be expression of C;
  defpred P[expression of C] means
  variables_in $1 c= dom f implies $1 at f at g = $1;
A2: for x being variable holds P[x-term C]
  proof
    let x be variable;
    assume variables_in (x-term C) c= dom f;
    then {x} c= dom f by MSAFREE3:10;
    then
A3: x in dom f by ZFMISC_1:31;
    then consider y being variable such that
A4: f.x = y-term C by Def58;
A5: y in dom g by A1,A3,A4;
A6: g.y = x-term C by A1,A3,A4;
    (x-term C) at f = y-term C by A3,A4,Def60;
    hence thesis by A5,A6,Def60;
  end;
A7: for c being constructor OperSymbol of C
  for p being FinSequence of QuasiTerms C
  st len p = len the_arity_of c &
  for t being quasi-term of C st t in rng p holds P[t]
  holds P[c-trm p]
  proof
    let c be constructor OperSymbol of C;
    let p be FinSequence of QuasiTerms C such that
A8: len p = len the_arity_of c and
A9: for t being quasi-term of C st t in rng p holds P[t] and
A10: variables_in (c-trm p) c= dom f;
    c-trm p = [c, the carrier of C]-tree p by A8,Def35;
    then
A11: variables_in (c-trm p) = union {variables_in s where
    s is quasi-term of C: s in rng p} by Th88;
A12: len (p at f) = len p by Th130;
A13: len (p at f at g) = len (p at f) by Th130;
A14: dom (p at f) = dom p by A12,FINSEQ_3:29;
A15: dom (p at f at g) = dom (p at f) by A13,FINSEQ_3:29;
    now
      let i be Nat;
      assume
A16:  i in dom p;
      then
A17:  (p at f).i = f# .(p.i) by FUNCT_1:13;
A18:  p.i in rng p by A16,FUNCT_1:def 3;
      rng p c= QuasiTerms C by FINSEQ_1:def 4;
      then reconsider pi1 = p.i as quasi-term of C by A18,Th41;
      variables_in pi1 in {variables_in s where s is quasi-term of C:
      s in rng p} by A18;
      then
A19:  variables_in pi1 c= variables_in (c-trm p) by A11,ZFMISC_1:74;
      (p at f at g).i = pi1 at f at g by A14,A16,A17,FUNCT_1:13;
      hence (p at f at g).i = p.i by A9,A10,A18,A19,XBOOLE_1:1;
    end;
    then
A20: p at f at g = p by A14,A15;
    (c-trm p) at f = c-trm (p at f) by A8,Def60;
    hence thesis by A8,A12,A20,Def60;
  end;
A21: for a being expression of C, an_Adj C st P[a] holds P[(non_op C)term a]
  proof
    let a be expression of C, an_Adj C such that
A22: P[a] and
A23: variables_in ((non_op C)term a) c= dom f;
A24: (non_op C)term a = [non_op, the carrier of C]-tree <*a*> by Th43;
    thus ((non_op C)term a) at f at g = ((non_op C)term (a at f)) at g by Def60
      .= (non_op C)term a by A22,A23,A24,Def60,Th93;
  end;
A25: for a being expression of C, an_Adj C st P[a]
  for t being expression of C, a_Type C st P[t]
  holds P[(ast C)term(a,t)]
  proof
    let a be expression of C, an_Adj C such that
A26: P[a];
    let t be expression of C, a_Type C such that
A27: P[t] and
A28: variables_in ((ast C)term(a,t)) c= dom f;
    (ast C)term(a,t) = [ *, the carrier of C]-tree <*a,t*> by Th46;
    then
A29: variables_in ((ast C)term(a,t))
    = ((C variables_in a)(\/)(C variables_in t)).a_Term by Th96
      .= (variables_in a)\/variables_in t by PBOOLE:def 4;
    thus ((ast C)term(a,t)) at f at g
    = ((ast C)term (a at f, t at f)) at g by Def60
      .= (ast C)term(a,t) by A26,A27,A28,A29,Def60,XBOOLE_1:11;
  end;
  thus P[t] from StructInd(A2,A7,A21,A25);
end;
