let A be Euclidean preIfWhileAlgebra; for X being non empty countable set
for b being Element of X
for g being Euclidean ExecutionFunction of A, Funcs X,INT ,(Funcs X,INT ) \ b,0
for x, y, m being Variable of g st ex d being Function st
( d . b = 0 & d . x = 1 & d . y = 2 & d . m = 3 ) holds
(y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
let X be non empty countable set ; for b being Element of X
for g being Euclidean ExecutionFunction of A, Funcs X,INT ,(Funcs X,INT ) \ b,0
for x, y, m being Variable of g st ex d being Function st
( d . b = 0 & d . x = 1 & d . y = 2 & d . m = 3 ) holds
(y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
let b be Element of X; for g being Euclidean ExecutionFunction of A, Funcs X,INT ,(Funcs X,INT ) \ b,0
for x, y, m being Variable of g st ex d being Function st
( d . b = 0 & d . x = 1 & d . y = 2 & d . m = 3 ) holds
(y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
let g be Euclidean ExecutionFunction of A, Funcs X,INT ,(Funcs X,INT ) \ b,0 ; for x, y, m being Variable of g st ex d being Function st
( d . b = 0 & d . x = 1 & d . y = 2 & d . m = 3 ) holds
(y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
set S = Funcs X,INT ;
set T = (Funcs X,INT ) \ b,0 ;
let x, y, m be Variable of g; ( ex d being Function st
( d . b = 0 & d . x = 1 & d . y = 2 & d . m = 3 ) implies (y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 } )
set P = { s where s is Element of Funcs X,INT : s . m >= 0 } ;
given d being Function such that A1:
d . b = 0
and
A2:
d . x = 1
and
A3:
d . y = 2
and
A4:
d . m = 3
; (y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
set C = m gt 0 ;
A5:
y := 1 is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
by AOFA_000:107;
deffunc H1( Element of Funcs X,INT ) -> Element of NAT = In ($1 . m),NAT ;
defpred S1[ Element of Funcs X,INT ] means $1 . m > 0 ;
set I = if-then (m is_odd ),(y *= x);
set J = ((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x);
A6:
g complies_with_if_wrt (Funcs X,INT ) \ b,0
by AOFA_000:def 32;
A7:
{ s where s is Element of Funcs X,INT : s . m >= 0 } is_invariant_wrt m gt 0 ,g
proof
let s be
Element of
Funcs X,
INT ;
AOFA_000:def 39 ( not s in { s where s is Element of Funcs X,INT : s . m >= 0 } or g . s,(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 } )
assume
s in { s where s is Element of Funcs X,INT : s . m >= 0 }
;
g . s,(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 }
then A8:
ex
s9 being
Element of
Funcs X,
INT st
(
s = s9 &
s9 . m >= 0 )
;
(g . s,(m gt 0 )) . m = s . m
by A1, A4, Th38;
hence
g . s,
(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 }
by A8;
verum
end;
A9:
for s being Element of Funcs X,INT st s in { s where s is Element of Funcs X,INT : s . m >= 0 } & g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 ) in (Funcs X,INT ) \ b,0 holds
g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) in { s where s is Element of Funcs X,INT : s . m >= 0 }
proof
let s be
Element of
Funcs X,
INT ;
( s in { s where s is Element of Funcs X,INT : s . m >= 0 } & g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 ) in (Funcs X,INT ) \ b,0 implies g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) in { s where s is Element of Funcs X,INT : s . m >= 0 } )
assume
s in { s where s is Element of Funcs X,INT : s . m >= 0 }
;
( not g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 ) in (Funcs X,INT ) \ b,0 or g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) in { s where s is Element of Funcs X,INT : s . m >= 0 } )
assume
g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),
(m gt 0 ) in (Funcs X,INT ) \ b,
0
;
g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) in { s where s is Element of Funcs X,INT : s . m >= 0 }
then
(g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) . m > 0
by Th40;
hence
g . s,
(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) in { s where s is Element of Funcs X,INT : s . m >= 0 }
;
verum
end;
A10:
m <> y
by A3, A4;
A11:
{ s where s is Element of Funcs X,INT : s . m >= 0 } is_invariant_wrt y := 1,g
proof
let s be
Element of
Funcs X,
INT ;
AOFA_000:def 39 ( not s in { s where s is Element of Funcs X,INT : s . m >= 0 } or g . s,(y := 1) in { s where s is Element of Funcs X,INT : s . m >= 0 } )
assume
s in { s where s is Element of Funcs X,INT : s . m >= 0 }
;
g . s,(y := 1) in { s where s is Element of Funcs X,INT : s . m >= 0 }
then A12:
ex
s9 being
Element of
Funcs X,
INT st
(
s = s9 &
s9 . m >= 0 )
;
(g . s,(y := 1)) . m = s . m
by A10, Th25;
hence
g . s,
(y := 1) in { s where s is Element of Funcs X,INT : s . m >= 0 }
by A12;
verum
end;
A13:
m <> x
by A2, A4;
A14:
for s being Element of Funcs X,INT st g . s,(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 } holds
g iteration_terminates_for (((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ),g . s,(m gt 0 )
proof
A15:
for
s being
Element of
Funcs X,
INT st
S1[
s] holds
( (
S1[
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] implies
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,
0 ) & (
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,
0 implies
S1[
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] ) &
H1(
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )))
< H1(
s) )
proof
let s be
Element of
Funcs X,
INT ;
( S1[s] implies ( ( S1[g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] implies g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,0 ) & ( g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,0 implies S1[g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] ) & H1(g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))) < H1(s) ) )
assume A16:
s . m > 0
;
( ( S1[g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] implies g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,0 ) & ( g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,0 implies S1[g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] ) & H1(g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))) < H1(s) )
A17:
H1(
s)
= s . m
by A16, FUNCT_7:def 1, INT_1:16;
set q1 =
g . s,
(if-then (m is_odd ),(y *= x));
set q0 =
g . s,
(m is_odd );
set sJ =
g . s,
(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x));
set sC =
g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),
(m gt 0 );
A18:
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) = g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),
(m gt 0 )
by AOFA_000:def 29;
A19:
(
(g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) . m <= 0 implies
(g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 )) . b = 0 )
by Th38;
(
(g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) . m > 0 implies
(g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 )) . b = 1 )
by Th38;
hence
(
S1[
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))] iff
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )) in (Funcs X,INT ) \ b,
0 )
by A19, A18, Th2, Th38;
H1(g . s,((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ))) < H1(s)
set q2 =
g . (g . s,(if-then (m is_odd ),(y *= x))),
(m /= 2);
set q3 =
g . (g . (g . s,(if-then (m is_odd ),(y *= x))),(m /= 2)),
(x *= x);
(
g . s,
(m is_odd ) in (Funcs X,INT ) \ b,
0 or
g . s,
(m is_odd ) nin (Funcs X,INT ) \ b,
0 )
;
then A20:
(
g . s,
(if-then (m is_odd ),(y *= x)) = g . (g . s,(m is_odd )),
(y *= x) or
g . s,
(if-then (m is_odd ),(y *= x)) = g . (g . s,(m is_odd )),
(EmptyIns A) )
by A6, AOFA_000:def 30;
g . (g . s,(if-then (m is_odd ),(y *= x))),
(m /= 2) = g . s,
((if-then (m is_odd ),(y *= x)) \; (m /= 2))
by AOFA_000:def 29;
then
g . (g . (g . s,(if-then (m is_odd ),(y *= x))),(m /= 2)),
(x *= x) = g . s,
(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))
by AOFA_000:def 29;
then A21:
(g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) . m =
(g . (g . s,(if-then (m is_odd ),(y *= x))),(m /= 2)) . m
by A13, Th33
.=
((g . s,(if-then (m is_odd ),(y *= x))) . m) div 2
by Th45
.=
((g . s,(m is_odd )) . m) div 2
by A10, A20, Th33, AOFA_000:def 28
.=
(s . m) div 2
by A1, A4, Th49
;
A22:
(g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 )) . m = (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) . m
by A1, A4, Th38;
then
(g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 )) . m in NAT
by A16, A21, INT_1:16, INT_1:88;
then
H1(
g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),
(m gt 0 ))
= (g . (g . s,(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))),(m gt 0 )) . m
by FUNCT_7:def 1;
hence
H1(
g . s,
((((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 )))
< H1(
s)
by A16, A22, A18, A21, A17, INT_1:83;
verum
end;
let s0 be
Element of
Funcs X,
INT ;
( g . s0,(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 } implies g iteration_terminates_for (((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ),g . s0,(m gt 0 ) )
assume
g . s0,
(m gt 0 ) in { s where s is Element of Funcs X,INT : s . m >= 0 }
;
g iteration_terminates_for (((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ),g . s0,(m gt 0 )
set s1 =
g . s0,
(m gt 0 );
A23:
(
s0 . m <= 0 implies
(g . s0,(m gt 0 )) . b = 0 )
by Th38;
(
s0 . m > 0 implies
(g . s0,(m gt 0 )) . b = 1 )
by Th38;
then A24:
(
g . s0,
(m gt 0 ) in (Funcs X,INT ) \ b,
0 iff
S1[
g . s0,
(m gt 0 )] )
by A23, Th2, Th38;
thus
g iteration_terminates_for (((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) \; (m gt 0 ),
g . s0,
(m gt 0 )
from AOFA_000:sch 3(A24, A15); verum
end;
((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
by AOFA_000:107;
then
while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x)) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
by A7, A9, A14, AOFA_000:104, AOFA_000:118;
hence
(y := 1) \; (while (m gt 0 ),(((if-then (m is_odd ),(y *= x)) \; (m /= 2)) \; (x *= x))) is_terminating_wrt g,{ s where s is Element of Funcs X,INT : s . m >= 0 }
by A5, A11, AOFA_000:111; verum