src/HOL/Divides.ML
changeset 4356 0dfd34f0d33d
parent 4089 96fba19bcbe2
child 4358 aa22fcb46a5d
equal deleted inserted replaced
4355:68c7c544570c 4356:0dfd34f0d33d
   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);