src/HOL/Divides.thy
changeset 43594 ef1ddc59b825
parent 41792 ff3cb0c418b7
child 44766 d4d33a4d7548
equal deleted inserted replaced
43593:11140987d415 43594:ef1ddc59b825
   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