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 s.DataLoc(s.a,i) < 0 &
 (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 be Int_position 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 be Int_position st
x in X holds IExec(I,Q,t).x=t.x) holds 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);
  deffunc F(State of SCMPDS) = f.$1;
  defpred P[State of SCMPDS] means for x st x in X holds $1.x=s.x;
  assume
A1: s.b < 0;
  assume for t be 0-started State of SCMPDS st f.t=0 holds t.b >= 0;
  then
A2: for t be 0-started State of SCMPDS st P[t] & F(t)=0
   holds t.b >= 0;
  assume
A3: for t be 0-started State of SCMPDS,Q
 st (for x be Int_position 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 be Int_position st x in X holds IExec(I,Q,t).x=t.x;
A4: now
    let t be 0-started State of SCMPDS, Q;
    set v=t;
    assume that
A5: P[v] and
A6: t.a=s.a & t.b < 0;
    set It=IExec(I,Q,t);
    thus It.a=t.a & I is_closed_on t,Q & I is_halting_on t,Q
     & F(Initialize It) < F(t) by A3,A6,A5;
    thus P[Initialize It]
    proof
      set v=Initialize It;
        let x;
        assume
A7:     x in X;
        then It.x=t.x by A3,A6,A5;
        then v.x=t.x by SCMPDS_5:15;
        hence v.x=s.x by A5,A7;
    end;
  end;
A8: P[s];
  IExec(while<0(a,i,I),P,s) =IExec(while<0(a,i,I),
  P,Initialize IExec(I,P,s)) from WhileLExec(A1,A2,A8,A4);
  hence thesis;
end;
