:: RADIX_1 semantic presentation

theorem Th1: :: RADIX_1:1
canceled;

theorem Th2: :: RADIX_1:2
for b1, b2 being Nat st b1 mod b2 = b2 - 1 holds
(b1 + 1) mod b2 = 0
proof end;

theorem Th3: :: RADIX_1:3
for b1, b2 being Nat st b1 <> 0 & b2 mod b1 < b1 - 1 holds
(b2 + 1) mod b1 = (b2 mod b1) + 1
proof end;

theorem Th4: :: RADIX_1:4
for b1, b2, b3 being Nat st b1 <> 0 holds
(b2 mod (b1 * b3)) mod b3 = b2 mod b3
proof end;

theorem Th5: :: RADIX_1:5
for b1, b2 being Nat holds
( not b1 <> 0 or (b2 + 1) mod b1 = 0 or (b2 + 1) mod b1 = (b2 mod b1) + 1 )
proof end;

theorem Th6: :: RADIX_1:6
for b1, b2, b3 being Nat st b1 <> 0 & b2 <> 0 holds
(b3 mod (b1 |^ b2)) div (b1 |^ (b2 -' 1)) < b1
proof end;

theorem Th7: :: RADIX_1:7
for b1, b2, b3 being Nat st b1 <= b2 holds
b3 |^ b1 divides b3 |^ b2
proof end;

theorem Th8: :: RADIX_1:8
for b1, b2, b3 being Integer st b1 > 0 & b2 >= 0 holds
(b3 mod (b1 * b2)) mod b2 = b3 mod b2
proof end;

definition
let c1 be Nat;
func Radix c1 -> Nat equals :: RADIX_1:def 1
2 to_power a1;
correctness
coherence
2 to_power c1 is Nat
;
proof end;
end;

:: deftheorem Def1 defines Radix RADIX_1:def 1 :
for b1 being Nat holds Radix b1 = 2 to_power b1;

definition
let c1 be Nat;
func c1 -SD -> set equals :: RADIX_1:def 2
{ b1 where B is Element of INT : ( b1 <= (Radix a1) - 1 & b1 >= (- (Radix a1)) + 1 ) } ;
correctness
coherence
{ b1 where B is Element of INT : ( b1 <= (Radix c1) - 1 & b1 >= (- (Radix c1)) + 1 ) } is set
;
;
end;

:: deftheorem Def2 defines -SD RADIX_1:def 2 :
for b1 being Nat holds b1 -SD = { b2 where B is Element of INT : ( b2 <= (Radix b1) - 1 & b2 >= (- (Radix b1)) + 1 ) } ;

theorem Th9: :: RADIX_1:9
for b1 being Nat holds Radix b1 <> 0 by POWER:39;

Lemma7: for b1 being Nat st b1 >= 2 holds
Radix b1 >= 2 + 2
proof end;

theorem Th10: :: RADIX_1:10
for b1 being set holds
( b1 in 0 -SD iff b1 = 0 )
proof end;

theorem Th11: :: RADIX_1:11
0 -SD = {0} by Th10, TARSKI:def 1;

theorem Th12: :: RADIX_1:12
for b1 being Nat holds b1 -SD c= (b1 + 1) -SD
proof end;

theorem Th13: :: RADIX_1:13
for b1 being Nat
for b2 being set st b2 in b1 -SD holds
b2 is Integer
proof end;

theorem Th14: :: RADIX_1:14
for b1 being Nat holds b1 -SD c= INT
proof end;

theorem Th15: :: RADIX_1:15
for b1 being Nat
for b2 being Integer st b2 in b1 -SD holds
( b2 <= (Radix b1) - 1 & b2 >= (- (Radix b1)) + 1 )
proof end;

theorem Th16: :: RADIX_1:16
for b1 being Nat holds 0 in b1 -SD
proof end;

registration
let c1 be Nat;
cluster a1 -SD -> non empty ;
coherence
not c1 -SD is empty
by Th16;
end;

definition
let c1 be Nat;
redefine func -SD as c1 -SD -> non empty Subset of INT ;
coherence
c1 -SD is non empty Subset of INT
by Th14;
end;

theorem Th17: :: RADIX_1:17
canceled;

theorem Th18: :: RADIX_1:18
for b1, b2, b3 being Nat
for b4 being Tuple of b2,(b3 -SD ) st b1 in Seg b2 holds
b4 . b1 is Element of b3 -SD
proof end;

definition
let c1, c2, c3 be Nat;
let c4 be Tuple of c3,(c2 -SD );
func DigA c4,c1 -> Integer equals :Def3: :: RADIX_1:def 3
a4 . a1 if a1 in Seg a3
0 if a1 = 0
;
coherence
( ( c1 in Seg c3 implies c4 . c1 is Integer ) & ( c1 = 0 implies 0 is Integer ) )
proof end;
consistency
for b1 being Integer st c1 in Seg c3 & c1 = 0 holds
( b1 = c4 . c1 iff b1 = 0 )
by FINSEQ_1:3;
end;

:: deftheorem Def3 defines DigA RADIX_1:def 3 :
for b1, b2, b3 being Nat
for b4 being Tuple of b3,(b2 -SD ) holds
( ( b1 in Seg b3 implies DigA b4,b1 = b4 . b1 ) & ( b1 = 0 implies DigA b4,b1 = 0 ) );

definition
let c1, c2, c3 be Nat;
let c4 be Tuple of c3,(c2 -SD );
func DigB c4,c1 -> Element of INT equals :: RADIX_1:def 4
DigA a4,a1;
coherence
DigA c4,c1 is Element of INT
by INT_1:def 2;
end;

:: deftheorem Def4 defines DigB RADIX_1:def 4 :
for b1, b2, b3 being Nat
for b4 being Tuple of b3,(b2 -SD ) holds DigB b4,b1 = DigA b4,b1;

theorem Th19: :: RADIX_1:19
for b1, b2, b3 being Nat
for b4 being Tuple of b2,(b3 -SD ) st b1 in Seg b2 holds
DigA b4,b1 is Element of b3 -SD
proof end;

theorem Th20: :: RADIX_1:20
for b1 being Nat
for b2 being Tuple of 1,INT st b2 /. 1 = b1 holds
b2 = <*b1*>
proof end;

definition
let c1, c2, c3 be Nat;
let c4 be Tuple of c3,(c2 -SD );
func SubDigit c4,c1,c2 -> Element of INT equals :: RADIX_1:def 5
((Radix a2) |^ (a1 -' 1)) * (DigB a4,a1);
coherence
((Radix c2) |^ (c1 -' 1)) * (DigB c4,c1) is Element of INT
by INT_1:def 2;
end;

:: deftheorem Def5 defines SubDigit RADIX_1:def 5 :
for b1, b2, b3 being Nat
for b4 being Tuple of b3,(b2 -SD ) holds SubDigit b4,b1,b2 = ((Radix b2) |^ (b1 -' 1)) * (DigB b4,b1);

definition
let c1, c2 be Nat;
let c3 be Tuple of c1,(c2 -SD );
func DigitSD c3 -> Tuple of a1,INT means :Def6: :: RADIX_1:def 6
for b1 being Nat st b1 in Seg a1 holds
a4 /. b1 = SubDigit a3,b1,a2;
existence
ex b1 being Tuple of c1,INT st
for b2 being Nat st b2 in Seg c1 holds
b1 /. b2 = SubDigit c3,b2,c2
proof end;
uniqueness
for b1, b2 being Tuple of c1,INT st ( for b3 being Nat st b3 in Seg c1 holds
b1 /. b3 = SubDigit c3,b3,c2 ) & ( for b3 being Nat st b3 in Seg c1 holds
b2 /. b3 = SubDigit c3,b3,c2 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def6 defines DigitSD RADIX_1:def 6 :
for b1, b2 being Nat
for b3 being Tuple of b1,(b2 -SD )
for b4 being Tuple of b1,INT holds
( b4 = DigitSD b3 iff for b5 being Nat st b5 in Seg b1 holds
b4 /. b5 = SubDigit b3,b5,b2 );

definition
let c1, c2 be Nat;
let c3 be Tuple of c1,(c2 -SD );
func SDDec c3 -> Integer equals :: RADIX_1:def 7
Sum (DigitSD a3);
coherence
Sum (DigitSD c3) is Integer
;
end;

:: deftheorem Def7 defines SDDec RADIX_1:def 7 :
for b1, b2 being Nat
for b3 being Tuple of b1,(b2 -SD ) holds SDDec b3 = Sum (DigitSD b3);

definition
let c1, c2, c3 be Nat;
func DigitDC c3,c1,c2 -> Element of a2 -SD equals :: RADIX_1:def 8
(a3 mod ((Radix a2) |^ a1)) div ((Radix a2) |^ (a1 -' 1));
coherence
(c3 mod ((Radix c2) |^ c1)) div ((Radix c2) |^ (c1 -' 1)) is Element of c2 -SD
proof end;
end;

:: deftheorem Def8 defines DigitDC RADIX_1:def 8 :
for b1, b2, b3 being Nat holds DigitDC b3,b1,b2 = (b3 mod ((Radix b2) |^ b1)) div ((Radix b2) |^ (b1 -' 1));

definition
let c1, c2, c3 be Nat;
func DecSD c3,c2,c1 -> Tuple of a2,(a1 -SD ) means :Def9: :: RADIX_1:def 9
for b1 being Nat st b1 in Seg a2 holds
DigA a4,b1 = DigitDC a3,b1,a1;
existence
ex b1 being Tuple of c2,(c1 -SD ) st
for b2 being Nat st b2 in Seg c2 holds
DigA b1,b2 = DigitDC c3,b2,c1
proof end;
uniqueness
for b1, b2 being Tuple of c2,(c1 -SD ) st ( for b3 being Nat st b3 in Seg c2 holds
DigA b1,b3 = DigitDC c3,b3,c1 ) & ( for b3 being Nat st b3 in Seg c2 holds
DigA b2,b3 = DigitDC c3,b3,c1 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def9 defines DecSD RADIX_1:def 9 :
for b1, b2, b3 being Nat
for b4 being Tuple of b2,(b1 -SD ) holds
( b4 = DecSD b3,b2,b1 iff for b5 being Nat st b5 in Seg b2 holds
DigA b4,b5 = DigitDC b3,b5,b1 );

definition
let c1 be Integer;
func SD_Add_Carry c1 -> Integer equals :Def10: :: RADIX_1:def 10
1 if a1 > 2
- 1 if a1 < - 2
otherwise 0;
coherence
( ( c1 > 2 implies 1 is Integer ) & ( c1 < - 2 implies - 1 is Integer ) & ( not c1 > 2 & not c1 < - 2 implies 0 is Integer ) )
;
consistency
for b1 being Integer st c1 > 2 & c1 < - 2 holds
( b1 = 1 iff b1 = - 1 )
;
end;

:: deftheorem Def10 defines SD_Add_Carry RADIX_1:def 10 :
for b1 being Integer holds
( ( b1 > 2 implies SD_Add_Carry b1 = 1 ) & ( b1 < - 2 implies SD_Add_Carry b1 = - 1 ) & ( not b1 > 2 & not b1 < - 2 implies SD_Add_Carry b1 = 0 ) );

theorem Th21: :: RADIX_1:21
SD_Add_Carry 0 = 0 by Def10;

Lemma22: for b1 being Integer holds
( - 1 <= SD_Add_Carry b1 & SD_Add_Carry b1 <= 1 )
proof end;

definition
let c1 be Integer;
let c2 be Nat;
func SD_Add_Data c1,c2 -> Integer equals :: RADIX_1:def 11
a1 - ((SD_Add_Carry a1) * (Radix a2));
coherence
c1 - ((SD_Add_Carry c1) * (Radix c2)) is Integer
;
end;

:: deftheorem Def11 defines SD_Add_Data RADIX_1:def 11 :
for b1 being Integer
for b2 being Nat holds SD_Add_Data b1,b2 = b1 - ((SD_Add_Carry b1) * (Radix b2));

theorem Th22: :: RADIX_1:22
for b1 being Nat holds SD_Add_Data 0,b1 = 0 by Th21;

theorem Th23: :: RADIX_1:23
for b1 being Nat
for b2, b3 being Integer st b1 >= 2 & b2 in b1 -SD & b3 in b1 -SD holds
( (- (Radix b1)) + 2 <= SD_Add_Data (b2 + b3),b1 & SD_Add_Data (b2 + b3),b1 <= (Radix b1) - 2 )
proof end;

definition
let c1, c2, c3 be Nat;
pred c2 is_represented_by c1,c3 means :Def12: :: RADIX_1:def 12
a2 < (Radix a3) |^ a1;
end;

:: deftheorem Def12 defines is_represented_by RADIX_1:def 12 :
for b1, b2, b3 being Nat holds
( b2 is_represented_by b1,b3 iff b2 < (Radix b3) |^ b1 );

theorem Th24: :: RADIX_1:24
for b1, b2 being Nat st b1 is_represented_by 1,b2 holds
DigA (DecSD b1,1,b2),1 = b1
proof end;

theorem Th25: :: RADIX_1:25
for b1, b2 being Nat st b2 >= 1 holds
for b3 being Nat st b3 is_represented_by b2,b1 holds
b3 = SDDec (DecSD b3,b2,b1)
proof end;

theorem Th26: :: RADIX_1:26
for b1, b2, b3 being Nat st b1 >= 2 & b2 is_represented_by 1,b1 & b3 is_represented_by 1,b1 holds
SD_Add_Carry ((DigA (DecSD b2,1,b1),1) + (DigA (DecSD b3,1,b1),1)) = SD_Add_Carry (b2 + b3)
proof end;

Lemma27: for b1, b2, b3, b4 being Nat st b4 in Seg b1 holds
DigA (DecSD b2,(b1 + 1),b3),b4 = DigA (DecSD (b2 mod ((Radix b3) |^ b1)),b1,b3),b4
proof end;

theorem Th27: :: RADIX_1:27
for b1, b2, b3 being Nat st b1 is_represented_by b2 + 1,b3 holds
DigA (DecSD b1,(b2 + 1),b3),(b2 + 1) = b1 div ((Radix b3) |^ b2)
proof end;

definition
let c1, c2, c3 be Nat;
let c4, c5 be Tuple of c3,(c1 -SD );
assume E29: ( c2 in Seg c3 & c1 >= 2 ) ;
func Add c4,c5,c2,c1 -> Element of a1 -SD equals :Def13: :: RADIX_1:def 13
(SD_Add_Data ((DigA a4,a2) + (DigA a5,a2)),a1) + (SD_Add_Carry ((DigA a4,(a2 -' 1)) + (DigA a5,(a2 -' 1))));
coherence
(SD_Add_Data ((DigA c4,c2) + (DigA c5,c2)),c1) + (SD_Add_Carry ((DigA c4,(c2 -' 1)) + (DigA c5,(c2 -' 1)))) is Element of c1 -SD
proof end;
end;

:: deftheorem Def13 defines Add RADIX_1:def 13 :
for b1, b2, b3 being Nat
for b4, b5 being Tuple of b3,(b1 -SD ) st b2 in Seg b3 & b1 >= 2 holds
Add b4,b5,b2,b1 = (SD_Add_Data ((DigA b4,b2) + (DigA b5,b2)),b1) + (SD_Add_Carry ((DigA b4,(b2 -' 1)) + (DigA b5,(b2 -' 1))));

definition
let c1, c2 be Nat;
let c3, c4 be Tuple of c1,(c2 -SD );
func c3 '+' c4 -> Tuple of a1,(a2 -SD ) means :Def14: :: RADIX_1:def 14
for b1 being Nat st b1 in Seg a1 holds
DigA a5,b1 = Add a3,a4,b1,a2;
existence
ex b1 being Tuple of c1,(c2 -SD ) st
for b2 being Nat st b2 in Seg c1 holds
DigA b1,b2 = Add c3,c4,b2,c2
proof end;
uniqueness
for b1, b2 being Tuple of c1,(c2 -SD ) st ( for b3 being Nat st b3 in Seg c1 holds
DigA b1,b3 = Add c3,c4,b3,c2 ) & ( for b3 being Nat st b3 in Seg c1 holds
DigA b2,b3 = Add c3,c4,b3,c2 ) holds
b1 = b2
proof end;
end;

:: deftheorem Def14 defines '+' RADIX_1:def 14 :
for b1, b2 being Nat
for b3, b4, b5 being Tuple of b1,(b2 -SD ) holds
( b5 = b3 '+' b4 iff for b6 being Nat st b6 in Seg b1 holds
DigA b5,b6 = Add b3,b4,b6,b2 );

theorem Th28: :: RADIX_1:28
for b1, b2, b3 being Nat st b1 >= 2 & b2 is_represented_by 1,b1 & b3 is_represented_by 1,b1 holds
SDDec ((DecSD b2,1,b1) '+' (DecSD b3,1,b1)) = SD_Add_Data (b2 + b3),b1
proof end;

theorem Th29: :: RADIX_1:29
for b1 being Nat st b1 >= 1 holds
for b2, b3, b4 being Nat st b2 >= 2 & b3 is_represented_by b1,b2 & b4 is_represented_by b1,b2 holds
b3 + b4 = (SDDec ((DecSD b3,b1,b2) '+' (DecSD b4,b1,b2))) + (((Radix b2) |^ b1) * (SD_Add_Carry ((DigA (DecSD b3,b1,b2),b1) + (DigA (DecSD b4,b1,b2),b1))))
proof end;