reserve X,Y,Z,x,y,y1,y2 for set,
  D for non empty set,
  k,n,n1,n2,m2,m1 for Nat,

  L,K,M,N for Cardinal,
  f,g for Function;
reserve r for Real;
reserve p,q for FinSequence,
  k,m,n,n1,n2,n3 for Nat;

theorem
  D is countable implies D* is countable
proof
  defpred P[object,object] means ex n st $1 = n & $2 = n-tuples_on D;
A1: for x being object st x in NAT ex y being object st P[x,y]
  proof
    let x be object;
    assume x in NAT;
    then reconsider n = x as Element of NAT;
    reconsider y = n-tuples_on D as set;
    take y,n;
    thus thesis;
  end;
  consider f such that
A2: dom f = NAT &
for x being object st x in NAT holds P[x,f.x] from CLASSES1:sch 1(
  A1);
A3: D* = union the set of all  k-tuples_on D  by FINSEQ_2:108;
A4: Union f = D*
  proof
    thus Union f c= D*
    proof
      let x be object;
      assume x in Union f;
      then consider X such that
A5:   x in X and
A6:   X in rng f by TARSKI:def 4;
      consider y being object such that
A7:   y in dom f and
A8:   X = f.y by A6,FUNCT_1:def 3;
      reconsider y as Element of NAT by A2,A7;
      ex n st y = n & X = n-tuples_on D by A2,A8;
      then X in the set of all  k-tuples_on D ;
      hence thesis by A3,A5,TARSKI:def 4;
    end;
    let x be object;
    assume x in D*;
    then consider X such that
A9: x in X & X in the set of all  k-tuples_on D  by A3,TARSKI:def 4;
    consider n such that
A10: X = n-tuples_on D by A9;
A11: n in NAT by ORDINAL1:def 12;
    then ex k st n = k & f.n = k-tuples_on D by A2;
    then X in rng f by A2,A10,FUNCT_1:def 3,A11;
    hence thesis by A9,TARSKI:def 4;
  end;
  assume
A12: D is countable;
  now
    let x;
    assume x in dom f;
    then ex n st x = n & f.x = n-tuples_on D by A2;
    hence f.x is countable by A12,Th10;
  end;
  hence thesis by A2,A4,Th11;
end;
