src/HOL/Divides.thy
changeset 26062 16f334d7156a
parent 25947 1f2f4d941e9e
child 26072 f65a7fa2da6c
--- a/src/HOL/Divides.thy	Mon Feb 11 22:12:19 2008 +0100
+++ b/src/HOL/Divides.thy	Wed Feb 13 09:35:31 2008 +0100
@@ -34,7 +34,7 @@
 begin
 
 lemma div_by_1: "a div 1 = a"
-  using mult_div [of one a] zero_neq_one by simp
+  using mult_div [of 1 a] zero_neq_one by simp
 
 lemma mod_by_1: "a mod 1 = 0"
 proof -
@@ -73,6 +73,22 @@
 lemma mod_0: "0 mod a = 0"
   using mod_div_equality [of zero a] div_0 by simp 
 
+lemma mod_div_equality2: "b * (a div b) + a mod b = a"
+  unfolding mult_commute [of b]
+  by (rule mod_div_equality)
+
+lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
+  by (simp add: mod_div_equality)
+
+lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
+  by (simp add: mod_div_equality2)
+
+lemma dvdI [intro?]: "a = b * c \<Longrightarrow> b dvd a"
+  unfolding dvd_def ..
+
+lemma dvdE [elim?]: "b dvd a \<Longrightarrow> (\<And>c. a = b * c \<Longrightarrow> P) \<Longrightarrow> P"
+  unfolding dvd_def by blast 
+
 lemma dvd_def_mod [code func]: "a dvd b \<longleftrightarrow> b mod a = 0"
 proof
   assume "b mod a = 0"
@@ -102,7 +118,7 @@
   then show ?thesis unfolding dvd_def ..
 qed
 
-lemma one_dvd: "1 dvd a"
+lemma zero_dvd_iff [noatp]: "0 dvd a \<longleftrightarrow> a = 0"
   unfolding dvd_def by simp
 
 lemma dvd_0: "a dvd 0"
@@ -110,6 +126,35 @@
   show "0 = a * 0" by simp
 qed
 
+lemma one_dvd: "1 dvd a"
+  unfolding dvd_def by simp
+
+lemma dvd_mult: "a dvd c \<Longrightarrow> a dvd (b * c)"
+  unfolding dvd_def by (blast intro: mult_left_commute)
+
+lemma dvd_mult2: "a dvd b \<Longrightarrow> a dvd (b * c)"
+  apply (subst mult_commute)
+  apply (erule dvd_mult)
+  done
+
+lemma dvd_triv_right: "a dvd b * a"
+  by (rule dvd_mult) (rule dvd_refl)
+
+lemma dvd_triv_left: "a dvd a * b"
+  by (rule dvd_mult2) (rule dvd_refl)
+
+lemma mult_dvd_mono: "a dvd c \<Longrightarrow> b dvd d \<Longrightarrow> a * b dvd c * d"
+  apply (unfold dvd_def, clarify)
+  apply (rule_tac x = "k * ka" in exI)
+  apply (simp add: mult_ac)
+  done
+
+lemma dvd_mult_left: "a * b dvd c \<Longrightarrow> a dvd c"
+  by (simp add: dvd_def mult_assoc, blast)
+
+lemma dvd_mult_right: "a * b dvd c \<Longrightarrow> b dvd c"
+  unfolding mult_ac [of a] by (rule dvd_mult_left)
+
 end
 
 
@@ -181,16 +226,9 @@
 subsubsection{*Simproc for Cancelling Div and Mod*}
 
 lemmas mod_div_equality = semiring_div_class.times_div_mod_plus_zero_one.mod_div_equality [of "m\<Colon>nat" n, standard]
-
-lemma mod_div_equality2: "n * (m div n) + m mod n = (m::nat)"
-  unfolding mult_commute [of n]
-  by (rule mod_div_equality)
-
-lemma div_mod_equality: "((m div n)*n + m mod n) + k = (m::nat) + k"
-  by (simp add: mod_div_equality)
-
-lemma div_mod_equality2: "(n*(m div n) + m mod n) + k = (m::nat) + k"
-  by (simp add: mod_div_equality2)
+lemmas mod_div_equality2 = mod_div_equality2 [of "n\<Colon>nat" m, standard]
+lemmas div_mod_equality = div_mod_equality [of "m\<Colon>nat" n k, standard]
+lemmas div_mod_equality2 = div_mod_equality2 [of "m\<Colon>nat" n k, standard]
 
 ML {*
 structure CancelDivModData =
@@ -369,7 +407,6 @@
 
 lemma div_mult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::nat)"
 apply (cases "c = 0", simp)
-thm DIVISION_BY_ZERO_DIV
 apply (blast intro: quorem_div_mod [THEN quorem_mult1_eq, THEN quorem_div])
 done