reserve Rseq, Rseq1, Rseq2 for Function of [:NAT,NAT:],REAL;
reserve rseq1,rseq2 for convergent Real_Sequence;
reserve n,m,N,M for Nat;
reserve e,r for Real;
reserve Pseq for P-convergent Function of [:NAT,NAT:],REAL;

theorem
multreal*(rseq1,rseq2) is convergent_in_cod1 convergent_in_cod2
& lim_in_cod1 (multreal*(rseq1,rseq2)) is convergent
& cod1_major_iterated_lim (multreal*(rseq1,rseq2)) = lim rseq1 * lim rseq2
& lim_in_cod2 (multreal*(rseq1,rseq2)) is convergent
& cod2_major_iterated_lim (multreal*(rseq1,rseq2)) = lim rseq1 * lim rseq2
& multreal*(rseq1,rseq2) is P-convergent
& P-lim (multreal*(rseq1,rseq2)) = lim rseq1 * lim rseq2
proof
   set Rseq = multreal*(rseq1,rseq2);
a2:for n,m holds Rseq.(n,m) = rseq1.n * rseq2.m
   proof
    let n,m;
a1: n in NAT & m in NAT by ORDINAL1:def 12;
    dom Rseq = [:NAT,NAT:] by FUNCT_2:def 1; then
    [n,m] in dom Rseq by a1,ZFMISC_1:def 2; then
    Rseq.(n,m) = multreal.(rseq1.n,rseq2.m) by FINSEQOP:77;
    hence Rseq.(n,m) = rseq1.n * rseq2.m by BINOP_2:def 11;
   end;
x1:for m be Element of NAT, e be Real st 0<e
    ex N st
     for n st n>=N holds |. ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .| < e
   proof
    let m be Element of NAT, e be Real;
    assume a3: 0<e;
    per cases;
    suppose rseq2.m <> 0; then
a4:  |.rseq2.m .| > 0 by COMPLEX1:47; then
     consider N such that
a5:   for n st n>=N holds |. rseq1.n - lim rseq1.| < e/ |. rseq2.m .|
        by a3,SEQ_2:def 7;
     take N;
     hereby let n;
      assume n>=N; then
a6:   |. rseq1.n - lim rseq1.| < e/ |. rseq2.m .| by a5;
      n is Element of NAT by ORDINAL1:def 12; then
      |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .|
       = |. Rseq.(n,m) - (lim rseq1)*rseq2.m .| by MESFUNC9:def 7
      .= |. rseq1.n * rseq2.m - (lim rseq1)*rseq2.m .| by a2
      .= |.(rseq1.n - lim rseq1)*rseq2.m .|
      .= |. rseq1.n - lim rseq1.| * |. rseq2.m .| by COMPLEX1:65; then
      |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .|
       < e/ |. rseq2.m .| * |. rseq2.m .| by a4,a6,XREAL_1:68;
      hence |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .| < e
        by a4,XCMPLX_1:87;
     end;
    end;
    suppose a7: rseq2.m = 0;
     take 0;
     hereby let n;
      assume n >= 0;
      n is Element of NAT by ORDINAL1:def 12; then
      |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .|
       = |. Rseq.(n,m) - (lim rseq1)*rseq2.m .| by MESFUNC9:def 7
      .= |. rseq1.n * rseq2.m - (lim rseq1)*rseq2.m .| by a2
      .= 0 by a7,COMPLEX1:44;
      hence |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .| < e by a3;
     end;
    end;
   end;
p1:for m be Element of NAT holds ProjMap2(Rseq,m) is convergent
   proof
    let m be Element of NAT;
    for e st 0<e
     ex N st for n st n>=N holds
       |.ProjMap2(Rseq,m).n - (lim rseq1)*rseq2.m .| < e by x1;
    hence ProjMap2(Rseq,m) is convergent by SEQ_2:def 6;
   end;
   hence Rseq is convergent_in_cod1;
