:: FIB_FUSC semantic presentation

Lemma1: 6 + 1 = (6 * ([\(log 2,1)/] + 1)) + 1
proof end;

Lemma2: for b1 being Nat st b1 > 0 holds
( [\(log 2,b1)/] is Nat & (6 * ([\(log 2,b1)/] + 1)) + 1 > 0 )
proof end;

Lemma3: for b1, b2 being Nat st b1 = (2 * b2) + 1 & b2 > 0 holds
6 + ((6 * ([\(log 2,b2)/] + 1)) + 1) = (6 * ([\(log 2,b1)/] + 1)) + 1
proof end;

Lemma4: for b1 being Nat st b1 > 0 holds
( log 2,(2 * b1) = 1 + (log 2,b1) & log 2,(2 * b1) = (log 2,b1) + 1 )
proof end;

Lemma5: for b1, b2 being Nat st b1 = 2 * b2 & b2 > 0 holds
6 + ((6 * ([\(log 2,b2)/] + 1)) + 1) = (6 * ([\(log 2,b1)/] + 1)) + 1
proof end;

Lemma6: for b1 being Nat st b1 <> 0 holds
(6 * b1) - 4 > 0
proof end;

Lemma7: ( dl. 0 <> dl. 1 & dl. 0 <> dl. 2 & dl. 0 <> dl. 3 & dl. 1 <> dl. 2 & dl. 1 <> dl. 3 & dl. 2 <> dl. 3 )
by AMI_3:52;

Lemma8: ( dl. 0 <> dl. 4 & dl. 1 <> dl. 4 & dl. 2 <> dl. 4 & dl. 3 <> dl. 4 )
by AMI_3:52;

definition
func Fib_Program -> FinSequence of the Instructions of SCM equals :: FIB_FUSC:def 1
(((((((<*((dl. 1) >0_goto (il. 2))*> ^ <*(halt SCM )*>) ^ <*((dl. 3) := (dl. 0))*>) ^ <*(SubFrom (dl. 1),(dl. 0))*>) ^ <*((dl. 1) =0_goto (il. 1))*>) ^ <*((dl. 4) := (dl. 2))*>) ^ <*((dl. 2) := (dl. 3))*>) ^ <*(AddTo (dl. 3),(dl. 4))*>) ^ <*(goto (il. 3))*>;
coherence
(((((((<*((dl. 1) >0_goto (il. 2))*> ^ <*(halt SCM )*>) ^ <*((dl. 3) := (dl. 0))*>) ^ <*(SubFrom (dl. 1),(dl. 0))*>) ^ <*((dl. 1) =0_goto (il. 1))*>) ^ <*((dl. 4) := (dl. 2))*>) ^ <*((dl. 2) := (dl. 3))*>) ^ <*(AddTo (dl. 3),(dl. 4))*>) ^ <*(goto (il. 3))*> is FinSequence of the Instructions of SCM
;
end;

:: deftheorem Def1 defines Fib_Program FIB_FUSC:def 1 :
Fib_Program = (((((((<*((dl. 1) >0_goto (il. 2))*> ^ <*(halt SCM )*>) ^ <*((dl. 3) := (dl. 0))*>) ^ <*(SubFrom (dl. 1),(dl. 0))*>) ^ <*((dl. 1) =0_goto (il. 1))*>) ^ <*((dl. 4) := (dl. 2))*>) ^ <*((dl. 2) := (dl. 3))*>) ^ <*(AddTo (dl. 3),(dl. 4))*>) ^ <*(goto (il. 3))*>;

theorem Th1: :: FIB_FUSC:1
for b1 being Nat
for b2 being State-consisting of 0,0,0, Fib_Program ,((<*1*> ^ <*b1*>) ^ <*0*>) ^ <*0*> holds
( b2 is halting & ( b1 = 0 implies Complexity b2 = 1 ) & ( b1 > 0 implies Complexity b2 = (6 * b1) - 2 ) & (Result b2) . (dl. 3) = Fib b1 )
proof end;

definition
let c1 be Integer;
func Fusc' c1 -> Nat means :Def2: :: FIB_FUSC:def 2
( ex b1 being Nat st
( a1 = b1 & a2 = Fusc b1 ) or ( a1 is not Nat & a2 = 0 ) );
existence
ex b1 being Nat st
( ex b2 being Nat st
( c1 = b2 & b1 = Fusc b2 ) or ( c1 is not Nat & b1 = 0 ) )
proof end;
uniqueness
for b1, b2 being Nat st ( ex b3 being Nat st
( c1 = b3 & b1 = Fusc b3 ) or ( c1 is not Nat & b1 = 0 ) ) & ( ex b3 being Nat st
( c1 = b3 & b2 = Fusc b3 ) or ( c1 is not Nat & b2 = 0 ) ) holds
b1 = b2
;
end;

