221 |
221 |
222 goal thy "!!k b. b<2 ==> k mod 2 = b | k mod 2 = (if b=1 then 0 else 1)"; |
222 goal thy "!!k b. b<2 ==> k mod 2 = b | k mod 2 = (if b=1 then 0 else 1)"; |
223 by (subgoal_tac "k mod 2 < 2" 1); |
223 by (subgoal_tac "k mod 2 < 2" 1); |
224 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
224 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
225 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
225 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
226 by (Blast_tac 1); |
226 by Safe_tac; |
227 qed "mod2_cases"; |
227 qed "mod2_cases"; |
228 |
228 |
229 goal thy "Suc(Suc(m)) mod 2 = m mod 2"; |
229 goal thy "Suc(Suc(m)) mod 2 = m mod 2"; |
230 by (subgoal_tac "m mod 2 < 2" 1); |
230 by (subgoal_tac "m mod 2 < 2" 1); |
231 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
231 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
232 by Safe_tac; |
232 by Safe_tac; |
233 by (ALLGOALS (asm_simp_tac (simpset() addsimps [mod_Suc]))); |
233 by (ALLGOALS (asm_simp_tac (simpset() addsimps [mod_Suc]))); |
234 qed "mod2_Suc_Suc"; |
234 qed "mod2_Suc_Suc"; |
235 Addsimps [mod2_Suc_Suc]; |
235 Addsimps [mod2_Suc_Suc]; |
236 |
236 |
|
237 (* FIXME: this thm is subsumed by the next one. Get rid of it. *) |
237 goal thy "!!m. m mod 2 ~= 0 ==> m mod 2 = 1"; |
238 goal thy "!!m. m mod 2 ~= 0 ==> m mod 2 = 1"; |
238 by (subgoal_tac "m mod 2 < 2" 1); |
239 by (subgoal_tac "m mod 2 < 2" 1); |
239 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
240 by (asm_simp_tac (simpset() addsimps [mod_less_divisor]) 2); |
240 by (safe_tac (claset() addSEs [lessE])); |
241 by (Asm_full_simp_tac 1); |
241 by (ALLGOALS (blast_tac (claset() addIs [sym]))); |
242 by (trans_tac 1); |
242 qed "mod2_neq_0"; |
243 qed "mod2_neq_0"; |
|
244 |
|
245 goal Divides.thy "(0 < m mod 2) = (m mod 2 = 1)"; |
|
246 by (rtac iffI 1); |
|
247 by(ALLGOALS (asm_full_simp_tac (simpset() addsimps [mod2_neq_0]))); |
|
248 qed "mod2_gr_0"; |
|
249 Addsimps [mod2_gr_0]; |
243 |
250 |
244 goal thy "(m+m) mod 2 = 0"; |
251 goal thy "(m+m) mod 2 = 0"; |
245 by (induct_tac "m" 1); |
252 by (induct_tac "m" 1); |
246 by (simp_tac (simpset() addsimps [mod_less]) 1); |
253 by (simp_tac (simpset() addsimps [mod_less]) 1); |
247 by (Asm_simp_tac 1); |
254 by (Asm_simp_tac 1); |
354 exI 1); |
361 exI 1); |
355 by (asm_simp_tac (simpset() addsimps [diff_mult_distrib2, |
362 by (asm_simp_tac (simpset() addsimps [diff_mult_distrib2, |
356 mult_mod_distrib, add_mult_distrib2]) 1); |
363 mult_mod_distrib, add_mult_distrib2]) 1); |
357 qed "dvd_mod"; |
364 qed "dvd_mod"; |
358 |
365 |
359 goal thy "!!k. [| k dvd (m mod n); k dvd n; n~=0 |] ==> k dvd m"; |
366 goal thy "!!k. [| k dvd (m mod n); k dvd n; 0<n |] ==> k dvd m"; |
360 by (subgoal_tac "k dvd ((m div n)*n + m mod n)" 1); |
367 by (subgoal_tac "k dvd ((m div n)*n + m mod n)" 1); |
361 by (asm_simp_tac (simpset() addsimps [dvd_add, dvd_mult]) 2); |
368 by (asm_simp_tac (simpset() addsimps [dvd_add, dvd_mult]) 2); |
362 by (asm_full_simp_tac (simpset() addsimps [mod_div_equality, zero_less_eq]) 1); |
369 by (asm_full_simp_tac (simpset() addsimps [mod_div_equality]) 1); |
363 qed "dvd_mod_imp_dvd"; |
370 qed "dvd_mod_imp_dvd"; |
364 |
371 |
365 goalw thy [dvd_def] "!!k m n. [| (k*m) dvd (k*n); 0<k |] ==> m dvd n"; |
372 goalw thy [dvd_def] "!!k m n. [| (k*m) dvd (k*n); 0<k |] ==> m dvd n"; |
366 by (etac exE 1); |
373 by (etac exE 1); |
367 by (asm_full_simp_tac (simpset() addsimps mult_ac) 1); |
374 by (asm_full_simp_tac (simpset() addsimps mult_ac) 1); |