reserve m,n for non zero Element of NAT;
reserve i,j,k for Element of NAT;
reserve Z for set;

theorem
for X be Subset of REAL m st X is open holds
 for i be Element of NAT, f,g be PartFunc of REAL m,REAL
  st f is_partial_differentiable_up_to_order i,X
   & g is_partial_differentiable_up_to_order i,X
 holds f(#)g is_partial_differentiable_up_to_order i,X
proof
   let Z be Subset of REAL m;
   assume A1: Z is open;
   defpred P[Nat] means
     for f,g be PartFunc of REAL m,REAL
       st f is_partial_differentiable_up_to_order $1,Z
        & g is_partial_differentiable_up_to_order $1,Z
     holds f(#)g is_partial_differentiable_up_to_order $1,Z;
A2:P[0]
   proof
    let f,g be PartFunc of REAL m,REAL;
    thus thesis;
   end;
A3:for k be Nat st P[k] holds P[k+1]
   proof
    let k be Nat;
    assume A4: P[k];
    let f,g be PartFunc of REAL m,REAL;
    assume A5: f is_partial_differentiable_up_to_order k+1,Z
              & g is_partial_differentiable_up_to_order k+1,Z; then
A6: f is_partial_differentiable_up_to_order k,Z
  & g is_partial_differentiable_up_to_order k,Z by Th84,NAT_1:11;
    now let I be non empty FinSequence of NAT;
     assume A7:len I <= k+1 & rng I c= Seg m; then
A8:f is_partial_differentiable_on Z,I
   & g is_partial_differentiable_on Z,I by A5;
A9:1 <= len I by FINSEQ_1:20; then
A10:  1 in dom I by FINSEQ_3:25; then
A11:  I/.1 = I.1 by PARTFUN1:def 6;
A12:  I.1 in rng I by A10,FUNCT_1:3; then
     I.1 in Seg m by A7; then
     reconsider i = I.1 as Element of NAT;
A13: 1 <= i & i <= m by A12,A7,FINSEQ_1:1;
     per cases;
     suppose 1 = len I; then
A14:   I = <*I.1*> by FINSEQ_5:14; then
      f is_partial_differentiable_on Z,i
    & g is_partial_differentiable_on Z,i by A8; then
      f(#)g is_partial_differentiable_on Z,i by A13,Th68,A1;
      hence f(#)g is_partial_differentiable_on Z,I by A14;
     end;
     suppose 1 <> len I; then
      1 < len I by A9,XXREAL_0:1; then
      1+1 <= len I by NAT_1:13; then
      1 <= len I - 1 by XREAL_1:19; then
      1 <= len (I/^1) by A9,RFINSEQ:def 1; then
      reconsider J = I/^1 as non empty FinSequence of NAT;
      set I1 = <*i*>;
      len I - 1 <= k by A7,XREAL_1:20; then
A15:  len J <= k by A9,RFINSEQ:def 1;
A16:   I = <*I/.1*>^(I/^1) by FINSEQ_5:29; then
A17:   rng I1 c= rng I & rng J c= rng I by A11,FINSEQ_1:29,30; then
A18:  rng J c= Seg m by A7;
      I = I1^J by A11,FINSEQ_5:29; then
A19:  f is_partial_differentiable_on Z,i
    & g is_partial_differentiable_on Z,i by A8,Th80; then
A20:  (f(#)g) is_partial_differentiable_on Z,i by A13,Th68,A1; then
A21:  (f(#)g) is_partial_differentiable_on Z,I1;
A22:  (f(#)g)`partial|(Z,I1) = (f(#)g)`partial|(Z,i) by A1,A13,Th82,A20
         .=(f`partial|(Z,i))(#)g + f(#)(g`partial|(Z,i))
               by A19,A13,Th68,A1
         .= f`partial|(Z,I1)(#)g + f(#)(g`partial|(Z,i)) by A1,A13,Th82,A19
         .= f`partial|(Z,I1)(#)g + f(#)(g`partial|(Z,I1)) by A1,A13,Th82,A19;
      len I1 =1 & rng I1 c= Seg m by A17,A7,FINSEQ_1:39; then
      f`partial|(Z,I1) is_partial_differentiable_up_to_order k,Z
    & g`partial|(Z,I1) is_partial_differentiable_up_to_order k,Z
           by Th83,A5; then
      f`partial|(Z,I1)(#)g is_partial_differentiable_up_to_order k,Z
    & f(#)(g`partial|(Z,I1)) is_partial_differentiable_up_to_order k,Z
           by A4,A6; then
      f`partial|(Z,I1)(#)g is_partial_differentiable_on Z,J
    & f(#)(g`partial|(Z,I1)) is_partial_differentiable_on Z,J
           by A15,A18; then
      f`partial|(Z,I1) (#)g + f(#)(g`partial|(Z,I1))
         is_partial_differentiable_on Z,J by A1,A18,Th75;
      hence (f(#)g) is_partial_differentiable_on Z,I
         by A21,A16,A11,A22,Th80;
     end;
    end;
    hence f(#)g is_partial_differentiable_up_to_order k+1,Z;
   end;
   for n be Nat holds P[ n ] from NAT_1:sch 2(A2,A3);
   hence thesis;
end;