:: deftheorem Def2 defines Fusc' FIB_FUSC:def 2 :
for b1 being Integer
for b2 being Nat holds
( b2 = Fusc' b1 iff ( ex b3 being Nat st
( b1 = b3 & b2 = Fusc b3 ) or ( b1 is not Nat & b2 = 0 ) ) );

definition
func Fusc_Program -> FinSequence of the Instructions of SCM equals :: FIB_FUSC:def 3
(((((((<*((dl. 1) =0_goto (il. 8))*> ^ <*((dl. 4) := (dl. 0))*>) ^ <*(Divide (dl. 1),(dl. 4))*>) ^ <*((dl. 4) =0_goto (il. 6))*>) ^ <*(AddTo (dl. 3),(dl. 2))*>) ^ <*(goto (il. 0))*>) ^ <*(AddTo (dl. 2),(dl. 3))*>) ^ <*(goto (il. 0))*>) ^ <*(halt SCM )*>;
coherence
(((((((<*((dl. 1) =0_goto (il. 8))*> ^ <*((dl. 4) := (dl. 0))*>) ^ <*(Divide (dl. 1),(dl. 4))*>) ^ <*((dl. 4) =0_goto (il. 6))*>) ^ <*(AddTo (dl. 3),(dl. 2))*>) ^ <*(goto (il. 0))*>) ^ <*(AddTo (dl. 2),(dl. 3))*>) ^ <*(goto (il. 0))*>) ^ <*(halt SCM )*> is FinSequence of the Instructions of SCM
;
end;

:: deftheorem Def3 defines Fusc_Program FIB_FUSC:def 3 :
Fusc_Program = (((((((<*((dl. 1) =0_goto (il. 8))*> ^ <*((dl. 4) := (dl. 0))*>) ^ <*(Divide (dl. 1),(dl. 4))*>) ^ <*((dl. 4) =0_goto (il. 6))*>) ^ <*(AddTo (dl. 3),(dl. 2))*>) ^ <*(goto (il. 0))*>) ^ <*(AddTo (dl. 2),(dl. 3))*>) ^ <*(goto (il. 0))*>) ^ <*(halt SCM )*>;

theorem Th2: :: FIB_FUSC:2
for b1 being Nat st b1 > 0 holds
for b2 being State-consisting of 0,0,0, Fusc_Program ,((<*2*> ^ <*b1*>) ^ <*1*>) ^ <*0*> holds
( b2 is halting & (Result b2) . (dl. 3) = Fusc b1 & Complexity b2 = (6 * ([\(log 2,b1)/] + 1)) + 1 )
proof end;

theorem Th3: :: FIB_FUSC:3
for b1, b2, b3, b4 being Nat
for b5 being State-consisting of 3,0,0, Fib_Program ,((<*1*> ^ <*b1*>) ^ <*b3*>) ^ <*b4*> st b1 > 0 & b3 = Fib b2 & b4 = Fib (b2 + 1) holds
( b5 is halting & Complexity b5 = (6 * b1) - 4 & ex b6 being Nat st
( b6 = (b2 + b1) - 1 & (Result b5) . (dl. 2) = Fib b6 & (Result b5) . (dl. 3) = Fib (b6 + 1) ) )
proof end;

theorem Th4: :: FIB_FUSC:4
canceled;

theorem Th5: :: FIB_FUSC:5
for b1, b2, b3, b4 being Nat
for b5 being State-consisting of 0,0,0, Fusc_Program ,((<*2*> ^ <*b1*>) ^ <*b3*>) ^ <*b4*> st b2 > 0 & Fusc b2 = (b3 * (Fusc b1)) + (b4 * (Fusc (b1 + 1))) holds
( b5 is halting & (Result b5) . (dl. 3) = Fusc b2 & ( b1 = 0 implies Complexity b5 = 1 ) & ( b1 > 0 implies Complexity b5 = (6 * ([\(log 2,b1)/] + 1)) + 1 ) )
proof end;

theorem Th6: :: FIB_FUSC:6
for b1 being Nat st b1 > 0 holds
for b2 being State-consisting of 0,0,0, Fusc_Program ,((<*2*> ^ <*b1*>) ^ <*1*>) ^ <*0*> holds
( b2 is halting & (Result b2) . (dl. 3) = Fusc b1 & ( b1 = 0 implies Complexity b2 = 1 ) & ( b1 > 0 implies Complexity b2 = (6 * ([\(log 2,b1)/] + 1)) + 1 ) )
proof end;