x2:for m be Element of NAT, e be Real st 0<e
    ex N st for n st n>=N holds
      |. ProjMap1(Rseq,m).n - (rseq1.m)*(lim rseq2).| < e
   proof
    let m be Element of NAT, e be Real;
    assume a3: 0<e;
    per cases;
    suppose rseq1.m <> 0; then
a4:  |. rseq1.m .| > 0 by COMPLEX1:47; then
     consider N be Nat such that
a5:   for n be Nat st n>=N holds
       |. rseq2.n - lim rseq2.| < e/ |. rseq1.m .| by a3,SEQ_2:def 7;
     take N;
     hereby let n;
      assume n>=N; then
a6:   |. rseq2.n - lim rseq2.| < e/ |. rseq1.m .| by a5;
      n is Element of NAT by ORDINAL1:def 12; then
      |. ProjMap1(Rseq,m).n - (lim rseq2)*rseq1.m .|
       = |. Rseq.(m,n) - (lim rseq2)*rseq1.m .| by MESFUNC9:def 6
      .= |. rseq2.n * rseq1.m - (lim rseq2)*rseq1.m .| by a2
      .= |. (rseq2.n - lim rseq2)*rseq1.m .|
      .= |. rseq2.n - lim rseq2.| * |. rseq1.m .| by COMPLEX1:65; then
      |. ProjMap1(Rseq,m).n - (lim rseq2)*rseq1.m .|
       < e/ |. rseq1.m .| * |. rseq1.m .| by a4,a6,XREAL_1:68;
      hence |. ProjMap1(Rseq,m).n - (rseq1.m)*(lim rseq2).| < e
        by a4,XCMPLX_1:87;
     end;
    end;
    suppose a7: rseq1.m = 0;
     take 0;
     hereby let n;
      assume n >= 0;
      n is Element of NAT by ORDINAL1:def 12; then
      |. ProjMap1(Rseq,m).n - (lim rseq2)*rseq1.m .|
       = |. Rseq.(m,n) - (lim rseq2)*rseq1.m .| by MESFUNC9:def 6
      .= |. rseq2.n * rseq1.m - (lim rseq2)*rseq1.m .| by a2
      .= 0 by a7,COMPLEX1:44;
      hence |. ProjMap1(Rseq,m).n - (rseq1.m)*(lim rseq2).| < e by a3;
     end;
    end;
   end;
p2:for m be Element of NAT holds ProjMap1(Rseq,m) is convergent
   proof
    let m be Element of NAT;
    for e st 0<e ex N st for n st n>=N holds
       |.ProjMap1(Rseq,m).n - (rseq1.m)*(lim rseq2).| < e by x2;
    hence ProjMap1(Rseq,m) is convergent by SEQ_2:def 6;
   end;
   hence Rseq is convergent_in_cod2;
x3:for e st 0<e ex N st for n st n>=N holds
     |.(lim_in_cod1 Rseq).n - (lim rseq1)*(lim rseq2).| < e
   proof
    let e;
    assume a3: 0<e;
a6: for n holds (lim_in_cod1 Rseq).n = (lim rseq1)*(rseq2.n)
    proof
     let n;
     reconsider n1=n as Element of NAT by ORDINAL1:def 12;
a4:  ProjMap2(Rseq,n1) is convergent by p1;
a5:  (lim_in_cod1 Rseq).n = lim ProjMap2(Rseq,n1) by def32;
     for e st 0<e ex N st for m st m>=N holds
        |.ProjMap2(Rseq,n1).m - (lim rseq1)*rseq2.n .| < e by x1;
     hence (lim_in_cod1 Rseq).n = (lim rseq1)*(rseq2.n) by a5,a4,SEQ_2:def 7;
    end;
    per cases by COMPLEX1:46;
    suppose b1: |.lim rseq1.| > 0; then
     consider N such that
a7:   for n st n>=N holds |. rseq2.n - lim rseq2.| < e / |.lim rseq1.|
        by a3,SEQ_2:def 7;
     take N;
     hereby let n;
      assume n>=N; then
