let S be non empty set ; :: thesis: for T being Subset of S
for A being free ECIW-strict preIfWhileAlgebra
for g being Function of [:S,(ElementaryInstructions A):],S
for s0 being Element of S ex f being ExecutionFunction of A,S,T st
( f | [:S,(ElementaryInstructions A):] = g & ( for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0 ) )

let T be Subset of S; :: thesis: for A being free ECIW-strict preIfWhileAlgebra
for g being Function of [:S,(ElementaryInstructions A):],S
for s0 being Element of S ex f being ExecutionFunction of A,S,T st
( f | [:S,(ElementaryInstructions A):] = g & ( for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0 ) )

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

let g be Function of [:S,(ElementaryInstructions A):],S; :: thesis: for s0 being Element of S ex f being ExecutionFunction of A,S,T st
( f | [:S,(ElementaryInstructions A):] = g & ( for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0 ) )

let s0 be Element of S; :: thesis: ex f being ExecutionFunction of A,S,T st
( f | [:S,(ElementaryInstructions A):] = g & ( for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0 ) )

reconsider Ss0 = S --> s0 as Element of Funcs S,S ;
set Z = Funcs S,S;
deffunc H1( Element of A) -> set = (curry' g) . $1;
A1: for I being Element of A st I in ElementaryInstructions A holds
H1(I) in Funcs S,S
proof
let I be Element of A; :: thesis: ( I in ElementaryInstructions A implies H1(I) in Funcs S,S )
assume A2: I in ElementaryInstructions A ; :: thesis: H1(I) in Funcs S,S
then reconsider B = ElementaryInstructions A as non empty set ;
reconsider I = I as Element of B by A2;
reconsider g = g as Function of [:S,B:],S ;
(curry' g) . I is Element of Funcs S,S ;
hence H1(I) in Funcs S,S ; :: thesis: verum
end;
reconsider idS = id S as Element of Funcs S,S by ALTCAT_1:2;
deffunc H2( Element of Funcs S,S, Element of Funcs S,S) -> Element of Funcs S,S = $2 * $1;
deffunc H3( Element of Funcs S,S, Element of Funcs S,S, Element of Funcs S,S) -> Element of Funcs S,S = ($2,T +* $3) * $1;
deffunc H4( Element of Funcs S,S, Element of Funcs S,S) -> Element of Funcs S,S = (T,Ss0 iter ($1 * $2)) * $1;
consider h being Function of the carrier of A,(Funcs S,S) such that
A3: for I being Element of A st I in ElementaryInstructions A holds
h . I = H1(I) and
A4: h . (EmptyIns A) = idS and
A5: for I1, I2 being Element of A holds h . (I1 \; I2) = H2(h . I1,h . I2) and
A6: for C, I1, I2 being Element of A holds h . (if-then-else C,I1,I2) = H3(h . C,h . I1,h . I2) and
A7: for C, I being Element of A holds h . (while C,I) = H4(h . C,h . I) from AOFA_000:sch 7(A1);
h in Funcs the carrier of A,(Funcs S,S) by FUNCT_2:11;
then uncurry' h in Funcs [:S,the carrier of A:],S by FUNCT_6:20;
then reconsider f = uncurry' h as Function of [:S,the carrier of A:],S by FUNCT_2:121;
A8: ( dom h = the carrier of A & dom idS = S ) by FUNCT_2:def 1;
A9: f is complying_with_empty-instruction
proof
let s be Element of S; :: according to AOFA_000:def 28 :: thesis: f . s,(EmptyIns A) = s
idS . s = s by FUNCT_1:35;
hence f . s,(EmptyIns A) = s by A4, A8, FUNCT_5:46; :: thesis: verum
end;
A10: f is complying_with_catenation
proof
let s be Element of S; :: according to AOFA_000:def 29 :: thesis: for I1, I2 being Element of A holds f . s,(I1 \; I2) = f . (f . s,I1),I2
let I1, I2 be Element of A; :: thesis: f . s,(I1 \; I2) = f . (f . s,I1),I2
A11: ( dom (h . (I1 \; I2)) = S & dom (h . I1) = S & dom (h . I2) = S ) by FUNCT_2:def 1;
hence f . s,(I1 \; I2) = (h . (I1 \; I2)) . s by A8, FUNCT_5:46
.= ((h . I2) * (h . I1)) . s by A5
.= (h . I2) . ((h . I1) . s) by FUNCT_2:21
.= (h . I2) . (f . s,I1) by A8, A11, FUNCT_5:46
.= f . (f . s,I1),I2 by A8, A11, FUNCT_5:46 ;
:: thesis: verum
end;
A12: f complies_with_if_wrt T
proof
let s be Element of S; :: according to AOFA_000:def 30 :: thesis: for C, I1, I2 being Element of A holds
( ( f . s,C in T implies f . s,(if-then-else C,I1,I2) = f . (f . s,C),I1 ) & ( f . s,C nin T implies f . s,(if-then-else C,I1,I2) = f . (f . s,C),I2 ) )

let C, I1, I2 be Element of A; :: thesis: ( ( f . s,C in T implies f . s,(if-then-else C,I1,I2) = f . (f . s,C),I1 ) & ( f . s,C nin T implies f . s,(if-then-else C,I1,I2) = f . (f . s,C),I2 ) )
A13: ( dom (h . (if-then-else C,I1,I2)) = S & dom (h . C) = S & dom (h . I1) = S & dom (h . I2) = S ) by FUNCT_2:def 1;
then A14: f . s,(if-then-else C,I1,I2) = (h . (if-then-else C,I1,I2)) . s by A8, FUNCT_5:46
.= H3(h . C,h . I1,h . I2) . s by A6
.= ((h . I1),T +* (h . I2)) . ((h . C) . s) by FUNCT_2:21 ;
A15: f . s,C = (h . C) . s by A8, A13, FUNCT_5:46;
hereby :: thesis: ( f . s,C nin T implies f . s,(if-then-else C,I1,I2) = f . (f . s,C),I2 )
assume f . s,C in T ; :: thesis: f . s,(if-then-else C,I1,I2) = f . (f . s,C),I1
hence f . s,(if-then-else C,I1,I2) = (h . I1) . (f . s,C) by A13, A14, A15, Th4
.= f . (f . s,C),I1 by A8, A13, FUNCT_5:46 ;
:: thesis: verum
end;
assume f . s,C nin T ; :: thesis: f . s,(if-then-else C,I1,I2) = f . (f . s,C),I2
hence f . s,(if-then-else C,I1,I2) = (h . I2) . (f . s,C) by A13, A14, A15, Th5
.= f . (f . s,C),I2 by A8, A13, FUNCT_5:46 ;
:: thesis: verum
end;
f complies_with_while_wrt T
proof
let s be Element of S; :: according to AOFA_000:def 31 :: thesis: for C, I being Element of A holds
( ( f . s,C in T implies f . s,(while C,I) = f . (f . (f . s,C),I),(while C,I) ) & ( f . s,C nin T implies f . s,(while C,I) = f . s,C ) )

let C, I be Element of A; :: thesis: ( ( f . s,C in T implies f . s,(while C,I) = f . (f . (f . s,C),I),(while C,I) ) & ( f . s,C nin T implies f . s,(while C,I) = f . s,C ) )
A16: ( dom (h . (while C,I)) = S & dom (h . C) = S & dom (h . I) = S & dom ((h . C) * (h . I)) = S ) by FUNCT_2:def 1;
then A17: f . s,(while C,I) = (h . (while C,I)) . s by A8, FUNCT_5:46
.= H4(h . C,h . I) . s by A7
.= (T,Ss0 iter ((h . C) * (h . I))) . ((h . C) . s) by FUNCT_2:21 ;
A18: f . s,C = (h . C) . s by A8, A16, FUNCT_5:46;
A19: rng ((h . C) * (h . I)) c= S ;
B20: now
let z be Element of S; :: thesis: (Ss0 * ((h . C) * (h . I))) . z = Ss0 . z
thus (Ss0 * ((h . C) * (h . I))) . z = Ss0 . (((h . C) * (h . I)) . z) by FUNCT_2:21
.= s0 by FUNCOP_1:13
.= Ss0 . z by FUNCOP_1:13 ; :: thesis: verum
end;
hereby :: thesis: ( f . s,C nin T implies f . s,(while C,I) = f . s,C )
assume f . s,C in T ; :: thesis: f . s,(while C,I) = f . (f . (f . s,C),I),(while C,I)
hence f . s,(while C,I) = (T,Ss0 iter ((h . C) * (h . I))) . (((h . C) * (h . I)) . (f . s,C)) by A16, A17, A18, A19, B20, Th11, FUNCT_2:113
.= (T,Ss0 iter ((h . C) * (h . I))) . ((h . C) . ((h . I) . (f . s,C))) by FUNCT_2:21
.= ((T,Ss0 iter ((h . C) * (h . I))) * (h . C)) . ((h . I) . (f . s,C)) by FUNCT_2:21
.= ((T,Ss0 iter ((h . C) * (h . I))) * (h . C)) . (f . (f . s,C),I) by A8, A16, FUNCT_5:46
.= (h . (while C,I)) . (f . (f . s,C),I) by A7
.= f . (f . (f . s,C),I),(while C,I) by A8, A16, FUNCT_5:46 ;
:: thesis: verum
end;
thus ( f . s,C nin T implies f . s,(while C,I) = f . s,C ) by A16, A17, A18, A19, Th12; :: thesis: verum
end;
then reconsider f = f as ExecutionFunction of A,S,T by A9, A10, A12, Def32;
take f ; :: thesis: ( f | [:S,(ElementaryInstructions A):] = g & ( for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0 ) )

dom f = [:S,the carrier of A:] by FUNCT_2:def 1;
then [:S,(ElementaryInstructions A):] c= dom f by ZFMISC_1:118;
then A21: ( dom g = [:S,(ElementaryInstructions A):] & (dom f) /\ [:S,(ElementaryInstructions A):] = [:S,(ElementaryInstructions A):] ) by FUNCT_2:def 1, XBOOLE_1:28;
now
let a be set ; :: thesis: ( a in dom g implies g . a = f . a )
assume A22: a in dom g ; :: thesis: g . a = f . a
then consider s, I being set such that
A23: ( s in S & I in ElementaryInstructions A & a = [s,I] ) by ZFMISC_1:def 2;
reconsider s = s as Element of S by A23;
reconsider I = I as Element of A by A23;
reconsider EI = (curry' g) . I as Element of Funcs S,S by A23, A1;
g in Funcs [:S,(ElementaryInstructions A):],S by FUNCT_2:11;
then curry' g in Funcs (ElementaryInstructions A),(Funcs S,S) by A22, FUNCT_6:19;
then A24: ( dom (curry' g) = ElementaryInstructions A & dom EI = S & dom (h . I) = S ) by FUNCT_2:169;
thus g . a = g . s,I by A23
.= EI . s by A23, A24, FUNCT_5:41
.= (h . I) . s by A23, A3
.= f . s,I by A8, A24, FUNCT_5:46
.= f . a by A23 ; :: thesis: verum
end;
hence f | [:S,(ElementaryInstructions A):] = g by A21, FUNCT_1:68; :: thesis: for s being Element of S
for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0

let s be Element of S; :: thesis: for C, I being Element of A st not f iteration_terminates_for I \; C,f . s,C holds
f . s,(while C,I) = s0

let C, I be Element of A; :: thesis: ( not f iteration_terminates_for I \; C,f . s,C implies f . s,(while C,I) = s0 )
assume A25: not f iteration_terminates_for I \; C,f . s,C ; :: thesis: f . s,(while C,I) = s0
A26: ( dom (h . (while C,I)) = S & dom (h . C) = S & dom (h . I) = S & dom ((h . C) * (h . I)) = S ) by FUNCT_2:def 1;
then A27: f . s,(while C,I) = (h . (while C,I)) . s by A8, FUNCT_5:46
.= H4(h . C,h . I) . s by A7
.= (T,Ss0 iter ((h . C) * (h . I))) . ((h . C) . s) by FUNCT_2:21 ;
A28: f . s,C = (h . C) . s by A8, A26, FUNCT_5:46;
A29: rng ((h . C) * (h . I)) c= S ;
rng h c= Funcs S,S ;
then h = curry' f by FUNCT_5:55;
then (curry' f) . (I \; C) = (h . C) * (h . I) by A5;
then ((h . C) * (h . I)) orbit (f . s,C) c= T by A25, Th87;
hence f . s,(while C,I) = Ss0 . (f . s,C) by A26, A27, A28, A29, Def7
.= s0 by FUNCOP_1:13 ;
:: thesis: verum