:: PRE_FF semantic presentation

definition
let c1, c2 be non empty set ;
let c3 be non empty Subset of c1;
let c4 be non empty Subset of c2;
let c5 be Element of [:c3,c4:];
redefine func `1 as c5 `1 -> Element of a3;
coherence
c5 `1 is Element of c3
proof end;
redefine func `2 as c5 `2 -> Element of a4;
coherence
c5 `2 is Element of c4
proof end;
end;

definition
let c1 be Nat;
func Fib c1 -> Nat means :Def1: :: PRE_FF:def 1
ex b1 being Function of NAT ,[:NAT ,NAT :] st
( a2 = (b1 . a1) `1 & b1 . 0 = [0,1] & ( for b2 being Nat holds b1 . (b2 + 1) = [((b1 . b2) `2 ),(((b1 . b2) `1 ) + ((b1 . b2) `2 ))] ) );
existence
ex b1 being Natex b2 being Function of NAT ,[:NAT ,NAT :] st
( b1 = (b2 . c1) `1 & b2 . 0 = [0,1] & ( for b3 being Nat holds b2 . (b3 + 1) = [((b2 . b3) `2 ),(((b2 . b3) `1 ) + ((b2 . b3) `2 ))] ) )
proof end;
uniqueness
for b1, b2 being Nat st ex b3 being Function of NAT ,[:NAT ,NAT :] st
( b1 = (b3 . c1) `1 & b3 . 0 = [0,1] & ( for b4 being Nat holds b3 . (b4 + 1) = [((b3 . b4) `2 ),(((b3 . b4) `1 ) + ((b3 . b4) `2 ))] ) ) & ex b3 being Function of NAT ,[:NAT ,NAT :] st
( b2 = (b3 . c1) `1 & b3 . 0 = [0,1] & ( for b4 being Nat holds b3 . (b4 + 1) = [((b3 . b4) `2 ),(((b3 . b4) `1 ) + ((b3 . b4) `2 ))] ) ) holds
b1 = b2
proof end;
end;

:: deftheorem Def1 defines Fib PRE_FF:def 1 :
for b1, b2 being Nat holds
( b2 = Fib b1 iff ex b3 being Function of NAT ,[:NAT ,NAT :] st
( b2 = (b3 . b1) `1 & b3 . 0 = [0,1] & ( for b4 being Nat holds b3 . (b4 + 1) = [((b3 . b4) `2 ),(((b3 . b4) `1 ) + ((b3 . b4) `2 ))] ) ) );

theorem Th1: :: PRE_FF:1
( Fib 0 = 0 & Fib 1 = 1 & ( for b1 being Nat holds Fib ((b1 + 1) + 1) = (Fib b1) + (Fib (b1 + 1)) ) )
proof end;

theorem Th2: :: PRE_FF:2
for b1 being Integer holds b1 div 1 = b1
proof end;

theorem Th3: :: PRE_FF:3
for b1, b2 being Integer st b2 > 0 & b1 div b2 = 0 holds
b1 < b2
proof end;

theorem Th4: :: PRE_FF:4
for b1, b2 being Integer st 0 <= b1 & b1 < b2 holds
b1 div b2 = 0
proof end;

theorem Th5: :: PRE_FF:5
for b1, b2, b3 being Integer st b2 > 0 & b3 > 0 holds
(b1 div b2) div b3 = b1 div (b2 * b3)
proof end;

theorem Th6: :: PRE_FF:6
for b1 being Integer holds
( b1 mod 2 = 0 or b1 mod 2 = 1 )
proof end;

theorem Th7: :: PRE_FF:7
for b1 being Integer st b1 is Nat holds
b1 div 2 is Nat
proof end;

theorem Th8: :: PRE_FF:8
canceled;

theorem Th9: :: PRE_FF:9
canceled;

theorem Th10: :: PRE_FF:10
for b1, b2, b3 being real number st b1 <= b2 & b3 > 1 holds
b3 to_power b1 <= b3 to_power b2
proof end;

theorem Th11: :: PRE_FF:11
for b1, b2 being real number st b1 >= b2 holds
[\b1/] >= [\b2/]
proof end;

