equal
deleted
inserted
replaced
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 |