
theorem Th28:
  for m,n be non zero Nat
  for f be PartFunc of REAL m,REAL n
  for x be Element of REAL m
   st f is_differentiable_in x
  holds diff(f,x) = Mx2Tran(Jacobian(f,x))
proof
  let m,n be non zero Nat;
  let f be PartFunc of REAL m,REAL n;
  let x be Element of REAL m;

  assume
  A1: f is_differentiable_in x;

  set M = Jacobian(f,x);

  A2: the carrier of TOP-REAL n = REAL n
    & the carrier of TOP-REAL m = REAL m by EUCLID:22;

  for dx be Element of REAL m
  holds diff(f,x).dx = (Mx2Tran(Jacobian(f,x))).dx
  proof
    let dx be Element of REAL m;

    reconsider fdx = diff(f,x).dx as Element of REAL n;
    reconsider Mdx = (Mx2Tran(Jacobian(f,x))).dx
      as Element of REAL n by A2,FUNCT_2:5;

    A3: len fdx = n by CARD_1:def 7;
    A4: len Mdx = n by CARD_1:def 7;

    for j be Nat st 1 <= j <= len fdx
    holds fdx.j = Mdx.j
    proof
      let j be Nat;

      assume
      A5: 1 <= j <= len fdx; then

      consider fj be PartFunc of REAL m,REAL such that
      A6: fj = proj(j,n) * f
        & fj is_differentiable_in x by A1,A3,Th19;

      consider dy be FinSequence of REAL such that
      A7: dom dy = Seg m
      & ( for i be Nat st 1 <= i <= m
          holds dy.i = proj(i,m).dx * partdiff(fj,x,i) )
      & diff(fj,x).dx = Sum dy by A6,Th26;

      A8: j in Seg n by A3,A5;

      A9: for i be Nat st i in Seg m
          holds M * (i,j) = partdiff(fj,x,i)
      proof
        let i be Nat;
        assume i in Seg m;
        hence M * (i,j)
          = partdiff(f,x,i,j) by A8,Def1
        .= partdiff(fj,x,i) by A6;
      end;

      A10: for i be Nat st 1 <= i <= m
            holds dy.i = proj(i,m).dx * (M * (i,j))
      proof
        let i be Nat;
        assume
        A11: 1 <= i <= m; then
        A12: i in Seg m;
        thus dy.i
          = proj(i,m).dx * partdiff(fj,x,i) by A7,A11
        .= proj(i,m).dx * (M * (i,j)) by A9,A12;
      end;

      set dxM = LineVec2Mx(@ dx) * M;
      A13: len M = m & width M = n
          & Indices M = [:Seg m, Seg n:] by MATRIX_0:23;

      A14: LineVec2Mx @dx = <* @dx *>
          & LineVec2Mx @dx is Matrix of 1, len(@dx), F_Real
          by MATRIX15:def 1;

      A15: len(@dx)
        = len dx by MATRTOP1:def 1
      .= m by CARD_1:def 7;

      then
      A16: len(LineVec2Mx @dx) = 1
          & width(LineVec2Mx @dx) = m
          & Indices(LineVec2Mx @dx) = [:Seg 1, Seg m:] by MATRIX_0:23;
      then
      A17: len dxM = len(LineVec2Mx @dx)
          & width dxM = width M
          & for i, j be Nat st [i,j] in Indices dxM
            holds dxM * (i,j) = Line(LineVec2Mx(@ dx),i) "*" (Col(M,j))
            by A13,MATRIX_3:def 4;

      A18: Mdx = Line(dxM,1) by MATRTOP1:def 3;
      A19: j in Seg(width dxM) by A3,A5,A13,A17;
      then
      A20: Mdx.j = dxM * (1,j) by A18,MATRIX_0:def 7;

      len dxM = 1 by A16,MATRIX_3:def 4,A13;
      then dom dxM = Seg 1 by FINSEQ_1:def 3;
      then 1 in dom dxM; then
      [1,j] in Indices dxM by A19,ZFMISC_1:87; then

      A22: Mdx.j = Line(LineVec2Mx(@ dx),1) "*" (Col(M,j))
        by A13,A16,A20,MATRIX_3:def 4;

      set u = mlt(Line(LineVec2Mx(@ dx),1), Col(M,j));

      len(Line(LineVec2Mx(@ dx),1))
        = width(LineVec2Mx(@ dx)) by MATRIX_0:def 7
      .= m by A15,MATRIX_0:23;

      then reconsider a = Line(LineVec2Mx(@ dx),1) as
        Element of m -tuples_on the carrier of F_Real by FINSEQ_2:92;

      len(Col(M,j))
        = len M by MATRIX_0:def 8
      .= m by MATRIX_0:23;

      then reconsider b = Col(M,j) as
        Element of m -tuples_on the carrier of F_Real by FINSEQ_2:92;

      u = mlt(a,b);
      then u in { s where s is Element of (the carrier of F_Real) *
        : len s = m };
      then
      A23: ex u0 be Element of (the carrier of F_Real)*
            st u0 = u & len u0 = m;

      m is Element of NAT by ORDINAL1:def 12;
      then
      A24: len dy = m by A7,FINSEQ_1:def 3;
      A25: for i be Nat st 1 <= i <= len dy holds dy.i = u.i
      proof
        let i be Nat;
        assume
        A26: 1 <= i <= len dy; then
        A27: i in Seg m by A24;
        reconsider s = proj(i,m).dx as Element of F_Real;
        reconsider t = M * (i,j) as Element of F_Real;
        1 in Seg 1;
        then [1,i] in Indices(LineVec2Mx(@ dx)) by A16,A27,ZFMISC_1:87;
        then
        A28: ex p be FinSequence of (the carrier of F_Real)
              st p = (LineVec2Mx(@ dx)).1
              & LineVec2Mx(@ dx) * (1,i) = p.i by MATRIX_0:def 5;
        (LineVec2Mx(@ dx)).1 = @dx by A14
        .= dx by MATRTOP1:def 1; then

        a.i = dx.i by A16,A27,A28,MATRIX_0:def 7;
        then
        A30: a.i = proj(i,m).dx by PDIFF_1:def 1;

        i in dom M by A13,A27,FINSEQ_1:def 3; then
        b.i = M * (i,j) by MATRIX_0:def 8; then

        u.i = s*t by A27,A30,FVSUM_1:61
        .= (proj(i,m).dx) * (M * (i,j));
        hence thesis by A10,A24,A26;
      end;
      A33: dom(diff(f,x)) = REAL m by FUNCT_2:def 1;

      diff(fj,x).dx
        = (proj(j,n) * diff(f,x)).dx by A1,A3,A5,A6,Th20
      .= proj(j,n).(diff(f,x).dx) by A33,FUNCT_1:13
      .= fdx.j by PDIFF_1:def 1;
      hence thesis by A7,A22,A23,A24,A25,FINSEQ_1:14;
    end;
    hence thesis by A4,FINSEQ_1:14,CARD_1:def 7;
  end;
  hence diff(f,x) = Mx2Tran(Jacobian(f,x)) by EUCLID:22;
end;