a8:   |. rseq2.n - lim rseq2.| < e / |.lim rseq1.| by a7;
      |.(lim_in_cod1 Rseq).n - (lim rseq1)*(lim rseq2).|
       = |.(lim rseq1)*(rseq2.n) - (lim rseq1)*(lim rseq2).| by a6
      .= |.(lim rseq1)*(rseq2.n - lim rseq2).|
      .= |.lim rseq1.| * |. rseq2.n - lim rseq2.| by COMPLEX1:65;
      hence |.(lim_in_cod1 Rseq).n - (lim rseq1)*(lim rseq2).| < e
        by a8,b1,XREAL_1:79;
     end;
    end;
    suppose a9: |.lim rseq1.| = 0;
     take 0;
     hereby let n;
      assume n >= 0;
      |.(lim_in_cod1 Rseq).n - (lim rseq1)*(lim rseq2).|
       = |.(lim rseq1)*(rseq2.n) - (lim rseq1)*(lim rseq2).| by a6
      .= |.(lim rseq1)*(rseq2.n - lim rseq2).|
      .= |.lim rseq1.| * |. rseq2.n - lim rseq2.| by COMPLEX1:65
      .= 0 by a9;
      hence |.(lim_in_cod1 Rseq).n - (lim rseq1)*(lim rseq2).| < e by a3;
     end;
    end;
   end;
   hence lim_in_cod1 Rseq is convergent by SEQ_2:def 6;
   hence cod1_major_iterated_lim Rseq = lim rseq1 * lim rseq2 by x3,def34;
x4:for e st 0<e ex N st for n st n>=N holds
     |.(lim_in_cod2 Rseq).n - (lim rseq1)*(lim rseq2).| < e
   proof
    let e;
    assume a3: 0<e;
a6: for n holds (lim_in_cod2 Rseq).n = (rseq1.n)*(lim rseq2)
    proof
     let n;
     reconsider n1=n as Element of NAT by ORDINAL1:def 12;
a4:  ProjMap1(Rseq,n1) is convergent by p2;
a5:  (lim_in_cod2 Rseq).n = lim ProjMap1(Rseq,n1) by def33;
     for e st 0<e ex N st for m st m>=N holds
        |.ProjMap1(Rseq,n1).m - (rseq1.n)*(lim rseq2).| < e by x2;
     hence (lim_in_cod2 Rseq).n = (rseq1.n)*(lim rseq2) by a5,a4,SEQ_2:def 7;
    end;
    per cases by COMPLEX1:46;
    suppose b1: |.lim rseq2.| > 0; then
     consider N such that
a7:   for n st n>=N holds |. rseq1.n - lim rseq1.| < e / |.lim rseq2.|
        by a3,SEQ_2:def 7;
     take N;
     hereby let n;
      assume n>=N; then
a8:   |. rseq1.n - lim rseq1.| < e / |.lim rseq2.| by a7;
      |.(lim_in_cod2 Rseq).n - (lim rseq1)*(lim rseq2).|
       = |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| by a6
      .= |.(rseq1.n - lim rseq1)*(lim rseq2).|
      .= |.lim rseq2.| * |. rseq1.n - lim rseq1.| by COMPLEX1:65;
      hence |.(lim_in_cod2 Rseq).n - (lim rseq1)*(lim rseq2).| < e
        by a8,b1,XREAL_1:79;
     end;
    end;
    suppose a9: |.lim rseq2.| = 0;
     take 0;
     hereby let n;
      assume n >= 0;
      |.(lim_in_cod2 Rseq).n - (lim rseq1)*(lim rseq2).|
       = |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| by a6
      .= |.(lim rseq2)*(rseq1.n - lim rseq1).|
      .= |.lim rseq2.| * |. rseq1.n - lim rseq1.| by COMPLEX1:65
      .= 0 by a9;
      hence |.(lim_in_cod2 Rseq).n - (lim rseq1)*(lim rseq2).| < e by a3;
     end;
    end;
   end;
   hence lim_in_cod2 Rseq is convergent by SEQ_2:def 6;
   hence cod2_major_iterated_lim Rseq = lim rseq1 * lim rseq2
     by x4,def35;
