src/HOL/Integ/IntDiv.thy
changeset 13517 42efec18f5b2
parent 13266 2a6ad4357d72
child 13524 604d0f3622d6
--- a/src/HOL/Integ/IntDiv.thy	Fri Aug 23 07:34:20 2002 +0200
+++ b/src/HOL/Integ/IntDiv.thy	Fri Aug 23 07:41:05 2002 +0200
@@ -31,7 +31,8 @@
 *)
 
 
-theory IntDiv = IntArith + Recdef:
+theory IntDiv = IntArith + Recdef
+  files ("IntDiv_setup.ML"):
 
 declare zless_nat_conj [simp]
 
@@ -221,6 +222,14 @@
 apply (auto simp add: quorem_def div_def mod_def)
 done
 
+lemma zdiv_zmod_equality: "(b * (a div b) + (a mod b)) + k = (a::int)+k"
+by(simp add: zmod_zdiv_equality[symmetric])
+
+lemma zdiv_zmod_equality2: "((a div b) * b + (a mod b)) + k = (a::int)+k"
+by(simp add: zmult_commute zmod_zdiv_equality[symmetric])
+
+use "IntDiv_setup.ML"
+
 lemma pos_mod_conj : "(0::int) < b ==> 0 <= a mod b & a mod b < b"
 apply (cut_tac a = a and b = b in divAlg_correct)
 apply (auto simp add: quorem_def mod_def)
@@ -572,8 +581,7 @@
      "[| quorem((b,c),(q,r));  c ~= 0 |]  
       ==> quorem ((a*b, c), (a*q + a*r div c, a*r mod c))"
 by (force simp add: split_ifs quorem_def linorder_neq_iff zadd_zmult_distrib2
-                    pos_mod_sign pos_mod_bound neg_mod_sign neg_mod_bound 
-                    zmod_zdiv_equality)
+                    pos_mod_sign pos_mod_bound neg_mod_sign neg_mod_bound)
 
 lemma zdiv_zmult1_eq: "(a*b) div c = a*(b div c) + a*(b mod c) div (c::int)"
 apply (case_tac "c = 0", simp add: DIVISION_BY_ZERO)
@@ -610,7 +618,13 @@
 by (simp add: zmult_commute zmod_zmult1_eq)
 
 lemma zmod_eq_0_iff: "(m mod d = 0) = (EX q::int. m = d*q)"
-by (cut_tac a = m and b = d in zmod_zdiv_equality, auto)
+proof
+  assume "m mod d = 0"
+  from this zmod_zdiv_equality[of m d] show "EX q::int. m = d*q" by auto
+next
+  assume "EX q::int. m = d*q"
+  thus "m mod d = 0" by auto
+qed
 
 declare zmod_eq_0_iff [THEN iffD1, dest!]
 
@@ -621,8 +635,7 @@
      "[| quorem((a,c),(aq,ar));  quorem((b,c),(bq,br));  c ~= 0 |]  
       ==> quorem ((a+b, c), (aq + bq + (ar+br) div c, (ar+br) mod c))"
 by (force simp add: split_ifs quorem_def linorder_neq_iff zadd_zmult_distrib2
-                    pos_mod_sign pos_mod_bound neg_mod_sign neg_mod_bound
-                    zmod_zdiv_equality)
+                    pos_mod_sign pos_mod_bound neg_mod_sign neg_mod_bound)
 
 (*NOT suitable for rewriting: the RHS has an instance of the LHS*)
 lemma zdiv_zadd1_eq:
@@ -720,7 +733,7 @@
 
 lemma zmult2_lemma: "[| quorem ((a,b), (q,r));  b ~= 0;  0 < c |]  
       ==> quorem ((a, b*c), (q div c, b*(q mod c) + r))"
-by (auto simp add: zmult_ac zmod_zdiv_equality quorem_def linorder_neq_iff
+by (auto simp add: zmult_ac quorem_def linorder_neq_iff
                    int_0_less_mult_iff zadd_zmult_distrib2 [symmetric] 
                    lemma1 lemma2 lemma3 lemma4)
 
@@ -796,7 +809,7 @@
 txt{*converse direction*}
 apply (drule_tac x = "n div k" in spec) 
 apply (drule_tac x = "n mod k" in spec) 
-apply (simp add: pos_mod_bound pos_mod_sign zmod_zdiv_equality [symmetric]) 
+apply (simp add: pos_mod_bound pos_mod_sign) 
 done
 
 lemma split_neg_lemma:
@@ -811,7 +824,7 @@
 txt{*converse direction*}
 apply (drule_tac x = "n div k" in spec) 
 apply (drule_tac x = "n mod k" in spec) 
-apply (simp add: neg_mod_bound neg_mod_sign zmod_zdiv_equality [symmetric]) 
+apply (simp add: neg_mod_bound neg_mod_sign) 
 done
 
 lemma split_zdiv: