reserve i,j,m,n,k for Nat,
  x,y for set,
  K for Field,
  a,a1,a2 for Element of K,
  D for non empty set,
  d,d1,d2 for Element of D,
  M,M1,M2 for (Matrix of D),
  A,A1,A2,B1,B2 for (Matrix of K),
  f,g for FinSequence of NAT;
reserve F,F1,F2 for FinSequence_of_Matrix of D,
  G,G9,G1,G2 for FinSequence_of_Matrix of K;
reserve S,S1,S2 for FinSequence_of_Square-Matrix of D,
  R,R1,R2 for FinSequence_of_Square-Matrix of K;
reserve N for (Matrix of n,K),
  N1 for (Matrix of m,K);
reserve p,p1 for FinSequence of K;

theorem
  Width R1 = Len R2 implies block_diagonal(R1,0.K)*block_diagonal(R2,0.K
  )= block_diagonal(R1(#)R2,0.K)
proof
  defpred P[Nat] means for R1,R2 st Width R1=Len R2 & len R1=$1 holds
  block_diagonal(R1,0.K)*block_diagonal(R2,0.K)= block_diagonal(R1(#)R2,0.K);
  assume
A1: Width R1=Len R2;
A2: for n st P[n] holds P[n+1]
  proof
    let n such that
A3: P[n];
    set n1=n+1;
    let R1,R2 such that
A4: Width R1=Len R2 and
A5: len R1=n1;
A6: n1 in Seg n1 by FINSEQ_1:4;
    set R1n=R1|n;
A7: len R1n=n by A5,FINSEQ_1:59,NAT_1:11;
    set R2n=R2|n;
A8: len R1 = len Len R2 by A4,CARD_1:def 7
      .= len R2 by CARD_1:def 7;
    then
A9: len R2n=n by A5,FINSEQ_1:59,NAT_1:11;
    set b2n=block_diagonal(R2n,0.K);
    set b1n=block_diagonal(R1n,0.K);
A10: Width R1n = (Width R1) |n by Th21
      .= Len R2n by A4,Th17;
A11: dom Width R1=Seg n1 by A5,FINSEQ_2:124;
    then
A12: width (R1.n1) = (Len R2).n1 by A4,A6,Def4
      .= len (R2.n1) by A4,A6,A11,Def3;
A13: R1=(R1|n)^<*R1.n1*> by A5,FINSEQ_3:55;
A14: width b1n = Sum Width R1n by Def5
      .= len b2n by A10,Def5;
A15: R2=(R2|n)^<*R2.n1*> by A5,A8,FINSEQ_3:55;
    hence
    block_diagonal(R1,0.K)*block_diagonal(R2,0.K) = block_diagonal(<*b1n,
    R1.n1*>,0.K)*block_diagonal(R2n^<*R2.n1*>,0.K) by A13,Th35
      .= block_diagonal(<*b1n,R1.n1*>,0.K)*block_diagonal(<*b2n,R2.n1*>,0.K)
    by Th35
      .= block_diagonal((<*b1n,R1.n1*>)(#)(<*b2n,R2.n1*>),0.K) by A14,A12,Th78
      .= block_diagonal(<*b1n*b2n,R1.n1*R2.n1*>,0.K) by Th77
      .= block_diagonal(<*block_diagonal(R1n(#)R2n,0.K),R1.n1*R2.n1*>,0.K)
    by A3,A7,A10
      .= block_diagonal((R1n(#)R2n)^<*R1.n1*R2.n1*>,0.K) by Th35
      .= block_diagonal((R1n(#)R2n)^(<*R1.n1*>(#)<*R2.n1*>),0.K) by Th76
      .= block_diagonal(R1(#)R2,0.K) by A7,A9,A13,A15,Th74;
  end;
A16: P[0]
  proof
    let R1,R2 such that
A17: Width R1=Len R2 and
A18: len R1=0;
A19: Sum Width R1=0 by A18,RVSUM_1:72;
    set b2=block_diagonal(R2,0.K);
    Len R2 ={} by A17,A18;
    then
A20: len b2=0 by Def5,RVSUM_1:72;
    set b1=block_diagonal(R1,0.K);
A21: Sum Width R1=width b1 by Def5;
    set b12=block_diagonal(R1(#)R2,0.K);
A22: Len R1={} by A18;
    Len R1=Len(R1(#)R2) by A17,Th73;
    then len b12=0 by A22,Def5,RVSUM_1:72;
    then
A23: b12={};
    len b1=0 by A22,Def5,RVSUM_1:72;
    then len (b1*b2)=0 by A20,A21,A19,MATRIX_3:def 4;
    hence thesis by A23;
  end;
  for n holds P[n] from NAT_1:sch 2(A16,A2);
  hence thesis by A1;
end;
