reserve A for preIfWhileAlgebra,
  C,I,J for Element of A;
reserve S for non empty set,
  T for Subset of S,
  s for Element of S;
reserve f for ExecutionFunction of A,S,T;

theorem
  for A being free ECIW-strict preIfWhileAlgebra
  for g being Function of [:S, ElementaryInstructions A:], S
  for F being Function of Funcs(S,S), Funcs(S,S)
  st for h being Element of Funcs(S,S) holds (F.h)*h = F.h
  ex f being ExecutionFunction of A, S, T
  st f|[:S, ElementaryInstructions A:] = g & for C,I being Element of A
  for s being Element of S st not f iteration_terminates_for I\;C, f.(s, C)
  holds f.(s, while(C, I)) = F.((curry' f).(I\;C)).(f.(s,C))
proof
  let A be free ECIW-strict preIfWhileAlgebra;
  let g be Function of [:S, ElementaryInstructions A:], S;

  let F being Function of Funcs(S,S), Funcs(S,S) such that
A1: for h being Element of Funcs(S,S) holds (F.h)*h = F.h;
  set Z = Funcs(S,S);
  deffunc ElemF(Element of A) = (curry' g).$1;
A2: for I being Element of A st I in ElementaryInstructions A
  holds ElemF(I) in Z
  proof
    let I be Element of A;
    assume
A3: I in ElementaryInstructions A;
    then reconsider B = ElementaryInstructions A as non empty set;
    reconsider I as Element of B by A3;
    reconsider g as Function of [:S,B:],S;
    (curry' g).I is Element of Z;
    hence thesis;
  end;
  reconsider idS = id S as Element of Z by FUNCT_2:126;
  deffunc ConF((Element of Z), Element of Z) = $2*$1 qua Element of Z;
  deffunc IfF((Element of Z), (Element of Z), Element of Z)
  = (($2,T)+*$3)*$1 qua Element of Z;
  deffunc WhiF((Element of Z), Element of Z)
  = ((T, F.($1*$2)) iter ($1*$2))*$1 qua Element of Z;
  consider h being Function of the carrier of A, Z such that
A4: for I being Element of A st I in ElementaryInstructions A
  holds h.I = ElemF(I) and
A5: h.EmptyIns A = idS and
A6: for I1,I2 being Element of A holds h.(I1\;I2) = ConF(h.I1,h.I2) and
A7: for C,I1,I2 being Element of A
  holds h.if-then-else(C,I1,I2) = IfF(h.C,h.I1,h.I2) and
A8: for C,I being Element of A holds h.while(C,I) = WhiF(h.C,h.I)
  from IndDef(A2);
  h in Funcs(the carrier of A, Z) by FUNCT_2:8;
  then uncurry' h in Funcs([:S, the carrier of A:], S) by FUNCT_6:11;
  then reconsider f = uncurry' h as Function of [:S, the carrier of A:], S
  by FUNCT_2:66;
A9: dom h = the carrier of A by FUNCT_2:def 1;
A10: f is complying_with_empty-instruction
  proof
    let s be Element of S;
    idS.s = s;
    hence thesis by A5,A9,FUNCT_5:39;
  end;
A11: f is complying_with_catenation
  proof
    let s be Element of S;
    let I1,I2 be Element of A;
A12: dom (h.(I1\;I2)) = S by FUNCT_2:def 1;
A13: dom (h.I1) = S by FUNCT_2:def 1;
A14: dom (h.I2) = S by FUNCT_2:def 1;
    thus f.(s,I1 \; I2) = (h.(I1\;I2)).s by A9,A12,FUNCT_5:39
      .= ((h.I2)*(h.I1)).s by A6
      .= (h.I2).((h.I1).s) by FUNCT_2:15
      .= (h.I2).(f.(s,I1)) by A9,A13,FUNCT_5:39
      .= f.(f.(s,I1),I2) by A9,A14,FUNCT_5:39;
  end;
A15: f complies_with_if_wrt T
  proof
    let s be Element of S;
    let C, I1,I2 be Element of A;
A16: dom (h.if-then-else(C,I1,I2)) = S by FUNCT_2:def 1;
A17: dom (h.C) = S by FUNCT_2:def 1;
A18: dom (h.I1) = S by FUNCT_2:def 1;
A19: dom (h.I2) = S by FUNCT_2:def 1;
A20: f.(s,if-then-else(C,I1,I2))
    = (h.if-then-else(C,I1,I2)).s by A9,A16,FUNCT_5:39
      .= IfF(h.C,h.I1,h.I2).s by A7
      .= ((h.I1,T)+*(h.I2)).((h.C).s) by FUNCT_2:15;
A21: f.(s,C) = (h.C).s by A9,A17,FUNCT_5:39;
    hereby
      assume f.(s,C) in T;
      hence f.(s,if-then-else(C,I1,I2)) = (h.I1).(f.(s,C)) by A18,A20,A21,Th4
        .= f.(f.(s,C),I1) by A9,A18,FUNCT_5:39;
    end;
    assume f.(s,C) nin T;
    hence f.(s,if-then-else(C,I1,I2)) = (h.I2).(f.(s,C)) by A19,A20,A21,Th5
      .= f.(f.(s,C),I2) by A9,A19,FUNCT_5:39;
  end;
  f complies_with_while_wrt T
  proof
    let s be Element of S;
    let C, I be Element of A;
A22: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A23: dom (h.C) = S by FUNCT_2:def 1;
A24: dom (h.I) = S by FUNCT_2:def 1;
A25: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A26: f.(s,while(C,I)) = (h.while(C,I)).s by A9,A22,FUNCT_5:39
      .= WhiF(h.C,h.I).s by A8
      .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A27: f.(s,C) = (h.C).s by A9,A23,FUNCT_5:39;
A28: rng ((h.C)*(h.I)) c= S;
A29: (F.((h.C)*(h.I)))*((h.C)*(h.I)) = F.((h.C)*(h.I)) by A1;
    hereby
      assume f.(s,C) in T;
      hence f.(s,while(C,I))
      = ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).(((h.C)*(h.I)).(f.(s,C)))
      by A25,A26,A27,A28,A29,Th11
        .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).((h.I).(f.(s,C))))
      by FUNCT_2:15
        .= (((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I)))*(h.C)).((h.I).(f.(s,C)))
      by FUNCT_2:15
        .= (((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I)))*(h.C)).(f.(f.(s,C),I))
      by A9,A24,FUNCT_5:39
        .= (h.while(C,I)).(f.(f.(s,C),I)) by A8
        .= f.(f.(f.(s,C),I),while(C,I)) by A9,A22,FUNCT_5:39;
    end;
    thus thesis by A25,A26,A27,A28,Th12;
  end;
  then reconsider f as ExecutionFunction of A, S, T by A10,A11,A15,Def32;
  take f;
  dom f = [:S, the carrier of A:] by FUNCT_2:def 1;
  then
