src/HOL/Divides.thy
changeset 59807 22bc39064290
parent 59556 aa2deef7cf47
child 59816 034b13f4efae
equal deleted inserted replaced
59806:d3d4ec6c21ef 59807:22bc39064290
  1193 by (blast intro: divmod_nat_rel_add1_eq [THEN div_nat_unique] divmod_nat_rel)
  1193 by (blast intro: divmod_nat_rel_add1_eq [THEN div_nat_unique] divmod_nat_rel)
  1194 
  1194 
  1195 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c"
  1195 lemma mod_lemma: "[| (0::nat) < c; r < b |] ==> b * (q mod c) + r < b * c"
  1196   apply (cut_tac m = q and n = c in mod_less_divisor)
  1196   apply (cut_tac m = q and n = c in mod_less_divisor)
  1197   apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto)
  1197   apply (drule_tac [2] m = "q mod c" in less_imp_Suc_add, auto)
  1198   apply (erule_tac P = "%x. ?lhs < ?rhs x" in ssubst)
  1198   apply (erule_tac P = "%x. lhs < rhs x" for lhs rhs in ssubst)
  1199   apply (simp add: add_mult_distrib2)
  1199   apply (simp add: add_mult_distrib2)
  1200   done
  1200   done
  1201 
  1201 
  1202 lemma divmod_nat_rel_mult2_eq:
  1202 lemma divmod_nat_rel_mult2_eq:
  1203   "divmod_nat_rel a b (q, r)
  1203   "divmod_nat_rel a b (q, r)
  2406 
  2406 
  2407 lemma split_pos_lemma:
  2407 lemma split_pos_lemma:
  2408  "0<k ==> 
  2408  "0<k ==> 
  2409     P(n div k :: int)(n mod k) = (\<forall>i j. 0\<le>j & j<k & n = k*i + j --> P i j)"
  2409     P(n div k :: int)(n mod k) = (\<forall>i j. 0\<le>j & j<k & n = k*i + j --> P i j)"
  2410 apply (rule iffI, clarify)
  2410 apply (rule iffI, clarify)
  2411  apply (erule_tac P="P ?x ?y" in rev_mp)  
  2411  apply (erule_tac P="P x y" for x y in rev_mp)  
  2412  apply (subst mod_add_eq) 
  2412  apply (subst mod_add_eq) 
  2413  apply (subst zdiv_zadd1_eq) 
  2413  apply (subst zdiv_zadd1_eq) 
  2414  apply (simp add: div_pos_pos_trivial mod_pos_pos_trivial)  
  2414  apply (simp add: div_pos_pos_trivial mod_pos_pos_trivial)  
  2415 txt{*converse direction*}
  2415 txt{*converse direction*}
  2416 apply (drule_tac x = "n div k" in spec) 
  2416 apply (drule_tac x = "n div k" in spec) 
  2419 
  2419 
  2420 lemma split_neg_lemma:
  2420 lemma split_neg_lemma:
  2421  "k<0 ==>
  2421  "k<0 ==>
  2422     P(n div k :: int)(n mod k) = (\<forall>i j. k<j & j\<le>0 & n = k*i + j --> P i j)"
  2422     P(n div k :: int)(n mod k) = (\<forall>i j. k<j & j\<le>0 & n = k*i + j --> P i j)"
  2423 apply (rule iffI, clarify)
  2423 apply (rule iffI, clarify)
  2424  apply (erule_tac P="P ?x ?y" in rev_mp)  
  2424  apply (erule_tac P="P x y" for x y in rev_mp)  
  2425  apply (subst mod_add_eq) 
  2425  apply (subst mod_add_eq) 
  2426  apply (subst zdiv_zadd1_eq) 
  2426  apply (subst zdiv_zadd1_eq) 
  2427  apply (simp add: div_neg_neg_trivial mod_neg_neg_trivial)  
  2427  apply (simp add: div_neg_neg_trivial mod_neg_neg_trivial)  
  2428 txt{*converse direction*}
  2428 txt{*converse direction*}
  2429 apply (drule_tac x = "n div k" in spec) 
  2429 apply (drule_tac x = "n div k" in spec)