equal
deleted
inserted
replaced
677 (simp add: divmod_nat_div_mod) |
677 (simp add: divmod_nat_div_mod) |
678 |
678 |
679 text {* Simproc for cancelling @{const div} and @{const mod} *} |
679 text {* Simproc for cancelling @{const div} and @{const mod} *} |
680 |
680 |
681 ML {* |
681 ML {* |
682 local |
682 structure Cancel_Div_Mod_Nat = Cancel_Div_Mod |
683 |
|
684 structure CancelDivMod = CancelDivModFun |
|
685 ( |
683 ( |
686 val div_name = @{const_name div}; |
684 val div_name = @{const_name div}; |
687 val mod_name = @{const_name mod}; |
685 val mod_name = @{const_name mod}; |
688 val mk_binop = HOLogic.mk_binop; |
686 val mk_binop = HOLogic.mk_binop; |
689 val mk_sum = Nat_Arith.mk_sum; |
687 val mk_sum = Nat_Arith.mk_sum; |
692 val div_mod_eqs = map mk_meta_eq [@{thm div_mod_equality}, @{thm div_mod_equality2}]; |
690 val div_mod_eqs = map mk_meta_eq [@{thm div_mod_equality}, @{thm div_mod_equality2}]; |
693 |
691 |
694 val prove_eq_sums = Arith_Data.prove_conv2 all_tac (Arith_Data.simp_all_tac |
692 val prove_eq_sums = Arith_Data.prove_conv2 all_tac (Arith_Data.simp_all_tac |
695 (@{thm add_0_left} :: @{thm add_0_right} :: @{thms add_ac})) |
693 (@{thm add_0_left} :: @{thm add_0_right} :: @{thms add_ac})) |
696 ) |
694 ) |
697 |
|
698 in |
|
699 |
|
700 val cancel_div_mod_nat_proc = Simplifier.simproc_global @{theory} |
|
701 "cancel_div_mod" ["(m::nat) + n"] (K CancelDivMod.proc); |
|
702 |
|
703 val _ = Addsimprocs [cancel_div_mod_nat_proc]; |
|
704 |
|
705 end |
|
706 *} |
695 *} |
|
696 |
|
697 simproc_setup cancel_div_mod_nat ("(m::nat) + n") = {* K Cancel_Div_Mod_Nat.proc *} |
707 |
698 |
708 |
699 |
709 subsubsection {* Quotient *} |
700 subsubsection {* Quotient *} |
710 |
701 |
711 lemma div_geq: "0 < n \<Longrightarrow> \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)" |
702 lemma div_geq: "0 < n \<Longrightarrow> \<not> m < n \<Longrightarrow> m div n = Suc ((m - n) div n)" |
1435 by(simp add: mult_commute zmod_zdiv_equality[symmetric]) |
1426 by(simp add: mult_commute zmod_zdiv_equality[symmetric]) |
1436 |
1427 |
1437 text {* Tool setup *} |
1428 text {* Tool setup *} |
1438 |
1429 |
1439 ML {* |
1430 ML {* |
1440 local |
1431 structure Cancel_Div_Mod_Int = Cancel_Div_Mod |
1441 |
|
1442 structure CancelDivMod = CancelDivModFun |
|
1443 ( |
1432 ( |
1444 val div_name = @{const_name div}; |
1433 val div_name = @{const_name div}; |
1445 val mod_name = @{const_name mod}; |
1434 val mod_name = @{const_name mod}; |
1446 val mk_binop = HOLogic.mk_binop; |
1435 val mk_binop = HOLogic.mk_binop; |
1447 val mk_sum = Arith_Data.mk_sum HOLogic.intT; |
1436 val mk_sum = Arith_Data.mk_sum HOLogic.intT; |
1450 val div_mod_eqs = map mk_meta_eq [@{thm zdiv_zmod_equality}, @{thm zdiv_zmod_equality2}]; |
1439 val div_mod_eqs = map mk_meta_eq [@{thm zdiv_zmod_equality}, @{thm zdiv_zmod_equality2}]; |
1451 |
1440 |
1452 val prove_eq_sums = Arith_Data.prove_conv2 all_tac (Arith_Data.simp_all_tac |
1441 val prove_eq_sums = Arith_Data.prove_conv2 all_tac (Arith_Data.simp_all_tac |
1453 (@{thm diff_minus} :: @{thms add_0s} @ @{thms add_ac})) |
1442 (@{thm diff_minus} :: @{thms add_0s} @ @{thms add_ac})) |
1454 ) |
1443 ) |
1455 |
|
1456 in |
|
1457 |
|
1458 val cancel_div_mod_int_proc = Simplifier.simproc_global @{theory} |
|
1459 "cancel_zdiv_zmod" ["(k::int) + l"] (K CancelDivMod.proc); |
|
1460 |
|
1461 val _ = Addsimprocs [cancel_div_mod_int_proc]; |
|
1462 |
|
1463 end |
|
1464 *} |
1444 *} |
|
1445 |
|
1446 simproc_setup cancel_div_mod_int ("(k::int) + l") = {* K Cancel_Div_Mod_Int.proc *} |
1465 |
1447 |
1466 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
1448 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
1467 apply (cut_tac a = a and b = b in divmod_int_correct) |
1449 apply (cut_tac a = a and b = b in divmod_int_correct) |
1468 apply (auto simp add: divmod_int_rel_def mod_int_def) |
1450 apply (auto simp add: divmod_int_rel_def mod_int_def) |
1469 done |
1451 done |