81 (*"neg" is used in rewrite rules for binary comparisons*) |
82 (*"neg" is used in rewrite rules for binary comparisons*) |
82 Goal "int (number_of v :: nat) = \ |
83 Goal "int (number_of v :: nat) = \ |
83 \ (if neg (number_of v) then 0 \ |
84 \ (if neg (number_of v) then 0 \ |
84 \ else (number_of v :: int))"; |
85 \ else (number_of v :: int))"; |
85 by (simp_tac |
86 by (simp_tac |
86 (simpset_of Int.thy addsimps [neg_nat, nat_number_of_def, |
87 (ss_Int addsimps [neg_nat, nat_number_of_def, not_neg_nat, int_0]) 1); |
87 not_neg_nat, int_0]) 1); |
|
88 qed "int_nat_number_of"; |
88 qed "int_nat_number_of"; |
89 Addsimps [int_nat_number_of]; |
89 Addsimps [int_nat_number_of]; |
90 |
90 |
91 |
91 |
92 (** Successor **) |
92 (** Successor **) |
96 by (asm_simp_tac (simpset() addsimps [nat_eq_iff, int_Suc]) 1); |
96 by (asm_simp_tac (simpset() addsimps [nat_eq_iff, int_Suc]) 1); |
97 qed "Suc_nat_eq_nat_zadd1"; |
97 qed "Suc_nat_eq_nat_zadd1"; |
98 |
98 |
99 Goal "Suc (number_of v + n) = \ |
99 Goal "Suc (number_of v + n) = \ |
100 \ (if neg (number_of v) then 1+n else number_of (bin_succ v) + n)"; |
100 \ (if neg (number_of v) then 1+n else number_of (bin_succ v) + n)"; |
101 by (simp_tac |
101 by (simp_tac (ss_Int addsimps [neg_nat, nat_1, not_neg_eq_ge_0, |
102 (simpset_of Int.thy addsimps [neg_nat, nat_1, not_neg_eq_ge_0, |
102 nat_number_of_def, int_Suc, |
103 nat_number_of_def, int_Suc, |
103 Suc_nat_eq_nat_zadd1, number_of_succ]) 1); |
104 Suc_nat_eq_nat_zadd1, number_of_succ]) 1); |
|
105 qed "Suc_nat_number_of_add"; |
104 qed "Suc_nat_number_of_add"; |
106 |
105 |
107 Goal "Suc (number_of v) = \ |
106 Goal "Suc (number_of v) = \ |
108 \ (if neg (number_of v) then 1 else number_of (bin_succ v))"; |
107 \ (if neg (number_of v) then 1 else number_of (bin_succ v))"; |
109 by (cut_inst_tac [("n","0")] Suc_nat_number_of_add 1); |
108 by (cut_inst_tac [("n","0")] Suc_nat_number_of_add 1); |
126 (*"neg" is used in rewrite rules for binary comparisons*) |
125 (*"neg" is used in rewrite rules for binary comparisons*) |
127 Goal "(number_of v :: nat) + number_of v' = \ |
126 Goal "(number_of v :: nat) + number_of v' = \ |
128 \ (if neg (number_of v) then number_of v' \ |
127 \ (if neg (number_of v) then number_of v' \ |
129 \ else if neg (number_of v') then number_of v \ |
128 \ else if neg (number_of v') then number_of v \ |
130 \ else number_of (bin_add v v'))"; |
129 \ else number_of (bin_add v v'))"; |
131 by (simp_tac |
130 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
132 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
131 nat_add_distrib RS sym, number_of_add]) 1); |
133 nat_add_distrib RS sym, number_of_add]) 1); |
|
134 qed "add_nat_number_of"; |
132 qed "add_nat_number_of"; |
135 |
133 |
136 Addsimps [add_nat_number_of]; |
134 Addsimps [add_nat_number_of]; |
137 |
135 |
138 |
136 |
150 Goalw [nat_number_of_def] |
148 Goalw [nat_number_of_def] |
151 "(number_of v :: nat) - number_of v' = \ |
149 "(number_of v :: nat) - number_of v' = \ |
152 \ (if neg (number_of v') then number_of v \ |
150 \ (if neg (number_of v') then number_of v \ |
153 \ else let d = number_of (bin_add v (bin_minus v')) in \ |
151 \ else let d = number_of (bin_add v (bin_minus v')) in \ |
154 \ if neg d then 0 else nat d)"; |
152 \ if neg d then 0 else nat d)"; |
155 by (simp_tac |
153 by (simp_tac (ss_Int delcongs [if_weak_cong] |
156 (simpset_of Int.thy delcongs [if_weak_cong] |
154 addsimps [not_neg_eq_ge_0, nat_0, |
157 addsimps [not_neg_eq_ge_0, nat_0, |
155 diff_nat_eq_if, diff_number_of_eq]) 1); |
158 diff_nat_eq_if, diff_number_of_eq]) 1); |
|
159 qed "diff_nat_number_of"; |
156 qed "diff_nat_number_of"; |
160 |
157 |
161 Addsimps [diff_nat_number_of]; |
158 Addsimps [diff_nat_number_of]; |
162 |
159 |
163 |
160 |
164 (** Multiplication **) |
161 (** Multiplication **) |
165 |
162 |
166 Goal "(number_of v :: nat) * number_of v' = \ |
163 Goal "(number_of v :: nat) * number_of v' = \ |
167 \ (if neg (number_of v) then 0 else number_of (bin_mult v v'))"; |
164 \ (if neg (number_of v) then 0 else number_of (bin_mult v v'))"; |
168 by (simp_tac |
165 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
169 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
166 nat_mult_distrib RS sym, number_of_mult, |
170 nat_mult_distrib RS sym, number_of_mult, |
167 nat_0]) 1); |
171 nat_0]) 1); |
|
172 qed "mult_nat_number_of"; |
168 qed "mult_nat_number_of"; |
173 |
169 |
174 Addsimps [mult_nat_number_of]; |
170 Addsimps [mult_nat_number_of]; |
175 |
171 |
176 |
172 |
177 (** Quotient **) |
173 (** Quotient **) |
178 |
174 |
179 Goal "(number_of v :: nat) div number_of v' = \ |
175 Goal "(number_of v :: nat) div number_of v' = \ |
180 \ (if neg (number_of v) then 0 \ |
176 \ (if neg (number_of v) then 0 \ |
181 \ else nat (number_of v div number_of v'))"; |
177 \ else nat (number_of v div number_of v'))"; |
182 by (simp_tac |
178 by (simp_tac (ss_Int addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, |
183 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, |
179 nat_div_distrib RS sym, nat_0]) 1); |
184 nat_div_distrib RS sym, nat_0]) 1); |
|
185 qed "div_nat_number_of"; |
180 qed "div_nat_number_of"; |
186 |
181 |
187 Addsimps [div_nat_number_of]; |
182 Addsimps [div_nat_number_of]; |
188 |
183 |
189 |
184 |
191 |
186 |
192 Goal "(number_of v :: nat) mod number_of v' = \ |
187 Goal "(number_of v :: nat) mod number_of v' = \ |
193 \ (if neg (number_of v) then 0 \ |
188 \ (if neg (number_of v) then 0 \ |
194 \ else if neg (number_of v') then number_of v \ |
189 \ else if neg (number_of v') then number_of v \ |
195 \ else nat (number_of v mod number_of v'))"; |
190 \ else nat (number_of v mod number_of v'))"; |
196 by (simp_tac |
191 by (simp_tac (ss_Int addsimps [not_neg_eq_ge_0, nat_number_of_def, |
197 (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, |
192 neg_nat, nat_0, DIVISION_BY_ZERO_MOD, |
198 neg_nat, nat_0, DIVISION_BY_ZERO_MOD, |
193 nat_mod_distrib RS sym]) 1); |
199 nat_mod_distrib RS sym]) 1); |
|
200 qed "mod_nat_number_of"; |
194 qed "mod_nat_number_of"; |
201 |
195 |
202 Addsimps [mod_nat_number_of]; |
196 Addsimps [mod_nat_number_of]; |
203 |
197 |
204 structure NatAbstractNumeralsData = |
198 structure NatAbstractNumeralsData = |
233 (*"neg" is used in rewrite rules for binary comparisons*) |
227 (*"neg" is used in rewrite rules for binary comparisons*) |
234 Goal "((number_of v :: nat) = number_of v') = \ |
228 Goal "((number_of v :: nat) = number_of v') = \ |
235 \ (if neg (number_of v) then (iszero (number_of v') | neg (number_of v')) \ |
229 \ (if neg (number_of v) then (iszero (number_of v') | neg (number_of v')) \ |
236 \ else if neg (number_of v') then iszero (number_of v) \ |
230 \ else if neg (number_of v') then iszero (number_of v) \ |
237 \ else iszero (number_of (bin_add v (bin_minus v'))))"; |
231 \ else iszero (number_of (bin_add v (bin_minus v'))))"; |
238 by (simp_tac |
232 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
239 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
233 eq_nat_nat_iff, eq_number_of_eq, nat_0]) 1); |
240 eq_nat_nat_iff, eq_number_of_eq, nat_0]) 1); |
234 by (simp_tac (ss_Int addsimps [nat_eq_iff, nat_eq_iff2, iszero_def]) 1); |
241 by (simp_tac (simpset_of Int.thy addsimps [nat_eq_iff, nat_eq_iff2, |
|
242 iszero_def]) 1); |
|
243 by (simp_tac (simpset () addsimps [not_neg_eq_ge_0 RS sym]) 1); |
235 by (simp_tac (simpset () addsimps [not_neg_eq_ge_0 RS sym]) 1); |
244 qed "eq_nat_number_of"; |
236 qed "eq_nat_number_of"; |
245 |
237 |
246 Addsimps [eq_nat_number_of]; |
238 Addsimps [eq_nat_number_of]; |
247 |
239 |
249 |
241 |
250 (*"neg" is used in rewrite rules for binary comparisons*) |
242 (*"neg" is used in rewrite rules for binary comparisons*) |
251 Goal "((number_of v :: nat) < number_of v') = \ |
243 Goal "((number_of v :: nat) < number_of v') = \ |
252 \ (if neg (number_of v) then neg (number_of (bin_minus v')) \ |
244 \ (if neg (number_of v) then neg (number_of (bin_minus v')) \ |
253 \ else neg (number_of (bin_add v (bin_minus v'))))"; |
245 \ else neg (number_of (bin_add v (bin_minus v'))))"; |
254 by (simp_tac |
246 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
255 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
247 nat_less_eq_zless, less_number_of_eq_neg, nat_0]) 1); |
256 nat_less_eq_zless, less_number_of_eq_neg, |
248 by (simp_tac (ss_Int addsimps [neg_eq_less_0, zminus_zless, |
257 nat_0]) 1); |
|
258 by (simp_tac (simpset_of Int.thy addsimps [neg_eq_less_0, zminus_zless, |
|
259 number_of_minus, zless_nat_eq_int_zless]) 1); |
249 number_of_minus, zless_nat_eq_int_zless]) 1); |
260 qed "less_nat_number_of"; |
250 qed "less_nat_number_of"; |
261 |
251 |
262 Addsimps [less_nat_number_of]; |
252 Addsimps [less_nat_number_of]; |
263 |
253 |
350 (*** Comparisons involving Suc ***) |
340 (*** Comparisons involving Suc ***) |
351 |
341 |
352 Goal "(number_of v = Suc n) = \ |
342 Goal "(number_of v = Suc n) = \ |
353 \ (let pv = number_of (bin_pred v) in \ |
343 \ (let pv = number_of (bin_pred v) in \ |
354 \ if neg pv then False else nat pv = n)"; |
344 \ if neg pv then False else nat pv = n)"; |
355 by (simp_tac |
345 by (simp_tac (ss_Int addsimps |
356 (simpset_of Int.thy addsimps |
346 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
357 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
347 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
358 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
|
359 by (res_inst_tac [("x", "number_of v")] spec 1); |
348 by (res_inst_tac [("x", "number_of v")] spec 1); |
360 by (auto_tac (claset(), simpset() addsimps [nat_eq_iff])); |
349 by (auto_tac (claset(), simpset() addsimps [nat_eq_iff])); |
361 qed "eq_number_of_Suc"; |
350 qed "eq_number_of_Suc"; |
362 |
351 |
363 Goal "(Suc n = number_of v) = \ |
352 Goal "(Suc n = number_of v) = \ |
367 qed "Suc_eq_number_of"; |
356 qed "Suc_eq_number_of"; |
368 |
357 |
369 Goal "(number_of v < Suc n) = \ |
358 Goal "(number_of v < Suc n) = \ |
370 \ (let pv = number_of (bin_pred v) in \ |
359 \ (let pv = number_of (bin_pred v) in \ |
371 \ if neg pv then True else nat pv < n)"; |
360 \ if neg pv then True else nat pv < n)"; |
372 by (simp_tac |
361 by (simp_tac (ss_Int addsimps |
373 (simpset_of Int.thy addsimps |
362 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
374 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
363 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
375 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
|
376 by (res_inst_tac [("x", "number_of v")] spec 1); |
364 by (res_inst_tac [("x", "number_of v")] spec 1); |
377 by (auto_tac (claset(), simpset() addsimps [nat_less_iff])); |
365 by (auto_tac (claset(), simpset() addsimps [nat_less_iff])); |
378 qed "less_number_of_Suc"; |
366 qed "less_number_of_Suc"; |
379 |
367 |
380 Goal "(Suc n < number_of v) = \ |
368 Goal "(Suc n < number_of v) = \ |
381 \ (let pv = number_of (bin_pred v) in \ |
369 \ (let pv = number_of (bin_pred v) in \ |
382 \ if neg pv then False else n < nat pv)"; |
370 \ if neg pv then False else n < nat pv)"; |
383 by (simp_tac |
371 by (simp_tac (ss_Int addsimps |
384 (simpset_of Int.thy addsimps |
372 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
385 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
373 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
386 nat_number_of_def, zadd_0] @ zadd_ac) 1); |
|
387 by (res_inst_tac [("x", "number_of v")] spec 1); |
374 by (res_inst_tac [("x", "number_of v")] spec 1); |
388 by (auto_tac (claset(), simpset() addsimps [zless_nat_eq_int_zless])); |
375 by (auto_tac (claset(), simpset() addsimps [zless_nat_eq_int_zless])); |
389 qed "less_Suc_number_of"; |
376 qed "less_Suc_number_of"; |
390 |
377 |
391 Goal "(number_of v <= Suc n) = \ |
378 Goal "(number_of v <= Suc n) = \ |
421 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); |
408 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); |
422 val lemma2 = result(); |
409 val lemma2 = result(); |
423 |
410 |
424 Goal "((number_of (v BIT x) ::int) = number_of (w BIT y)) = \ |
411 Goal "((number_of (v BIT x) ::int) = number_of (w BIT y)) = \ |
425 \ (x=y & (((number_of v) ::int) = number_of w))"; |
412 \ (x=y & (((number_of v) ::int) = number_of w))"; |
426 by (simp_tac (simpset_of Int.thy addsimps |
413 by (simp_tac (ss_Int addsimps [number_of_BIT, lemma1, lemma2, eq_commute]) 1); |
427 [number_of_BIT, lemma1, lemma2, eq_commute]) 1); |
|
428 qed "eq_number_of_BIT_BIT"; |
414 qed "eq_number_of_BIT_BIT"; |
429 |
415 |
430 Goal "((number_of (v BIT x) ::int) = number_of bin.Pls) = \ |
416 Goal "((number_of (v BIT x) ::int) = number_of bin.Pls) = \ |
431 \ (x=False & (((number_of v) ::int) = number_of bin.Pls))"; |
417 \ (x=False & (((number_of v) ::int) = number_of bin.Pls))"; |
432 by (simp_tac (simpset_of Int.thy addsimps |
418 by (simp_tac (ss_Int addsimps [number_of_BIT, number_of_Pls, eq_commute]) 1); |
433 [number_of_BIT, number_of_Pls, eq_commute]) 1); |
|
434 by (res_inst_tac [("x", "number_of v")] spec 1); |
419 by (res_inst_tac [("x", "number_of v")] spec 1); |
435 by Safe_tac; |
420 by Safe_tac; |
436 by (ALLGOALS Full_simp_tac); |
421 by (ALLGOALS Full_simp_tac); |
437 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1); |
422 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1); |
438 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); |
423 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); |
439 qed "eq_number_of_BIT_Pls"; |
424 qed "eq_number_of_BIT_Pls"; |
440 |
425 |
441 Goal "((number_of (v BIT x) ::int) = number_of bin.Min) = \ |
426 Goal "((number_of (v BIT x) ::int) = number_of bin.Min) = \ |
442 \ (x=True & (((number_of v) ::int) = number_of bin.Min))"; |
427 \ (x=True & (((number_of v) ::int) = number_of bin.Min))"; |
443 by (simp_tac (simpset_of Int.thy addsimps |
428 by (simp_tac (ss_Int addsimps [number_of_BIT, number_of_Min, eq_commute]) 1); |
444 [number_of_BIT, number_of_Min, eq_commute]) 1); |
|
445 by (res_inst_tac [("x", "number_of v")] spec 1); |
429 by (res_inst_tac [("x", "number_of v")] spec 1); |
446 by Auto_tac; |
430 by Auto_tac; |
447 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1); |
431 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1); |
448 by Auto_tac; |
432 by Auto_tac; |
449 qed "eq_number_of_BIT_Min"; |
433 qed "eq_number_of_BIT_Min"; |
466 by (ALLGOALS (asm_simp_tac (simpset() addsimps [nat_mult_distrib]))); |
450 by (ALLGOALS (asm_simp_tac (simpset() addsimps [nat_mult_distrib]))); |
467 qed "nat_power_eq"; |
451 qed "nat_power_eq"; |
468 |
452 |
469 Goal "(number_of v :: nat) ^ n = \ |
453 Goal "(number_of v :: nat) ^ n = \ |
470 \ (if neg (number_of v) then 0^n else nat ((number_of v :: int) ^ n))"; |
454 \ (if neg (number_of v) then 0^n else nat ((number_of v :: int) ^ n))"; |
471 by (simp_tac |
455 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
472 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
|
473 nat_power_eq]) 1); |
456 nat_power_eq]) 1); |
474 qed "power_nat_number_of"; |
457 qed "power_nat_number_of"; |
475 |
458 |
476 Addsimps [inst "n" "number_of ?w" power_nat_number_of]; |
459 Addsimps [inst "n" "number_of ?w" power_nat_number_of]; |
477 |
460 |
491 by (simp_tac (simpset() addsimps [zpower_even, zpower_zadd_distrib]) 1); |
474 by (simp_tac (simpset() addsimps [zpower_even, zpower_zadd_distrib]) 1); |
492 qed "zpower_odd"; |
475 qed "zpower_odd"; |
493 |
476 |
494 Goal "(z::int) ^ number_of (w BIT False) = \ |
477 Goal "(z::int) ^ number_of (w BIT False) = \ |
495 \ (let w = z ^ (number_of w) in w*w)"; |
478 \ (let w = z ^ (number_of w) in w*w)"; |
496 by (simp_tac (simpset_of Int.thy addsimps [nat_number_of_def, |
479 by (simp_tac (ss_Int addsimps [nat_number_of_def, number_of_BIT, Let_def]) 1); |
497 number_of_BIT, Let_def]) 1); |
|
498 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); |
480 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); |
499 by (case_tac "(0::int) <= x" 1); |
481 by (case_tac "(0::int) <= x" 1); |
500 by (auto_tac (claset(), |
482 by (auto_tac (claset(), |
501 simpset() addsimps [nat_mult_distrib, zpower_even, zpower_two])); |
483 simpset() addsimps [nat_mult_distrib, zpower_even, zpower_two])); |
502 qed "zpower_number_of_even"; |
484 qed "zpower_number_of_even"; |
503 |
485 |
504 Goal "(z::int) ^ number_of (w BIT True) = \ |
486 Goal "(z::int) ^ number_of (w BIT True) = \ |
505 \ (if (0::int) <= number_of w \ |
487 \ (if (0::int) <= number_of w \ |
506 \ then (let w = z ^ (number_of w) in z*w*w) \ |
488 \ then (let w = z ^ (number_of w) in z*w*w) \ |
507 \ else 1)"; |
489 \ else 1)"; |
508 by (simp_tac (simpset_of Int.thy addsimps [nat_number_of_def, |
490 by (simp_tac (ss_Int addsimps [nat_number_of_def, number_of_BIT, Let_def]) 1); |
509 number_of_BIT, Let_def]) 1); |
|
510 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); |
491 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); |
511 by (case_tac "(0::int) <= x" 1); |
492 by (case_tac "(0::int) <= x" 1); |
512 by (auto_tac (claset(), |
493 by (auto_tac (claset(), |
513 simpset() addsimps [nat_add_distrib, nat_mult_distrib, |
494 simpset() addsimps [nat_add_distrib, nat_mult_distrib, |
514 zpower_even, zpower_two])); |
495 zpower_even, zpower_two])); |