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 P being set for I being Element of A st I is_terminating_wrt g, P
for i,n being Variable of g st (ex d being Function st d.b = 0 & d.n = 1 & d.i
  = 2) & (for s st s in P holds g.(s,I).n = s.n & g.(s,I).i = s.i) & P
is_invariant_wrt i:=t, g & P is_invariant_wrt I, g & P is_invariant_wrt i leq n
  , g & P is_invariant_wrt i+=1, g holds for-do(i:=t, i leq n, i+=1, I)
  is_terminating_wrt g, P
proof
  set Z = Funcs(X, INT);
  set T = Funcs(X, INT)\(b,0);
  let S be set;
  let I be Element of A;
  assume
A1: I is_terminating_wrt g, S;
  let i,n be Variable of g;
  given d being Function such that
A2: d.b = 0 and
A3: d.n = 1 and
A4: d.i = 2;
  set C = i leq n, J = I\; i+=1;
  assume that
A5: for s st s in S holds g.(s,I).n = s.n & g.(s,I).i = s.i and
A6: S is_invariant_wrt i:=t, g and
A7: S is_invariant_wrt I, g and
A8: S is_invariant_wrt i leq n, g and
A9: S is_invariant_wrt i+=1, g;
  let s;
  assume s in S;
  then
A10: g.(s, i:=t) in S by A6;
  for s being Element of Z st s in S holds g.(s,I).n = s.n & g.(s,I).i =
  s.i & g.(s, I) in S & g.(s, i leq n) in S & g.(s, i+=1) in S by A5,A7,A8,A9;
  then
A11: g iteration_terminates_for J\; C, g.(g.(s, i:=t), C) by A2,A3,A4,A10,Th53;
  set Q = while(C, J);
A12: C is_terminating_wrt g by AOFA_000:104;
A13: [s, i:=t] in TerminatingPrograms(A,Z,T,g) by AOFA_000:def 36;
  S is_invariant_wrt J, g by A7,A9,AOFA_000:109;
  then
A14: for s st s in S & g.(g.(s, J), C) in T holds g.(s,J) in S;
  i+=1 is_terminating_wrt g, S by AOFA_000:107;
  then [g.(s, i:=t), Q] in TerminatingPrograms(A,Z,T,g) by A1,A7,A8,A10,A11,A12
,A14,AOFA_000:111,116;
  hence thesis by A13,AOFA_000:def 35;
end;
