src/HOL/Divides.thy
changeset 16733 236dfafbeb63
parent 15439 71c0f98e31f1
child 16796 140f1e0ea846
equal deleted inserted replaced
16732:1bbe526a552c 16733:236dfafbeb63
   240 
   240 
   241 
   241 
   242 subsection{*Proving facts about Quotient and Remainder*}
   242 subsection{*Proving facts about Quotient and Remainder*}
   243 
   243 
   244 lemma unique_quotient_lemma:
   244 lemma unique_quotient_lemma:
   245      "[| b*q' + r'  \<le> b*q + r;  0 < b;  r < b |]  
   245      "[| b*q' + r'  \<le> b*q + r;  x < b;  r < b |]  
   246       ==> q' \<le> (q::nat)"
   246       ==> q' \<le> (q::nat)"
   247 apply (rule leI)
   247 apply (rule leI)
   248 apply (subst less_iff_Suc_add)
   248 apply (subst less_iff_Suc_add)
   249 apply (auto simp add: add_mult_distrib2)
   249 apply (auto simp add: add_mult_distrib2)
   250 done
   250 done
   252 lemma unique_quotient:
   252 lemma unique_quotient:
   253      "[| quorem ((a,b), (q,r));  quorem ((a,b), (q',r'));  0 < b |]  
   253      "[| quorem ((a,b), (q,r));  quorem ((a,b), (q',r'));  0 < b |]  
   254       ==> q = q'"
   254       ==> q = q'"
   255 apply (simp add: split_ifs quorem_def)
   255 apply (simp add: split_ifs quorem_def)
   256 apply (blast intro: order_antisym 
   256 apply (blast intro: order_antisym 
   257              dest: order_eq_refl [THEN unique_quotient_lemma] sym)+
   257              dest: order_eq_refl [THEN unique_quotient_lemma] sym)
   258 done
   258 done
   259 
   259 
   260 lemma unique_remainder:
   260 lemma unique_remainder:
   261      "[| quorem ((a,b), (q,r));  quorem ((a,b), (q',r'));  0 < b |]  
   261      "[| quorem ((a,b), (q,r));  quorem ((a,b), (q',r'));  0 < b |]  
   262       ==> r = r'"
   262       ==> r = r'"
   700 
   700 
   701 lemma split_div_lemma:
   701 lemma split_div_lemma:
   702   "0 < n \<Longrightarrow> (n * q \<le> m \<and> m < n * (Suc q)) = (q = ((m::nat) div n))"
   702   "0 < n \<Longrightarrow> (n * q \<le> m \<and> m < n * (Suc q)) = (q = ((m::nat) div n))"
   703   apply (rule iffI)
   703   apply (rule iffI)
   704   apply (rule_tac a=m and r = "m - n * q" and r' = "m mod n" in unique_quotient)
   704   apply (rule_tac a=m and r = "m - n * q" and r' = "m mod n" in unique_quotient)
   705   apply (simp_all add: quorem_def, arith)
   705 prefer 3; apply assumption
       
   706   apply (simp_all add: quorem_def)
       
   707   apply arith
   706   apply (rule conjI)
   708   apply (rule conjI)
   707   apply (rule_tac P="%x. n * (m div n) \<le> x" in
   709   apply (rule_tac P="%x. n * (m div n) \<le> x" in
   708     subst [OF mod_div_equality [of _ n]])
   710     subst [OF mod_div_equality [of _ n]])
   709   apply (simp only: add: mult_ac)
   711   apply (simp only: add: mult_ac)
   710   apply (rule_tac P="%x. x < n + n * (m div n)" in
   712   apply (rule_tac P="%x. x < n + n * (m div n)" in