reserve i, j, k, c, m, n for Nat,
  a, x, y, z, X, Y for set,
  D, E for non empty set,
  R for Relation,
  f, g for Function,
  p, q for FinSequence;
reserve f1, f2 for non empty homogeneous to-naturals NAT*-defined Function,
  e1, e2 for homogeneous to-naturals NAT*-defined Function,
  p for Element of (arity f1+1)-tuples_on NAT;
reserve P for primitive-recursively_closed non empty Subset of HFuncs NAT;

theorem
  [!].<*i*> = i!
proof
  defpred p[Nat] means [!].<*$1*> = $1!;
  deffunc c(Element of NAT,Element of NAT) = $2;
  deffunc a(Element of NAT,Element of NAT) = $1*$2;
  deffunc g(Element of NAT,Element of NAT) = $1;
  deffunc f(Element of NAT) = $1+1;
  set g = [*]*<:<*(1 succ 1)*<:<*2 proj 1*>:>, 2 proj 2*>:>;
  deffunc b(Element of NAT,Element of NAT) = f(g($1,$2));
A1: for i,j being Element of NAT holds (2 proj 1).<*i,j*> = g(i,j)
  proof
    let i,j be Element of NAT;
    reconsider ij = <*i,j*> as Element of 2-tuples_on NAT by FINSEQ_2:101;
    thus (2 proj 1).<*i,j*> = ij.1 by Th37
      .= i;
  end;
A2: for i being Element of NAT holds (1 succ 1).<*i*> = f(i)
  proof
    let i be Element of NAT;
   reconsider ij = <*i*> as Element of 1-tuples_on NAT by FINSEQ_2:131;
    thus (1 succ 1).<*i*> = ij.1+1 by Def7
      .= i+1;
  end;
  for i, j being Element of NAT holds ((1 succ 1)*<:<*2 proj 1*>:>).<*i,j
  *> = f(g(i,j)) from Primrec1(A2,A1);
  then
A3: for i, j being Element of NAT holds ((1 succ 1)*<:<*2 proj 1*>:>).<*i,j
  *> = b (i,j);
A4: for i, j being Element of NAT holds (2 proj 2).<*i,j*> = c(i,j)
  proof
    let i,j be Element of NAT;
    reconsider ij = <*i,j*> as Element of 2-tuples_on NAT by FINSEQ_2:101;
    thus (2 proj 2).<*i,j*> = ij.2 by Th37
      .= j;
  end;
A5: for i, j being Element of NAT holds [*].<*i,j*> = a(i,j) by Th85;
A6: for i, j being Element of NAT holds g.<*i,j*> = a(b(i,j),c(i,j)) from
  Primrec2(A5,A3,A4);
A7: arity (0 const 1) = 0;
A8: arity g = 2 by Def21;
A9: now
    let i be Nat;
     reconsider i1=i as Element of NAT by ORDINAL1:def 12;
    reconsider ie = i! as Element of NAT;
    assume p[i];
    then [!].<*i1+1*> = g.<*i1,ie*> by A8,A7,Th81
      .= (i1+1)*ie by A6
      .= (i+1)! by NEWTON:15;
    hence p[i+1];
  end;
  0-tuples_on NAT = {{}} by Th5;
  then
A10: {} in 0-tuples_on NAT by TARSKI:def 1;
  [!].<*0*> = (0 const 1).{} by A7,Th79
    .= 0! by A10,FUNCOP_1:7,NEWTON:12;
  then
A11: p[0];
  for i being Nat holds p[i] from NAT_1:sch 2(A11, A9);
  hence thesis;
end;
