reserve x,y for object,
        D,D1,D2 for non empty set,
        i,j,k,m,n for Nat,
        f,g for FinSequence of D*,
        f1 for FinSequence of D1*,
        f2 for FinSequence of D2*;

theorem
  rng (D-concatenation "**" f) = Values f
proof
  set DC=D-concatenation;
  defpred P[Nat] means for f be FinSequence of D* st len f=$1 holds
    rng (DC "**" f) = Values f;
  A1:P[0]
  proof
    let f be FinSequence of D* such that A2: len f=0;
    A3:f={} by A2;
    then DC "**" f={} by Lm1;
    then A4:rng (DC "**" f)={};
    assume rng (DC "**" f) <> Values f;
    then consider a be object such that
    A5: a in Values f by A4,XBOOLE_0:def 1;
    ex x,y be object st x in dom f & y in dom (f.x) & a = f.x.y
      by A5,Th1;
    hence thesis by A3;
  end;
  A6:P[i] implies P[i+1]
  proof
    assume A7:P[i];
    set i1=i+1;
    let f1 be FinSequence of D* such that A8: len f1=i1;
    consider f be FinSequence of D*, d be Element of D* such that
    A9:f1=f^<*d*> by FINSEQ_2:19,A8;
    len f+1 = len f1 by A9,FINSEQ_2:16;
    then A10:rng (DC"**"f) = Values f by A8,A7;
    DC "**"f1 = (DC"**"f)^(DC "**"<*d*>) by Th3,A9
             .= (DC"**"f)^d by FINSOP_1:11;
    then A11:rng (DC "**"f1) = (rng (DC"**"f)) \/ (rng d) by FINSEQ_1:31;
    A12:rngs <*d*> = <*rng d*> by FINSEQ_3:132;
    rng <*rng d*> = {rng d} by FINSEQ_1:38;
    then union rng <*rng d*> =rng d by ZFMISC_1:25;
    then Union rngs <*d*> = rng d by CARD_3:def 4,A12;
    then Values <*d*> = rng d by MATRIX_0:def 9;
    hence thesis by Th2,A9,A10,A11;
  end;
  A13:P[i] from NAT_1:sch 2(A1,A6);
  P[len f] by A13;
  hence thesis;
end;
