reserve x,a for Int_position,
  s for State of SCMPDS;
reserve P,Q for Instruction-Sequence of SCMPDS;

theorem
  for s being 0-started State of SCMPDS,I being halt-free shiftable Program of
SCMPDS , a be Int_position, i be Integer,X be set,
  f being Function of product the_Values_of SCMPDS,NAT st
 (for t be 0-started State of SCMPDS st f.t=0 holds t.DataLoc(s.a,i) <= 0) &
 (for t be 0-started State of SCMPDS,Q st (for x
st x in X holds t.x=s.x) & t.a=s.a & t.DataLoc(s.a,i) > 0
 holds IExec(I,Q,t).a=t.
a & I is_closed_on t,Q & I is_halting_on t,Q
 & f.Initialize(IExec(I,Q,t)) < f.t &
  for x st x in X holds IExec(I,Q,t).x=t.x)
   holds while>0(a,i,I) is_closed_on s, P &
while>0(a,i,I) is_halting_on s, P & (s.DataLoc(s.a,i) > 0 implies
IExec(while>0(a,i,I),P,s)
 =IExec(while>0(a,i,I),P,Initialize IExec(I,P,s)))
proof
  let s be 0-started State of SCMPDS,
      I be halt-free shiftable Program of SCMPDS, a be
Int_position, i be Integer,X be set,
  f be Function of product the_Values_of SCMPDS,NAT;
  set b=DataLoc(s.a,i);
  assume
A1: for t be 0-started State of SCMPDS st f.t=0 holds t.b <= 0;
  assume
A2: for t be 0-started State of SCMPDS,Q
     st (for x st x in X holds t.x=s.x) & t.a=s.
a & t.b > 0 holds IExec(I,Q,t).a=t.a & I is_closed_on t,Q
 & I is_halting_on t,Q & f.
  Initialize(IExec(I,Q,t)) < f.t & for x st x in X
   holds IExec(I,Q,t).x=t.x;
  then
A3: for t being 0-started State of SCMPDS,Q
  st (for x st x in {} holds t.x >= 0+t.b) & (
  for x st x in X holds t.x=s.x) & t.a=s.a & t.b > 0
   holds IExec(I,Q,t).a=t.a & I
is_closed_on t,Q & I is_halting_on t,Q &
f.Initialize(IExec(I,Q,t)) < f.t
 & (for x st x in {}
 holds IExec(I,Q,t).x >= 0+IExec(I,Q,t).b)
   & for x st x in X holds IExec(I,Q,t).x=t.x;
A4: for x st x in {} holds s.x >= 0+s.b;
  for t being 0-started State of SCMPDS,Q
   st (for x st x in {} holds t.x >= 0+t.b) & (
  for x st x in X holds t.x=s.x) & t.a=s.a & t.b > 0
   holds IExec(I,Q,t).a=t.a &
     I is_closed_on t,Q & I is_halting_on t,Q &
     f.Initialize(IExec(I,Q,t)) < f.t
 & (for
  x st x in {} holds IExec(I,Q,t).x >= 0+IExec(I,Q,t).b)
   & for x st x in X holds
  IExec(I,Q,t).x=t.x by A2;
  hence
  while>0(a,i,I) is_closed_on s, P &
  while>0(a,i,I) is_halting_on s, P by A1,A4,Th22;
  assume s.b > 0;
  hence thesis by A1,A4,A3,Th23;
end;