x5:for e st 0<e ex N st for n,m st n>=N & m>=N holds
      |. Rseq.(n,m) - (lim rseq1)*(lim rseq2).| < e
   proof
    let e;
    assume c1: 0<e;
    consider K be Real such that
c2:  0 < K & for n holds |. rseq1.n .| < K by SEQ_2:3;
    set b = max(K,|.lim rseq2.|);
c10:b >= K & b >= |.lim rseq2.| by XXREAL_0:25; then
    consider N1 be Nat such that
c4:  for n st n>=N1 holds |. rseq1.n - lim rseq1.| < e/(2*b)
       by c1,c2,SEQ_2:def 7;
    consider N2 be Nat such that
c5:  for n st n>=N2 holds |. rseq2.n - lim rseq2.| < e/(2*b)
       by c1,c2,c10,SEQ_2:def 7;
    reconsider N = max(N1,N2) as Nat by TARSKI:1;
    take N;
    thus for n,m st n>=N & m>=N holds
     |. Rseq.(n,m)  - (lim rseq1)*(lim rseq2).| < e
    proof
     let n,m;
     assume c13: n >= N & m >= N;
     max(N1,N2) >= N1 & max(N1,N2) >= N2 by XXREAL_0:25; then
c6:  n >= N1 & m >= N2 by c13,XXREAL_0:2;
c7:  |. Rseq.(n,m) - (lim rseq1)*(lim rseq2).|
      <= |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).|
       + |. (rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| by COMPLEX1:63;
c11: |. rseq1.n - lim rseq1.| >= 0 & |. rseq2.m - lim rseq2.| >= 0
       by COMPLEX1:46;
c12: |. rseq1.n .| < b & |.lim rseq2.| <= b by c2,c10,XXREAL_0:2;
     |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).|
      = |.(rseq1.n)*(rseq2.m) - (rseq1.n)*(lim rseq2).| by a2
     .= |.(rseq1.n)*(rseq2.m - lim rseq2).|
     .= |. rseq1.n .| * |. rseq2.m - lim rseq2.| by COMPLEX1:65; then
c8:  |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).|
      <= b * |. rseq2.m - lim rseq2.| by c11,c12,XREAL_1:64;
     |. rseq2.m - lim rseq2.| < e/(2*b) by c5,c6; then
     b * |. rseq2.m - lim rseq2.| < b * (e/(2*b)) by c2,c10,XREAL_1:68; then
     |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).| < b * (e/(2*b))
       by c8,XXREAL_0:2; then
     |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).| < e/(2*b/b) by XCMPLX_1:81; then
c15: |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).| < e/2 by c2,c10,XCMPLX_1:89;
     |. (rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).|
      = |.(lim rseq2)*(rseq1.n - lim rseq1).|
     .= |.lim rseq2.| * |. rseq1.n - lim rseq1.| by COMPLEX1:65; then
c9:  |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).|
      <= b * |. rseq1.n - lim rseq1.| by c11,XXREAL_0:25,XREAL_1:64;
     |. rseq1.n - lim rseq1.| < e/(2*b) by c4,c6; then
     b * |. rseq1.n - lim rseq1.| < b * (e/(2*b)) by c2,c10,XREAL_1:68; then
     |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| < b * (e/(2*b))
       by c9,XXREAL_0:2; then
     |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| < e/(2*b/b)
       by XCMPLX_1:81; then
     |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| < e/2
       by c2,c10,XCMPLX_1:89; then
     |. Rseq.(n,m) - (rseq1.n)*(lim rseq2).|
   + |.(rseq1.n)*(lim rseq2) - (lim rseq1)*(lim rseq2).| < e/2 + e/2
       by c15,XREAL_1:8;
     hence |. Rseq.(n,m) - (lim rseq1)*(lim rseq2).| < e by c7,XXREAL_0:2;
    end;
   end;
   hence Rseq is P-convergent;
   hence P-lim Rseq = lim rseq1 * lim rseq2 by x5,def6;
end;
