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 Th149:
  for f1,f2 being valuation of C holds (e at f1) at f2 = e at (f1 at f2)
proof
  set t = e;
  let f1,f2 be valuation of C;
A1: dom (f1 at f2) = (dom f1) \/ dom f2 by Def66;
  defpred P[expression of C] means ($1 at f1) at f2 = $1 at (f1 at f2);
A2: for x being variable holds P[x-term C]
  proof
    let x be variable;
    per cases;
    suppose
A3:   x in dom (f1 at f2);
      then (x-term C) at (f1 at f2) = (f1 at f2).x by Def60;
      hence thesis by A3,Def66;
    end;
    suppose
A4:   x nin dom (f1 at f2);
      then
A5:   x nin dom f1 by A1,XBOOLE_0:def 3;
A6:   x nin dom f2 by A1,A4,XBOOLE_0:def 3;
A7:   (x-term C) at f1 = x-term C by A5,Def60;
      (x-term C) at f2 = x-term C by A6,Def60;
      hence thesis by A4,A7,Def60;
    end;
  end;
A8: 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
A9: len p = len the_arity_of c and
A10: for t being quasi-term of C st t in rng p holds P[t];
A11: len (p at f1) = len p by Th130;
A12: len (p at (f1 at f2)) = len p by Th130;
A13: len ((p at f1) at f2) = len (p at f1) by Th130;
A14: dom (p at f1) = dom p by A11,FINSEQ_3:29;
A15: dom (p at (f1 at f2)) = dom p by A12,FINSEQ_3:29;
A16: dom ((p at f1) at f2) = dom p by A11,A13,FINSEQ_3:29;
    now
      let i be Nat;
      assume
A17:  i in dom p;
      then
A18:  ((p at f1) at f2).i = f2# .((p at f1).i) by A14,FUNCT_1:13;
A19:  p.i in rng p by A17,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 A19,Th41;
      thus (p at f1 at f2).i = (pi1 at f1) at f2 by A17,A18,FUNCT_1:13
        .= pi1 at (f1 at f2) by A10,A19
        .= (p at (f1 at f2)).i by A17,FUNCT_1:13;
    end;
    then
A20: p at f1 at f2 = p at (f1 at f2) by A15,A16;
    thus (c-trm p) at f1 at f2 = (c-trm(p at f1)) at f2 by A9,Def60
      .= c-trm (p at (f1 at f2)) by A9,A11,A20,Def60
      .= (c-trm p) at (f1 at f2) by A9,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;
    assume P[a];
    then
    ((non_op C)term (a at f1)) at f2 = (non_op C)term (a at (f1 at f2))
    by Def60
      .= ((non_op C)term a) at (f1 at f2) by Def60;
    hence thesis by Def60;
  end;
A22: 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
A23: P[a];
    let t be expression of C, a_Type C;
    assume P[t];
    then ((ast C)term (a at f1,t at f1)) at f2
    = (ast C)term (a at (f1 at f2),t at (f1 at f2)) by A23,Def60
      .= ((ast C)term(a,t)) at (f1 at f2) by Def60;
    hence thesis by Def60;
  end;
  thus P[t] from StructInd(A2,A8,A21,A22);
end;