A30: [:S, ElementaryInstructions A:] c= dom f by ZFMISC_1:95;
A31: dom g = [:S, ElementaryInstructions A:] by FUNCT_2:def 1;
A32: dom f /\ [:S, ElementaryInstructions A:] = [:S, ElementaryInstructions
  A:] by A30,XBOOLE_1:28;
  now
    let a be object;
    assume
A33: a in dom g;
    then consider s,I being object such that
A34: s in S and
A35: I in ElementaryInstructions A and
A36: a = [s,I] by ZFMISC_1:def 2;
    reconsider s as Element of S by A34;
    reconsider I as Element of A by A35;
    reconsider EI = (curry' g).I as Element of Z by A2,A35;
    g in Funcs([:S, ElementaryInstructions A:], S) by FUNCT_2:8;
    then curry' g in Funcs(ElementaryInstructions A, Z) by A33,FUNCT_6:10;
    then
A37: dom curry' g = ElementaryInstructions A by FUNCT_2:92;
A38: dom EI = S by FUNCT_2:92;
A39: dom (h.I) = S by FUNCT_2:92;
    thus g.a = g.(s,I) by A36
      .= EI.s by A35,A37,A38,FUNCT_5:34
      .= (h.I).s by A4,A35
      .= f.(s,I) by A9,A39,FUNCT_5:39
      .= f.a by A36;
  end;
  hence f|[:S, ElementaryInstructions A:] = g by A31,A32,FUNCT_1:46;
  let C,I be Element of A;
  let s be Element of S;
  assume
A40: not f iteration_terminates_for I\;C, f.(s,C);
A41: dom (h.while(C,I)) = S by FUNCT_2:def 1;
A42: dom (h.C) = S by FUNCT_2:def 1;
A43: dom ((h.C)*(h.I)) = S by FUNCT_2:def 1;
A44: f.(s,while(C,I)) = (h.while(C,I)).s by A9,A41,FUNCT_5:39
    .= WhiF(h.C,h.I).s by A8
    .= ((T,F.((h.C)*(h.I))) iter ((h.C)*(h.I))).((h.C).s) by FUNCT_2:15;
A45: f.(s,C) = (h.C).s by A9,A42,FUNCT_5:39;
A46: rng ((h.C)*(h.I)) c= S;
  rng h c= Z;
  then h = curry' f by FUNCT_5:48;
  then
A47: (curry' f).(I\;C) = (h.C)*(h.I) by A6;
  then (h.C)*(h.I) orbit f.(s,C) c= T by A40,Th87;
  hence thesis by A43,A44,A45,A46,A47,Def7;
end;