theorem Th12: :: PRE_FF:12
for b1, b2, b3 being real number st b1 > 1 & b2 > 0 & b3 >= b2 holds
log b1,b3 >= log b1,b2
proof end;

theorem Th13: :: PRE_FF:13
for b1 being Nat st b1 > 0 holds
[\(log 2,(2 * b1))/] + 1 <> [\(log 2,((2 * b1) + 1))/]
proof end;

theorem Th14: :: PRE_FF:14
for b1 being Nat st b1 > 0 holds
[\(log 2,(2 * b1))/] + 1 >= [\(log 2,((2 * b1) + 1))/]
proof end;

theorem Th15: :: PRE_FF:15
for b1 being Nat st b1 > 0 holds
[\(log 2,(2 * b1))/] = [\(log 2,((2 * b1) + 1))/]
proof end;

theorem Th16: :: PRE_FF:16
for b1 being Nat st b1 > 0 holds
[\(log 2,b1)/] + 1 = [\(log 2,((2 * b1) + 1))/]
proof end;

definition
let c1 be Function of NAT ,NAT * ;
let c2 be Nat;
redefine func . as c1 . c2 -> FinSequence of NAT ;
coherence
c1 . c2 is FinSequence of NAT
proof end;
end;

defpred S1[ Nat, FinSequence of NAT , set ] means ( ( for b1 being Nat st a1 + 2 = 2 * b1 holds
a3 = a2 ^ <*(a2 /. b1)*> ) & ( for b1 being Nat st a1 + 2 = (2 * b1) + 1 holds
a3 = a2 ^ <*((a2 /. b1) + (a2 /. (b1 + 1)))*> ) );

Lemma8: for b1 being Nat
for b2 being Element of NAT * ex b3 being Element of NAT * st S1[b1,b2,b3]
proof end;

defpred S2[ Nat, FinSequence of NAT , set ] means ( ( for b1 being Nat st a1 + 2 = 2 * b1 holds
a3 = a2 ^ <*(a2 /. b1)*> ) & ( for b1 being Nat st a1 + 2 = (2 * b1) + 1 holds
a3 = a2 ^ <*((a2 /. b1) + (a2 /. (b1 + 1)))*> ) );

Lemma9: for b1 being Nat
for b2, b3, b4 being Element of NAT * st S2[b1,b2,b3] & S2[b1,b2,b4] holds
b3 = b4
proof end;

reconsider c1 = <*1*> as Element of NAT * by FINSEQ_1:def 11;

consider c2 being Function of NAT ,NAT * such that
Lemma10: c2 . 0 = c1 and
Lemma11: for b1 being Nat holds S1[b1,c2 . b1,c2 . (b1 + 1)] from RECDEF_1:sch 2(Lemma8);

