reserve A for preIfWhileAlgebra;
reserve A for Euclidean preIfWhileAlgebra;
reserve X for non empty countable set;
reserve T for Subset of Funcs(X, INT);
reserve f for Euclidean ExecutionFunction of A, Funcs(X, INT), T;
reserve A for Euclidean preIfWhileAlgebra,
  X for non empty countable set,
   z for (Element of X),
  s,s9 for (Element of Funcs(X, INT)),
  T for Subset of Funcs(X, INT),
  f for Euclidean ExecutionFunction of A, Funcs(X, INT), T,
  v for INT-Variable of A,f,
  t for INT-Expression of A,f;
reserve i for Integer;
reserve b for (Element of X),
  g for Euclidean ExecutionFunction of A, Funcs(X, INT), Funcs(X, INT)\(b,0);

theorem
  for n,s,i being Variable of g st ex d being Function st d.n = 1 & d.s
  = 2 & d.i = 3 & d.b = 4 for q being Element of Funcs(X, INT) for N being
Nat st N = q.n holds g.(q, s:=1\;for-do(i:=2, i leq n, i+=1, s*=i)).
  s = N!
proof
  set f = g;
  let n,s,i be Variable of f;
  given d being Function such that
A1: d.n = 1 and
A2: d.s = 2 and
A3: d.i = 3 and
A4: d.b = 4;
A5: n <> i & n <> b & i <> b by A1,A3,A4;
  set S = Funcs(X,INT);
  let q be Element of Funcs(X, INT);
  reconsider q1 = f.(q, s:=1) as Element of S;
  defpred P[Element of S] means
    ex K being Nat st K = $1.i-1 & $1.s = K!;
  reconsider a = .(2,A,f) as INT-Expression of A,g;
  reconsider q2 = f.(q1, i:=2) as Element of S;
A6: q2.i = 2 by Th25;
A7: s <> i by A2,A3;
  then q2.s = q1.s by Th25;
  then
A8: P[f.(q1,i:=a)] by A6,Th25,NEWTON:13;
  set I = s*=i;
A10: s <> b by A2,A4;
A11: for q being Element of Funcs(X,INT) st P[q] holds P[f.(q,I\;i+=1)] & P[
  f.(q, i leq n)]
  proof
    let q be Element of Funcs(X,INT);
    given Ki being Nat such that
A12: Ki = q.i-1 and
A13: q.s = Ki!;
    reconsider q3 = f.(q,I) as Element of S;
    reconsider q4 = f.(q3,i+=1) as Element of S;
A14: q3.s = q.s*q.i by Th33;
    q4.s = q3.s by A7,Th28;
    then
A15: q4.s = (Ki+1)! by A12,A13,A14,NEWTON:15;
A16: q4 = f.(q,I\;i+=1) by AOFA_000:def 29;
    q4.i = q3.i+1 by Th28;
    then Ki+1 = q4.i-1 by A7,A12,Th33;
    hence P[f.(q,I\;i+=1) qua Element of S] by A16,A15;
    reconsider q9 = f.(q, i leq n) as Element of S;
    q9.i = q.i by A5,Th35;
    hence thesis by A12,A13,A10,Th35;
  end;
  reconsider F = for-do(i:=a, i leq n, i+=1, I) as Element of A;
  let N be Nat;
  assume
A17: N = q.n;
A18: F = for-do(i:=a, i leq n, i+=1, I);
A19: s <> n by A1,A2;
A20: for q being Element of Funcs(X,INT) st P[q]
    holds f.(q,I).i = q.i & f.(q,I).n = q.n by A19,A7,Th32;
A21: P[f.(q1,F)] & (a.q1 <= q1.n implies f.(q1,F).i = q1.n+1) &
     (a.q1 > q1.n implies f.(q1,F).i = a.q1) & f.(q1,F).n = q1.n
       from ForToIteration(A18,A8,A11,A20,A5);
   consider K being Nat such that
A22:  K = (f.(q1,F)).i-1 and
A23:  (f.(q1,F)).s = K! by A21;
  per cases;
  suppose
A24:  a.q1 <= q1.n;
  thus f.(q, s:=1\;for-do(i:=2, i leq n, i+=1, s*=i)).s
     = K! by A23,AOFA_000:def 29
    .= N! by A17,A24,A21,A22,A19,Th25;
  end;
  suppose
A25:  a.q1 > q1.n;
   then 1+1 > N by A19,A17,Th25;
   then
A26:  1 >= N by NAT_1:13;
  thus f.(q, s:=1\;for-do(i:=2, i leq n, i+=1, s*=i)).s
     = K! by A23,AOFA_000:def 29
    .= N! by A25,A21,A22,A26,NAT_1:25,NEWTON:12,13;
  end;
end;
