5 *) |
5 *) |
6 |
6 |
7 header{*Arithmetic on Binary Integers*} |
7 header{*Arithmetic on Binary Integers*} |
8 |
8 |
9 theory Numeral |
9 theory Numeral |
10 imports IntDef |
10 imports IntDef Datatype |
11 files "Tools/numeral_syntax.ML" |
11 files "../Tools/numeral_syntax.ML" |
12 begin |
12 begin |
13 |
13 |
14 text{* The file @{text numeral_syntax.ML} hides the constructors Pls and Min. |
14 text{* The file @{text numeral_syntax.ML} hides the constructors Pls and Min. |
15 Only qualified access Numeral.Pls and Numeral.Min is allowed. |
15 Only qualified access Numeral.Pls and Numeral.Min is allowed. |
|
16 The datatype constructors bit.B0 and bit.B1 are similarly hidden. |
16 We do not hide Bit because we need the BIT infix syntax.*} |
17 We do not hide Bit because we need the BIT infix syntax.*} |
17 |
18 |
18 text{*This formalization defines binary arithmetic in terms of the integers |
19 text{*This formalization defines binary arithmetic in terms of the integers |
19 rather than using a datatype. This avoids multiple representations (leading |
20 rather than using a datatype. This avoids multiple representations (leading |
20 zeroes, etc.) See @{text "ZF/Integ/twos-compl.ML"}, function @{text |
21 zeroes, etc.) See @{text "ZF/Integ/twos-compl.ML"}, function @{text |
29 |
30 |
30 typedef (Bin) |
31 typedef (Bin) |
31 bin = "UNIV::int set" |
32 bin = "UNIV::int set" |
32 by (auto) |
33 by (auto) |
33 |
34 |
|
35 |
|
36 text{*This datatype avoids the use of type @{typ bool}, which would make |
|
37 all of the rewrite rules higher-order. If the use of datatype causes |
|
38 problems, this two-element type can easily be formalized using typedef.*} |
|
39 datatype bit = B0 | B1 |
|
40 |
34 constdefs |
41 constdefs |
35 Pls :: "bin" |
42 Pls :: "bin" |
36 "Pls == Abs_Bin 0" |
43 "Pls == Abs_Bin 0" |
37 |
44 |
38 Min :: "bin" |
45 Min :: "bin" |
39 "Min == Abs_Bin (- 1)" |
46 "Min == Abs_Bin (- 1)" |
40 |
47 |
41 Bit :: "[bin,bool] => bin" (infixl "BIT" 90) |
48 Bit :: "[bin,bit] => bin" (infixl "BIT" 90) |
42 --{*That is, 2w+b*} |
49 --{*That is, 2w+b*} |
43 "w BIT b == Abs_Bin ((if b then 1 else 0) + Rep_Bin w + Rep_Bin w)" |
50 "w BIT b == Abs_Bin ((case b of B0 => 0 | B1 => 1) + Rep_Bin w + Rep_Bin w)" |
44 |
51 |
45 |
52 |
46 axclass |
53 axclass |
47 number < type -- {* for numeric types: nat, int, real, \dots *} |
54 number < type -- {* for numeric types: nat, int, real, \dots *} |
48 |
55 |
103 lemmas Bin_simps = |
110 lemmas Bin_simps = |
104 bin_succ_def bin_pred_def bin_minus_def bin_add_def bin_mult_def |
111 bin_succ_def bin_pred_def bin_minus_def bin_add_def bin_mult_def |
105 Pls_def Min_def Bit_def Abs_Bin_inverse Rep_Bin_inverse Bin_def |
112 Pls_def Min_def Bit_def Abs_Bin_inverse Rep_Bin_inverse Bin_def |
106 |
113 |
107 text{*Removal of leading zeroes*} |
114 text{*Removal of leading zeroes*} |
108 lemma Pls_0_eq [simp]: "Numeral.Pls BIT False = Numeral.Pls" |
115 lemma Pls_0_eq [simp]: "Numeral.Pls BIT bit.B0 = Numeral.Pls" |
109 by (simp add: Bin_simps) |
116 by (simp add: Bin_simps) |
110 |
117 |
111 lemma Min_1_eq [simp]: "Numeral.Min BIT True = Numeral.Min" |
118 lemma Min_1_eq [simp]: "Numeral.Min BIT bit.B1 = Numeral.Min" |
112 by (simp add: Bin_simps) |
119 by (simp add: Bin_simps) |
113 |
120 |
114 subsection{*The Functions @{term bin_succ}, @{term bin_pred} and @{term bin_minus}*} |
121 subsection{*The Functions @{term bin_succ}, @{term bin_pred} and @{term bin_minus}*} |
115 |
122 |
116 lemma bin_succ_Pls [simp]: "bin_succ Numeral.Pls = Numeral.Pls BIT True" |
123 lemma bin_succ_Pls [simp]: "bin_succ Numeral.Pls = Numeral.Pls BIT bit.B1" |
117 by (simp add: Bin_simps) |
124 by (simp add: Bin_simps) |
118 |
125 |
119 lemma bin_succ_Min [simp]: "bin_succ Numeral.Min = Numeral.Pls" |
126 lemma bin_succ_Min [simp]: "bin_succ Numeral.Min = Numeral.Pls" |
120 by (simp add: Bin_simps) |
127 by (simp add: Bin_simps) |
121 |
128 |
122 lemma bin_succ_1 [simp]: "bin_succ(w BIT True) = (bin_succ w) BIT False" |
129 lemma bin_succ_1 [simp]: "bin_succ(w BIT bit.B1) = (bin_succ w) BIT bit.B0" |
123 by (simp add: Bin_simps add_ac) |
130 by (simp add: Bin_simps add_ac) |
124 |
131 |
125 lemma bin_succ_0 [simp]: "bin_succ(w BIT False) = w BIT True" |
132 lemma bin_succ_0 [simp]: "bin_succ(w BIT bit.B0) = w BIT bit.B1" |
126 by (simp add: Bin_simps add_ac) |
133 by (simp add: Bin_simps add_ac) |
127 |
134 |
128 lemma bin_pred_Pls [simp]: "bin_pred Numeral.Pls = Numeral.Min" |
135 lemma bin_pred_Pls [simp]: "bin_pred Numeral.Pls = Numeral.Min" |
129 by (simp add: Bin_simps) |
136 by (simp add: Bin_simps) |
130 |
137 |
131 lemma bin_pred_Min [simp]: "bin_pred Numeral.Min = Numeral.Min BIT False" |
138 lemma bin_pred_Min [simp]: "bin_pred Numeral.Min = Numeral.Min BIT bit.B0" |
132 by (simp add: Bin_simps diff_minus) |
139 by (simp add: Bin_simps diff_minus) |
133 |
140 |
134 lemma bin_pred_1 [simp]: "bin_pred(w BIT True) = w BIT False" |
141 lemma bin_pred_1 [simp]: "bin_pred(w BIT bit.B1) = w BIT bit.B0" |
135 by (simp add: Bin_simps) |
142 by (simp add: Bin_simps) |
136 |
143 |
137 lemma bin_pred_0 [simp]: "bin_pred(w BIT False) = (bin_pred w) BIT True" |
144 lemma bin_pred_0 [simp]: "bin_pred(w BIT bit.B0) = (bin_pred w) BIT bit.B1" |
138 by (simp add: Bin_simps diff_minus add_ac) |
145 by (simp add: Bin_simps diff_minus add_ac) |
139 |
146 |
140 lemma bin_minus_Pls [simp]: "bin_minus Numeral.Pls = Numeral.Pls" |
147 lemma bin_minus_Pls [simp]: "bin_minus Numeral.Pls = Numeral.Pls" |
141 by (simp add: Bin_simps) |
148 by (simp add: Bin_simps) |
142 |
149 |
143 lemma bin_minus_Min [simp]: "bin_minus Numeral.Min = Numeral.Pls BIT True" |
150 lemma bin_minus_Min [simp]: "bin_minus Numeral.Min = Numeral.Pls BIT bit.B1" |
144 by (simp add: Bin_simps) |
151 by (simp add: Bin_simps) |
145 |
152 |
146 lemma bin_minus_1 [simp]: |
153 lemma bin_minus_1 [simp]: |
147 "bin_minus (w BIT True) = bin_pred (bin_minus w) BIT True" |
154 "bin_minus (w BIT bit.B1) = bin_pred (bin_minus w) BIT bit.B1" |
148 by (simp add: Bin_simps add_ac diff_minus) |
155 by (simp add: Bin_simps add_ac diff_minus) |
149 |
156 |
150 lemma bin_minus_0 [simp]: "bin_minus(w BIT False) = (bin_minus w) BIT False" |
157 lemma bin_minus_0 [simp]: "bin_minus(w BIT bit.B0) = (bin_minus w) BIT bit.B0" |
151 by (simp add: Bin_simps) |
158 by (simp add: Bin_simps) |
152 |
159 |
153 |
160 |
154 subsection{*Binary Addition and Multiplication: |
161 subsection{*Binary Addition and Multiplication: |
155 @{term bin_add} and @{term bin_mult}*} |
162 @{term bin_add} and @{term bin_mult}*} |
159 |
166 |
160 lemma bin_add_Min [simp]: "bin_add Numeral.Min w = bin_pred w" |
167 lemma bin_add_Min [simp]: "bin_add Numeral.Min w = bin_pred w" |
161 by (simp add: Bin_simps diff_minus add_ac) |
168 by (simp add: Bin_simps diff_minus add_ac) |
162 |
169 |
163 lemma bin_add_BIT_11 [simp]: |
170 lemma bin_add_BIT_11 [simp]: |
164 "bin_add (v BIT True) (w BIT True) = bin_add v (bin_succ w) BIT False" |
171 "bin_add (v BIT bit.B1) (w BIT bit.B1) = bin_add v (bin_succ w) BIT bit.B0" |
165 by (simp add: Bin_simps add_ac) |
172 by (simp add: Bin_simps add_ac) |
166 |
173 |
167 lemma bin_add_BIT_10 [simp]: |
174 lemma bin_add_BIT_10 [simp]: |
168 "bin_add (v BIT True) (w BIT False) = (bin_add v w) BIT True" |
175 "bin_add (v BIT bit.B1) (w BIT bit.B0) = (bin_add v w) BIT bit.B1" |
169 by (simp add: Bin_simps add_ac) |
176 by (simp add: Bin_simps add_ac) |
170 |
177 |
171 lemma bin_add_BIT_0 [simp]: |
178 lemma bin_add_BIT_0 [simp]: |
172 "bin_add (v BIT False) (w BIT y) = bin_add v w BIT y" |
179 "bin_add (v BIT bit.B0) (w BIT y) = bin_add v w BIT y" |
173 by (simp add: Bin_simps add_ac) |
180 by (simp add: Bin_simps add_ac) |
174 |
181 |
175 lemma bin_add_Pls_right [simp]: "bin_add w Numeral.Pls = w" |
182 lemma bin_add_Pls_right [simp]: "bin_add w Numeral.Pls = w" |
176 by (simp add: Bin_simps) |
183 by (simp add: Bin_simps) |
177 |
184 |
183 |
190 |
184 lemma bin_mult_Min [simp]: "bin_mult Numeral.Min w = bin_minus w" |
191 lemma bin_mult_Min [simp]: "bin_mult Numeral.Min w = bin_minus w" |
185 by (simp add: Bin_simps) |
192 by (simp add: Bin_simps) |
186 |
193 |
187 lemma bin_mult_1 [simp]: |
194 lemma bin_mult_1 [simp]: |
188 "bin_mult (v BIT True) w = bin_add ((bin_mult v w) BIT False) w" |
195 "bin_mult (v BIT bit.B1) w = bin_add ((bin_mult v w) BIT bit.B0) w" |
189 by (simp add: Bin_simps add_ac left_distrib) |
196 by (simp add: Bin_simps add_ac left_distrib) |
190 |
197 |
191 lemma bin_mult_0 [simp]: "bin_mult (v BIT False) w = (bin_mult v w) BIT False" |
198 lemma bin_mult_0 [simp]: "bin_mult (v BIT bit.B0) w = (bin_mult v w) BIT bit.B0" |
192 by (simp add: Bin_simps left_distrib) |
199 by (simp add: Bin_simps left_distrib) |
193 |
200 |
194 |
201 |
195 |
202 |
196 subsection{*Converting Numerals to Rings: @{term number_of}*} |
203 subsection{*Converting Numerals to Rings: @{term number_of}*} |
219 by (simp add: number_of_eq Bin_simps) |
226 by (simp add: number_of_eq Bin_simps) |
220 |
227 |
221 text{*The correctness of shifting. But it doesn't seem to give a measurable |
228 text{*The correctness of shifting. But it doesn't seem to give a measurable |
222 speed-up.*} |
229 speed-up.*} |
223 lemma double_number_of_BIT: |
230 lemma double_number_of_BIT: |
224 "(1+1) * number_of w = (number_of (w BIT False) ::'a::number_ring)" |
231 "(1+1) * number_of w = (number_of (w BIT bit.B0) ::'a::number_ring)" |
225 by (simp add: number_of_eq Bin_simps left_distrib) |
232 by (simp add: number_of_eq Bin_simps left_distrib) |
226 |
233 |
227 text{*Converting numerals 0 and 1 to their abstract versions*} |
234 text{*Converting numerals 0 and 1 to their abstract versions*} |
228 lemma numeral_0_eq_0 [simp]: "Numeral0 = (0::'a::number_ring)" |
235 lemma numeral_0_eq_0 [simp]: "Numeral0 = (0::'a::number_ring)" |
229 by (simp add: number_of_eq Bin_simps) |
236 by (simp add: number_of_eq Bin_simps) |
344 by (simp add: number_of_eq Ints_def) |
351 by (simp add: number_of_eq Ints_def) |
345 |
352 |
346 |
353 |
347 lemma iszero_number_of_BIT: |
354 lemma iszero_number_of_BIT: |
348 "iszero (number_of (w BIT x)::'a) = |
355 "iszero (number_of (w BIT x)::'a) = |
349 (~x & iszero (number_of w::'a::{ordered_idom,number_ring}))" |
356 (x=bit.B0 & iszero (number_of w::'a::{ordered_idom,number_ring}))" |
350 by (simp add: iszero_def number_of_eq Bin_simps double_eq_0_iff |
357 by (simp add: iszero_def number_of_eq Bin_simps double_eq_0_iff |
351 Ints_odd_nonzero Ints_def) |
358 Ints_odd_nonzero Ints_def split: bit.split) |
352 |
359 |
353 lemma iszero_number_of_0: |
360 lemma iszero_number_of_0: |
354 "iszero (number_of (w BIT False) :: 'a::{ordered_idom,number_ring}) = |
361 "iszero (number_of (w BIT bit.B0) :: 'a::{ordered_idom,number_ring}) = |
355 iszero (number_of w :: 'a)" |
362 iszero (number_of w :: 'a)" |
356 by (simp only: iszero_number_of_BIT simp_thms) |
363 by (simp only: iszero_number_of_BIT simp_thms) |
357 |
364 |
358 lemma iszero_number_of_1: |
365 lemma iszero_number_of_1: |
359 "~ iszero (number_of (w BIT True)::'a::{ordered_idom,number_ring})" |
366 "~ iszero (number_of (w BIT bit.B1)::'a::{ordered_idom,number_ring})" |
360 by (simp only: iszero_number_of_BIT simp_thms) |
367 by (simp add: iszero_number_of_BIT) |
361 |
|
362 |
368 |
363 |
369 |
364 subsection{*The Less-Than Relation*} |
370 subsection{*The Less-Than Relation*} |
365 |
371 |
366 lemma less_number_of_eq_neg: |
372 lemma less_number_of_eq_neg: |
415 |
421 |
416 lemma neg_number_of_BIT: |
422 lemma neg_number_of_BIT: |
417 "neg (number_of (w BIT x)::'a) = |
423 "neg (number_of (w BIT x)::'a) = |
418 neg (number_of w :: 'a::{ordered_idom,number_ring})" |
424 neg (number_of w :: 'a::{ordered_idom,number_ring})" |
419 by (simp add: neg_def number_of_eq Bin_simps double_less_0_iff |
425 by (simp add: neg_def number_of_eq Bin_simps double_less_0_iff |
420 Ints_odd_less_0 Ints_def) |
426 Ints_odd_less_0 Ints_def split: bit.split) |
421 |
427 |
422 |
428 |
423 text{*Less-Than or Equals*} |
429 text{*Less-Than or Equals*} |
424 |
430 |
425 text{*Reduces @{term "a\<le>b"} to @{term "~ (b<a)"} for ALL numerals*} |
431 text{*Reduces @{term "a\<le>b"} to @{term "~ (b<a)"} for ALL numerals*} |
455 number_of_minus [symmetric] numeral_m1_eq_minus_1 [symmetric] |
461 number_of_minus [symmetric] numeral_m1_eq_minus_1 [symmetric] |
456 number_of_mult [symmetric] |
462 number_of_mult [symmetric] |
457 diff_number_of_eq abs_number_of |
463 diff_number_of_eq abs_number_of |
458 |
464 |
459 text{*For making a minimal simpset, one must include these default simprules. |
465 text{*For making a minimal simpset, one must include these default simprules. |
460 Also include @{text simp_thms} or at least @{term "(~False)=True"} *} |
466 Also include @{text simp_thms} *} |
461 lemmas bin_arith_simps = |
467 lemmas bin_arith_simps = |
|
468 Numeral.bit.distinct |
462 Pls_0_eq Min_1_eq |
469 Pls_0_eq Min_1_eq |
463 bin_pred_Pls bin_pred_Min bin_pred_1 bin_pred_0 |
470 bin_pred_Pls bin_pred_Min bin_pred_1 bin_pred_0 |
464 bin_succ_Pls bin_succ_Min bin_succ_1 bin_succ_0 |
471 bin_succ_Pls bin_succ_Min bin_succ_1 bin_succ_0 |
465 bin_add_Pls bin_add_Min bin_add_BIT_0 bin_add_BIT_10 bin_add_BIT_11 |
472 bin_add_Pls bin_add_Min bin_add_BIT_0 bin_add_BIT_10 bin_add_BIT_11 |
466 bin_minus_Pls bin_minus_Min bin_minus_1 bin_minus_0 |
473 bin_minus_Pls bin_minus_Min bin_minus_1 bin_minus_0 |