definition
let c3 be Nat;
func Fusc c1 -> Nat means :Def2: :: PRE_FF:def 2
a2 = 0 if a1 = 0
otherwise ex b1 being Natex b2 being Function of NAT ,NAT * st
( b1 + 1 = a1 & a2 = (b2 . b1) /. a1 & b2 . 0 = <*1*> & ( for b3 being Nat holds
( ( for b4 being Nat st b3 + 2 = 2 * b4 holds
b2 . (b3 + 1) = (b2 . b3) ^ <*((b2 . b3) /. b4)*> ) & ( for b4 being Nat st b3 + 2 = (2 * b4) + 1 holds
b2 . (b3 + 1) = (b2 . b3) ^ <*(((b2 . b3) /. b4) + ((b2 . b3) /. (b4 + 1)))*> ) ) ) );
consistency
for b1 being Nat holds verum
;
existence
( ( c3 = 0 implies ex b1 being Nat st b1 = 0 ) & ( not c3 = 0 implies ex b1, b2 being Natex b3 being Function of NAT ,NAT * st
( b2 + 1 = c3 & b1 = (b3 . b2) /. c3 & b3 . 0 = <*1*> & ( for b4 being Nat holds
( ( for b5 being Nat st b4 + 2 = 2 * b5 holds
b3 . (b4 + 1) = (b3 . b4) ^ <*((b3 . b4) /. b5)*> ) & ( for b5 being Nat st b4 + 2 = (2 * b5) + 1 holds
b3 . (b4 + 1) = (b3 . b4) ^ <*(((b3 . b4) /. b5) + ((b3 . b4) /. (b5 + 1)))*> ) ) ) ) ) )
proof end;
uniqueness
for b1, b2 being Nat holds
( ( c3 = 0 & b1 = 0 & b2 = 0 implies b1 = b2 ) & ( not c3 = 0 & ex b3 being Natex b4 being Function of NAT ,NAT * st
( b3 + 1 = c3 & b1 = (b4 . b3) /. c3 & b4 . 0 = <*1*> & ( for b5 being Nat holds
( ( for b6 being Nat st b5 + 2 = 2 * b6 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*((b4 . b5) /. b6)*> ) & ( for b6 being Nat st b5 + 2 = (2 * b6) + 1 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*(((b4 . b5) /. b6) + ((b4 . b5) /. (b6 + 1)))*> ) ) ) ) & ex b3 being Natex b4 being Function of NAT ,NAT * st
( b3 + 1 = c3 & b2 = (b4 . b3) /. c3 & b4 . 0 = <*1*> & ( for b5 being Nat holds
( ( for b6 being Nat st b5 + 2 = 2 * b6 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*((b4 . b5) /. b6)*> ) & ( for b6 being Nat st b5 + 2 = (2 * b6) + 1 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*(((b4 . b5) /. b6) + ((b4 . b5) /. (b6 + 1)))*> ) ) ) ) implies b1 = b2 ) )
proof end;
end;

:: deftheorem Def2 defines Fusc PRE_FF:def 2 :
for b1, b2 being Nat holds
( ( b1 = 0 implies ( b2 = Fusc b1 iff b2 = 0 ) ) & ( not b1 = 0 implies ( b2 = Fusc b1 iff ex b3 being Natex b4 being Function of NAT ,NAT * st
( b3 + 1 = b1 & b2 = (b4 . b3) /. b1 & b4 . 0 = <*1*> & ( for b5 being Nat holds
( ( for b6 being Nat st b5 + 2 = 2 * b6 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*((b4 . b5) /. b6)*> ) & ( for b6 being Nat st b5 + 2 = (2 * b6) + 1 holds
b4 . (b5 + 1) = (b4 . b5) ^ <*(((b4 . b5) /. b6) + ((b4 . b5) /. (b6 + 1)))*> ) ) ) ) ) ) );

theorem Th17: :: PRE_FF:17
( Fusc 0 = 0 & Fusc 1 = 1 & ( for b1 being Nat holds
( Fusc (2 * b1) = Fusc b1 & Fusc ((2 * b1) + 1) = (Fusc b1) + (Fusc (b1 + 1)) ) ) )
proof end;

theorem Th18: :: PRE_FF:18
for b1, b2 being Nat st b1 <> 0 & b1 = 2 * b2 holds
b2 < b1
proof end;

theorem Th19: :: PRE_FF:19
for b1, b2 being Nat st b1 = (2 * b2) + 1 holds
b2 < b1
proof end;

theorem Th20: :: PRE_FF:20
for b1, b2 being Nat holds b2 = (b1 * (Fusc 0)) + (b2 * (Fusc (0 + 1))) by Th17;

theorem Th21: :: PRE_FF:21
for b1, b2, b3, b4, b5 being Nat st b1 = (2 * b2) + 1 & Fusc b5 = (b3 * (Fusc b1)) + (b4 * (Fusc (b1 + 1))) holds
Fusc b5 = (b3 * (Fusc b2)) + ((b4 + b3) * (Fusc (b2 + 1)))
proof end;

theorem Th22: :: PRE_FF:22
for b1, b2, b3, b4, b5 being Nat st b1 = 2 * b2 & Fusc b5 = (b3 * (Fusc b1)) + (b4 * (Fusc (b1 + 1))) holds
Fusc b5 = ((b3 + b4) * (Fusc b2)) + (b4 * (Fusc (b2 + 1)))
proof end;