243 by(simp add: zmod_zdiv_equality[symmetric]) |
242 by(simp add: zmod_zdiv_equality[symmetric]) |
244 |
243 |
245 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k" |
244 lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k" |
246 by(simp add: mult_commute zmod_zdiv_equality[symmetric]) |
245 by(simp add: mult_commute zmod_zdiv_equality[symmetric]) |
247 |
246 |
248 use "IntDiv_setup.ML" |
247 text {* Tool setup *} |
|
248 |
|
249 ML_setup {* |
|
250 local |
|
251 |
|
252 structure CancelDivMod = CancelDivModFun( |
|
253 struct |
|
254 val div_name = @{const_name "Divides.div"}; |
|
255 val mod_name = @{const_name "Divides.mod"}; |
|
256 val mk_binop = HOLogic.mk_binop; |
|
257 val mk_sum = Int_Numeral_Simprocs.mk_sum HOLogic.intT; |
|
258 val dest_sum = Int_Numeral_Simprocs.dest_sum; |
|
259 val div_mod_eqs = |
|
260 map mk_meta_eq [@{thm zdiv_zmod_equality}, |
|
261 @{thm zdiv_zmod_equality2}]; |
|
262 val trans = trans; |
|
263 val prove_eq_sums = |
|
264 let |
|
265 val simps = diff_int_def :: Int_Numeral_Simprocs.add_0s @ zadd_ac |
|
266 in NatArithUtils.prove_conv all_tac (NatArithUtils.simp_all_tac simps) end; |
|
267 end) |
|
268 |
|
269 in |
|
270 |
|
271 val cancel_zdiv_zmod_proc = NatArithUtils.prep_simproc |
|
272 ("cancel_zdiv_zmod", ["(m::int) + n"], K CancelDivMod.proc) |
|
273 |
|
274 end; |
|
275 |
|
276 Addsimprocs [cancel_zdiv_zmod_proc] |
|
277 *} |
249 |
278 |
250 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
279 lemma pos_mod_conj : "(0::int) < b ==> 0 \<le> a mod b & a mod b < b" |
251 apply (cut_tac a = a and b = b in divAlg_correct) |
280 apply (cut_tac a = a and b = b in divAlg_correct) |
252 apply (auto simp add: quorem_def mod_def) |
281 apply (auto simp add: quorem_def mod_def) |
253 done |
282 done |