243 by (simp_tac |
243 by (simp_tac |
244 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
244 (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, |
245 nat_less_eq_zless, less_number_of_eq_neg, |
245 nat_less_eq_zless, less_number_of_eq_neg, |
246 nat_0]) 1); |
246 nat_0]) 1); |
247 by (simp_tac (simpset_of Int.thy addsimps [neg_eq_less_int0, zminus_zless, |
247 by (simp_tac (simpset_of Int.thy addsimps [neg_eq_less_int0, zminus_zless, |
248 number_of_minus, zless_zero_nat]) 1); |
248 number_of_minus, zless_nat_eq_int_zless]) 1); |
249 qed "less_nat_number_of"; |
249 qed "less_nat_number_of"; |
250 |
250 |
251 Addsimps [less_nat_number_of]; |
251 Addsimps [less_nat_number_of]; |
252 |
252 |
253 |
253 |
378 |
378 |
379 (*binomial_0_Suc doesn't work well on numerals*) |
379 (*binomial_0_Suc doesn't work well on numerals*) |
380 Addsimps (map (rename_numerals thy) |
380 Addsimps (map (rename_numerals thy) |
381 [binomial_n_0, binomial_zero, binomial_1]); |
381 [binomial_n_0, binomial_zero, binomial_1]); |
382 |
382 |
|
383 |
|
384 (*** Comparisons involving 0 ***) |
|
385 |
|
386 Goal "(number_of v = 0) = \ |
|
387 \ (if neg (number_of v) then True else iszero (number_of v))"; |
|
388 by (simp_tac (simpset() addsimps [numeral_0_eq_0 RS sym]) 1); |
|
389 qed "eq_number_of_0"; |
|
390 |
|
391 Goal "(0 = number_of v) = \ |
|
392 \ (if neg (number_of v) then True else iszero (number_of v))"; |
|
393 by (rtac ([eq_sym_conv, eq_number_of_0] MRS trans) 1); |
|
394 qed "eq_0_number_of"; |
|
395 |
|
396 Goal "(0 < number_of v) = neg (number_of (bin_minus v))"; |
|
397 by (simp_tac (simpset() addsimps [numeral_0_eq_0 RS sym]) 1); |
|
398 qed "less_0_number_of"; |
|
399 |
|
400 (*Simplification already handles n<0, n<=0 and 0<=n.*) |
|
401 Addsimps [eq_number_of_0, eq_0_number_of, less_0_number_of]; |
|
402 |
|
403 |
|
404 (*** Comparisons involving Suc ***) |
|
405 |
|
406 Goal "(number_of v = Suc n) = \ |
|
407 \ (let pv = number_of (bin_pred v) in \ |
|
408 \ if neg pv then False else nat pv = n)"; |
|
409 by (simp_tac |
|
410 (simpset_of Int.thy addsimps |
|
411 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
|
412 nat_number_of_def, zadd_0]@zadd_ac@zcompare_rls) 1); |
|
413 by (res_inst_tac [("x", "number_of v")] spec 1); |
|
414 by (auto_tac (claset(), |
|
415 simpset() addsimps [nat_eq_iff]@zcompare_rls)); |
|
416 qed "eq_number_of_Suc"; |
|
417 |
|
418 Goal "(Suc n = number_of v) = \ |
|
419 \ (let pv = number_of (bin_pred v) in \ |
|
420 \ if neg pv then False else nat pv = n)"; |
|
421 by (rtac ([eq_sym_conv, eq_number_of_Suc] MRS trans) 1); |
|
422 qed "Suc_eq_number_of"; |
|
423 |
|
424 Goal "(number_of v < Suc n) = \ |
|
425 \ (let pv = number_of (bin_pred v) in \ |
|
426 \ if neg pv then True else nat pv < n)"; |
|
427 by (simp_tac |
|
428 (simpset_of Int.thy addsimps |
|
429 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
|
430 nat_number_of_def, zadd_0]@zadd_ac@zcompare_rls) 1); |
|
431 by (res_inst_tac [("x", "number_of v")] spec 1); |
|
432 by (auto_tac (claset(), |
|
433 simpset() addsimps [nat_less_iff]@zcompare_rls)); |
|
434 qed "less_number_of_Suc"; |
|
435 |
|
436 Goal "(Suc n < number_of v) = \ |
|
437 \ (let pv = number_of (bin_pred v) in \ |
|
438 \ if neg pv then False else n < nat pv)"; |
|
439 by (simp_tac |
|
440 (simpset_of Int.thy addsimps |
|
441 [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred, |
|
442 nat_number_of_def, zadd_0]@zadd_ac@zcompare_rls) 1); |
|
443 by (res_inst_tac [("x", "number_of v")] spec 1); |
|
444 by (auto_tac (claset(), |
|
445 simpset() addsimps [zless_nat_eq_int_zless]@zcompare_rls)); |
|
446 qed "less_Suc_number_of"; |
|
447 |
|
448 Goal "(number_of v <= Suc n) = \ |
|
449 \ (let pv = number_of (bin_pred v) in \ |
|
450 \ if neg pv then True else nat pv <= n)"; |
|
451 by (simp_tac |
|
452 (simpset_of Int.thy addsimps |
|
453 [Let_def, less_Suc_number_of, linorder_not_less RS sym]) 1); |
|
454 qed "le_number_of_Suc"; |
|
455 |
|
456 Goal "(Suc n <= number_of v) = \ |
|
457 \ (let pv = number_of (bin_pred v) in \ |
|
458 \ if neg pv then False else n <= nat pv)"; |
|
459 by (simp_tac |
|
460 (simpset_of Int.thy addsimps |
|
461 [Let_def, less_number_of_Suc, linorder_not_less RS sym]) 1); |
|
462 qed "le_Suc_number_of"; |
|
463 |
|
464 Addsimps [eq_number_of_Suc, Suc_eq_number_of, |
|
465 less_number_of_Suc, less_Suc_number_of, |
|
466 le_number_of_Suc, le_Suc_number_of]; |