src/HOL/Fields.thy
changeset 54147 97a8ff4e4ac9
parent 53374 a14d2a854c02
child 54230 b1d955791529
equal deleted inserted replaced
54146:97f69d44f732 54147:97a8ff4e4ac9
   150   by (simp add: divide_inverse nonzero_inverse_minus_eq)
   150   by (simp add: divide_inverse nonzero_inverse_minus_eq)
   151 
   151 
   152 lemma nonzero_minus_divide_divide: "b \<noteq> 0 ==> (-a) / (-b) = a / b"
   152 lemma nonzero_minus_divide_divide: "b \<noteq> 0 ==> (-a) / (-b) = a / b"
   153   by (simp add: divide_inverse nonzero_inverse_minus_eq)
   153   by (simp add: divide_inverse nonzero_inverse_minus_eq)
   154 
   154 
   155 lemma divide_minus_left [simp, no_atp]: "(-a) / b = - (a / b)"
   155 lemma divide_minus_left [simp]: "(-a) / b = - (a / b)"
   156   by (simp add: divide_inverse)
   156   by (simp add: divide_inverse)
   157 
   157 
   158 lemma diff_divide_distrib: "(a - b) / c = a / c - b / c"
   158 lemma diff_divide_distrib: "(a - b) / c = a / c - b / c"
   159   by (simp add: diff_minus add_divide_distrib)
   159   by (simp add: diff_minus add_divide_distrib)
   160 
   160 
   250 lemma inverse_add:
   250 lemma inverse_add:
   251   "[| a \<noteq> 0;  b \<noteq> 0 |]
   251   "[| a \<noteq> 0;  b \<noteq> 0 |]
   252    ==> inverse a + inverse b = (a + b) * inverse a * inverse b"
   252    ==> inverse a + inverse b = (a + b) * inverse a * inverse b"
   253 by (simp add: division_ring_inverse_add mult_ac)
   253 by (simp add: division_ring_inverse_add mult_ac)
   254 
   254 
   255 lemma nonzero_mult_divide_mult_cancel_left [simp, no_atp]:
   255 lemma nonzero_mult_divide_mult_cancel_left [simp]:
   256 assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" shows "(c*a)/(c*b) = a/b"
   256 assumes [simp]: "b\<noteq>0" and [simp]: "c\<noteq>0" shows "(c*a)/(c*b) = a/b"
   257 proof -
   257 proof -
   258   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   258   have "(c*a)/(c*b) = c * a * (inverse b * inverse c)"
   259     by (simp add: divide_inverse nonzero_inverse_mult_distrib)
   259     by (simp add: divide_inverse nonzero_inverse_mult_distrib)
   260   also have "... =  a * inverse b * (inverse c * c)"
   260   also have "... =  a * inverse b * (inverse c * c)"
   261     by (simp only: mult_ac)
   261     by (simp only: mult_ac)
   262   also have "... =  a * inverse b" by simp
   262   also have "... =  a * inverse b" by simp
   263     finally show ?thesis by (simp add: divide_inverse)
   263     finally show ?thesis by (simp add: divide_inverse)
   264 qed
   264 qed
   265 
   265 
   266 lemma nonzero_mult_divide_mult_cancel_right [simp, no_atp]:
   266 lemma nonzero_mult_divide_mult_cancel_right [simp]:
   267   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (b * c) = a / b"
   267   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (b * c) = a / b"
   268 by (simp add: mult_commute [of _ c])
   268 by (simp add: mult_commute [of _ c])
   269 
   269 
   270 lemma times_divide_eq_left [simp]: "(b / c) * a = (b * a) / c"
   270 lemma times_divide_eq_left [simp]: "(b / c) * a = (b * a) / c"
   271   by (simp add: divide_inverse mult_ac)
   271   by (simp add: divide_inverse mult_ac)
   273 text{*It's not obvious whether @{text times_divide_eq} should be
   273 text{*It's not obvious whether @{text times_divide_eq} should be
   274   simprules or not. Their effect is to gather terms into one big
   274   simprules or not. Their effect is to gather terms into one big
   275   fraction, like a*b*c / x*y*z. The rationale for that is unclear, but
   275   fraction, like a*b*c / x*y*z. The rationale for that is unclear, but
   276   many proofs seem to need them.*}
   276   many proofs seem to need them.*}
   277 
   277 
   278 lemmas times_divide_eq [no_atp] = times_divide_eq_right times_divide_eq_left
   278 lemmas times_divide_eq = times_divide_eq_right times_divide_eq_left
   279 
   279 
   280 lemma add_frac_eq:
   280 lemma add_frac_eq:
   281   assumes "y \<noteq> 0" and "z \<noteq> 0"
   281   assumes "y \<noteq> 0" and "z \<noteq> 0"
   282   shows "x / y + w / z = (x * z + w * y) / (y * z)"
   282   shows "x / y + w / z = (x * z + w * y) / (y * z)"
   283 proof -
   283 proof -
   289     by (simp only: mult_commute)
   289     by (simp only: mult_commute)
   290 qed
   290 qed
   291 
   291 
   292 text{*Special Cancellation Simprules for Division*}
   292 text{*Special Cancellation Simprules for Division*}
   293 
   293 
   294 lemma nonzero_mult_divide_cancel_right [simp, no_atp]:
   294 lemma nonzero_mult_divide_cancel_right [simp]:
   295   "b \<noteq> 0 \<Longrightarrow> a * b / b = a"
   295   "b \<noteq> 0 \<Longrightarrow> a * b / b = a"
   296   using nonzero_mult_divide_mult_cancel_right [of 1 b a] by simp
   296   using nonzero_mult_divide_mult_cancel_right [of 1 b a] by simp
   297 
   297 
   298 lemma nonzero_mult_divide_cancel_left [simp, no_atp]:
   298 lemma nonzero_mult_divide_cancel_left [simp]:
   299   "a \<noteq> 0 \<Longrightarrow> a * b / a = b"
   299   "a \<noteq> 0 \<Longrightarrow> a * b / a = b"
   300 using nonzero_mult_divide_mult_cancel_left [of 1 a b] by simp
   300 using nonzero_mult_divide_mult_cancel_left [of 1 a b] by simp
   301 
   301 
   302 lemma nonzero_divide_mult_cancel_right [simp, no_atp]:
   302 lemma nonzero_divide_mult_cancel_right [simp]:
   303   "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> b / (a * b) = 1 / a"
   303   "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> b / (a * b) = 1 / a"
   304 using nonzero_mult_divide_mult_cancel_right [of a b 1] by simp
   304 using nonzero_mult_divide_mult_cancel_right [of a b 1] by simp
   305 
   305 
   306 lemma nonzero_divide_mult_cancel_left [simp, no_atp]:
   306 lemma nonzero_divide_mult_cancel_left [simp]:
   307   "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> a / (a * b) = 1 / b"
   307   "\<lbrakk>a \<noteq> 0; b \<noteq> 0\<rbrakk> \<Longrightarrow> a / (a * b) = 1 / b"
   308 using nonzero_mult_divide_mult_cancel_left [of b a 1] by simp
   308 using nonzero_mult_divide_mult_cancel_left [of b a 1] by simp
   309 
   309 
   310 lemma nonzero_mult_divide_mult_cancel_left2 [simp, no_atp]:
   310 lemma nonzero_mult_divide_mult_cancel_left2 [simp]:
   311   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (c * a) / (b * c) = a / b"
   311   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (c * a) / (b * c) = a / b"
   312 using nonzero_mult_divide_mult_cancel_left [of b c a] by (simp add: mult_ac)
   312 using nonzero_mult_divide_mult_cancel_left [of b c a] by (simp add: mult_ac)
   313 
   313 
   314 lemma nonzero_mult_divide_mult_cancel_right2 [simp, no_atp]:
   314 lemma nonzero_mult_divide_mult_cancel_right2 [simp]:
   315   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (c * b) = a / b"
   315   "\<lbrakk>b \<noteq> 0; c \<noteq> 0\<rbrakk> \<Longrightarrow> (a * c) / (c * b) = a / b"
   316 using nonzero_mult_divide_mult_cancel_right [of b c a] by (simp add: mult_ac)
   316 using nonzero_mult_divide_mult_cancel_right [of b c a] by (simp add: mult_ac)
   317 
   317 
   318 lemma add_divide_eq_iff [field_simps]:
   318 lemma add_divide_eq_iff [field_simps]:
   319   "z \<noteq> 0 \<Longrightarrow> x + y / z = (z * x + y) / z"
   319   "z \<noteq> 0 \<Longrightarrow> x + y / z = (z * x + y) / z"
   381   "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b"
   381   "c \<noteq> 0 \<Longrightarrow> (a * c) / (b * c) = a / b"
   382 apply (cases "b = 0")
   382 apply (cases "b = 0")
   383 apply simp_all
   383 apply simp_all
   384 done
   384 done
   385 
   385 
   386 lemma divide_divide_eq_right [simp, no_atp]:
   386 lemma divide_divide_eq_right [simp]:
   387   "a / (b / c) = (a * c) / b"
   387   "a / (b / c) = (a * c) / b"
   388   by (simp add: divide_inverse mult_ac)
   388   by (simp add: divide_inverse mult_ac)
   389 
   389 
   390 lemma divide_divide_eq_left [simp, no_atp]:
   390 lemma divide_divide_eq_left [simp]:
   391   "(a / b) / c = a / (b * c)"
   391   "(a / b) / c = a / (b * c)"
   392   by (simp add: divide_inverse mult_assoc)
   392   by (simp add: divide_inverse mult_assoc)
   393 
   393 
   394 
   394 
   395 text {*Special Cancellation Simprules for Division*}
   395 text {*Special Cancellation Simprules for Division*}
   396 
   396 
   397 lemma mult_divide_mult_cancel_left_if [simp,no_atp]:
   397 lemma mult_divide_mult_cancel_left_if [simp]:
   398   shows "(c * a) / (c * b) = (if c = 0 then 0 else a / b)"
   398   shows "(c * a) / (c * b) = (if c = 0 then 0 else a / b)"
   399   by (simp add: mult_divide_mult_cancel_left)
   399   by (simp add: mult_divide_mult_cancel_left)
   400 
   400 
   401 
   401 
   402 text {* Division and Unary Minus *}
   402 text {* Division and Unary Minus *}
   403 
   403 
   404 lemma minus_divide_right:
   404 lemma minus_divide_right:
   405   "- (a / b) = a / - b"
   405   "- (a / b) = a / - b"
   406   by (simp add: divide_inverse)
   406   by (simp add: divide_inverse)
   407 
   407 
   408 lemma divide_minus_right [simp, no_atp]:
   408 lemma divide_minus_right [simp]:
   409   "a / - b = - (a / b)"
   409   "a / - b = - (a / b)"
   410   by (simp add: divide_inverse)
   410   by (simp add: divide_inverse)
   411 
   411 
   412 lemma minus_divide_divide:
   412 lemma minus_divide_divide:
   413   "(- a) / (- b) = a / b"
   413   "(- a) / (- b) = a / b"
   425 
   425 
   426 lemma inverse_eq_1_iff [simp]:
   426 lemma inverse_eq_1_iff [simp]:
   427   "inverse x = 1 \<longleftrightarrow> x = 1"
   427   "inverse x = 1 \<longleftrightarrow> x = 1"
   428   by (insert inverse_eq_iff_eq [of x 1], simp) 
   428   by (insert inverse_eq_iff_eq [of x 1], simp) 
   429 
   429 
   430 lemma divide_eq_0_iff [simp, no_atp]:
   430 lemma divide_eq_0_iff [simp]:
   431   "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0"
   431   "a / b = 0 \<longleftrightarrow> a = 0 \<or> b = 0"
   432   by (simp add: divide_inverse)
   432   by (simp add: divide_inverse)
   433 
   433 
   434 lemma divide_cancel_right [simp, no_atp]:
   434 lemma divide_cancel_right [simp]:
   435   "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b"
   435   "a / c = b / c \<longleftrightarrow> c = 0 \<or> a = b"
   436   apply (cases "c=0", simp)
   436   apply (cases "c=0", simp)
   437   apply (simp add: divide_inverse)
   437   apply (simp add: divide_inverse)
   438   done
   438   done
   439 
   439 
   440 lemma divide_cancel_left [simp, no_atp]:
   440 lemma divide_cancel_left [simp]:
   441   "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" 
   441   "c / a = c / b \<longleftrightarrow> c = 0 \<or> a = b" 
   442   apply (cases "c=0", simp)
   442   apply (cases "c=0", simp)
   443   apply (simp add: divide_inverse)
   443   apply (simp add: divide_inverse)
   444   done
   444   done
   445 
   445 
   446 lemma divide_eq_1_iff [simp, no_atp]:
   446 lemma divide_eq_1_iff [simp]:
   447   "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   447   "a / b = 1 \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   448   apply (cases "b=0", simp)
   448   apply (cases "b=0", simp)
   449   apply (simp add: right_inverse_eq)
   449   apply (simp add: right_inverse_eq)
   450   done
   450   done
   451 
   451 
   452 lemma one_eq_divide_iff [simp, no_atp]:
   452 lemma one_eq_divide_iff [simp]:
   453   "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   453   "1 = a / b \<longleftrightarrow> b \<noteq> 0 \<and> a = b"
   454   by (simp add: eq_commute [of 1])
   454   by (simp add: eq_commute [of 1])
   455 
   455 
   456 lemma times_divide_times_eq:
   456 lemma times_divide_times_eq:
   457   "(x / y) * (z / w) = (x * z) / (y * w)"
   457   "(x / y) * (z / w) = (x * z) / (y * w)"
   557 apply (simp add: less_le [of "inverse a"] less_le [of "b"])
   557 apply (simp add: less_le [of "inverse a"] less_le [of "b"])
   558 apply (force dest!: inverse_le_imp_le nonzero_inverse_eq_imp_eq) 
   558 apply (force dest!: inverse_le_imp_le nonzero_inverse_eq_imp_eq) 
   559 done
   559 done
   560 
   560 
   561 text{*Both premises are essential. Consider -1 and 1.*}
   561 text{*Both premises are essential. Consider -1 and 1.*}
   562 lemma inverse_less_iff_less [simp,no_atp]:
   562 lemma inverse_less_iff_less [simp]:
   563   "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a"
   563   "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a"
   564   by (blast intro: less_imp_inverse_less dest: inverse_less_imp_less) 
   564   by (blast intro: less_imp_inverse_less dest: inverse_less_imp_less) 
   565 
   565 
   566 lemma le_imp_inverse_le:
   566 lemma le_imp_inverse_le:
   567   "a \<le> b \<Longrightarrow> 0 < a \<Longrightarrow> inverse b \<le> inverse a"
   567   "a \<le> b \<Longrightarrow> 0 < a \<Longrightarrow> inverse b \<le> inverse a"
   568   by (force simp add: le_less less_imp_inverse_less)
   568   by (force simp add: le_less less_imp_inverse_less)
   569 
   569 
   570 lemma inverse_le_iff_le [simp,no_atp]:
   570 lemma inverse_le_iff_le [simp]:
   571   "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a"
   571   "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a"
   572   by (blast intro: le_imp_inverse_le dest: inverse_le_imp_le) 
   572   by (blast intro: le_imp_inverse_le dest: inverse_le_imp_le) 
   573 
   573 
   574 
   574 
   575 text{*These results refer to both operands being negative.  The opposite-sign
   575 text{*These results refer to both operands being negative.  The opposite-sign
   599  apply force
   599  apply force
   600 apply (insert inverse_less_imp_less [of "-b" "-a"])
   600 apply (insert inverse_less_imp_less [of "-b" "-a"])
   601 apply (simp add: nonzero_inverse_minus_eq) 
   601 apply (simp add: nonzero_inverse_minus_eq) 
   602 done
   602 done
   603 
   603 
   604 lemma inverse_less_iff_less_neg [simp,no_atp]:
   604 lemma inverse_less_iff_less_neg [simp]:
   605   "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a"
   605   "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a < inverse b \<longleftrightarrow> b < a"
   606 apply (insert inverse_less_iff_less [of "-b" "-a"])
   606 apply (insert inverse_less_iff_less [of "-b" "-a"])
   607 apply (simp del: inverse_less_iff_less 
   607 apply (simp del: inverse_less_iff_less 
   608             add: nonzero_inverse_minus_eq)
   608             add: nonzero_inverse_minus_eq)
   609 done
   609 done
   610 
   610 
   611 lemma le_imp_inverse_le_neg:
   611 lemma le_imp_inverse_le_neg:
   612   "a \<le> b \<Longrightarrow> b < 0 ==> inverse b \<le> inverse a"
   612   "a \<le> b \<Longrightarrow> b < 0 ==> inverse b \<le> inverse a"
   613   by (force simp add: le_less less_imp_inverse_less_neg)
   613   by (force simp add: le_less less_imp_inverse_less_neg)
   614 
   614 
   615 lemma inverse_le_iff_le_neg [simp,no_atp]:
   615 lemma inverse_le_iff_le_neg [simp]:
   616   "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a"
   616   "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> inverse a \<le> inverse b \<longleftrightarrow> b \<le> a"
   617   by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) 
   617   by (blast intro: le_imp_inverse_le_neg dest: inverse_le_imp_le_neg) 
   618 
   618 
   619 lemma one_less_inverse:
   619 lemma one_less_inverse:
   620   "0 < a \<Longrightarrow> a < 1 \<Longrightarrow> 1 < inverse a"
   620   "0 < a \<Longrightarrow> a < 1 \<Longrightarrow> 1 < inverse a"
   711 text{* Lemmas @{text sign_simps} is a first attempt to automate proofs
   711 text{* Lemmas @{text sign_simps} is a first attempt to automate proofs
   712 of positivity/negativity needed for @{text field_simps}. Have not added @{text
   712 of positivity/negativity needed for @{text field_simps}. Have not added @{text
   713 sign_simps} to @{text field_simps} because the former can lead to case
   713 sign_simps} to @{text field_simps} because the former can lead to case
   714 explosions. *}
   714 explosions. *}
   715 
   715 
   716 lemmas sign_simps [no_atp] = algebra_simps
   716 lemmas sign_simps = algebra_simps zero_less_mult_iff mult_less_0_iff
   717   zero_less_mult_iff mult_less_0_iff
   717 
   718 
   718 lemmas (in -) sign_simps = algebra_simps zero_less_mult_iff mult_less_0_iff
   719 lemmas (in -) sign_simps [no_atp] = algebra_simps
       
   720   zero_less_mult_iff mult_less_0_iff
       
   721 
   719 
   722 (* Only works once linear arithmetic is installed:
   720 (* Only works once linear arithmetic is installed:
   723 text{*An example:*}
   721 text{*An example:*}
   724 lemma fixes a b c d e f :: "'a::linordered_field"
   722 lemma fixes a b c d e f :: "'a::linordered_field"
   725 shows "\<lbrakk>a>b; c<d; e<f; 0 < u \<rbrakk> \<Longrightarrow>
   723 shows "\<lbrakk>a>b; c<d; e<f; 0 < u \<rbrakk> \<Longrightarrow>
   996 
   994 
   997 text {* Division and the Number One *}
   995 text {* Division and the Number One *}
   998 
   996 
   999 text{*Simplify expressions equated with 1*}
   997 text{*Simplify expressions equated with 1*}
  1000 
   998 
  1001 lemma zero_eq_1_divide_iff [simp,no_atp]:
   999 lemma zero_eq_1_divide_iff [simp]:
  1002      "(0 = 1/a) = (a = 0)"
  1000      "(0 = 1/a) = (a = 0)"
  1003 apply (cases "a=0", simp)
  1001 apply (cases "a=0", simp)
  1004 apply (auto simp add: nonzero_eq_divide_eq)
  1002 apply (auto simp add: nonzero_eq_divide_eq)
  1005 done
  1003 done
  1006 
  1004 
  1007 lemma one_divide_eq_0_iff [simp,no_atp]:
  1005 lemma one_divide_eq_0_iff [simp]:
  1008      "(1/a = 0) = (a = 0)"
  1006      "(1/a = 0) = (a = 0)"
  1009 apply (cases "a=0", simp)
  1007 apply (cases "a=0", simp)
  1010 apply (insert zero_neq_one [THEN not_sym])
  1008 apply (insert zero_neq_one [THEN not_sym])
  1011 apply (auto simp add: nonzero_divide_eq_eq)
  1009 apply (auto simp add: nonzero_divide_eq_eq)
  1012 done
  1010 done
  1013 
  1011 
  1014 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*}
  1012 text{*Simplify expressions such as @{text "0 < 1/x"} to @{text "0 < x"}*}
  1015 
  1013 
  1016 lemma zero_le_divide_1_iff [simp, no_atp]:
  1014 lemma zero_le_divide_1_iff [simp]:
  1017   "0 \<le> 1 / a \<longleftrightarrow> 0 \<le> a"
  1015   "0 \<le> 1 / a \<longleftrightarrow> 0 \<le> a"
  1018   by (simp add: zero_le_divide_iff)
  1016   by (simp add: zero_le_divide_iff)
  1019 
  1017 
  1020 lemma zero_less_divide_1_iff [simp, no_atp]:
  1018 lemma zero_less_divide_1_iff [simp]:
  1021   "0 < 1 / a \<longleftrightarrow> 0 < a"
  1019   "0 < 1 / a \<longleftrightarrow> 0 < a"
  1022   by (simp add: zero_less_divide_iff)
  1020   by (simp add: zero_less_divide_iff)
  1023 
  1021 
  1024 lemma divide_le_0_1_iff [simp, no_atp]:
  1022 lemma divide_le_0_1_iff [simp]:
  1025   "1 / a \<le> 0 \<longleftrightarrow> a \<le> 0"
  1023   "1 / a \<le> 0 \<longleftrightarrow> a \<le> 0"
  1026   by (simp add: divide_le_0_iff)
  1024   by (simp add: divide_le_0_iff)
  1027 
  1025 
  1028 lemma divide_less_0_1_iff [simp, no_atp]:
  1026 lemma divide_less_0_1_iff [simp]:
  1029   "1 / a < 0 \<longleftrightarrow> a < 0"
  1027   "1 / a < 0 \<longleftrightarrow> a < 0"
  1030   by (simp add: divide_less_0_iff)
  1028   by (simp add: divide_less_0_iff)
  1031 
  1029 
  1032 lemma divide_right_mono:
  1030 lemma divide_right_mono:
  1033      "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/c"
  1031      "[|a \<le> b; 0 \<le> c|] ==> a/c \<le> b/c"
  1078   "a / c < b / c \<longleftrightarrow> (0 < c \<longrightarrow> a < b) \<and> (c < 0 \<longrightarrow> b < a) \<and> c \<noteq> 0"
  1076   "a / c < b / c \<longleftrightarrow> (0 < c \<longrightarrow> a < b) \<and> (c < 0 \<longrightarrow> b < a) \<and> c \<noteq> 0"
  1079   by (auto simp add: divide_inverse mult_less_cancel_right)
  1077   by (auto simp add: divide_inverse mult_less_cancel_right)
  1080 
  1078 
  1081 text{*Simplify quotients that are compared with the value 1.*}
  1079 text{*Simplify quotients that are compared with the value 1.*}
  1082 
  1080 
  1083 lemma le_divide_eq_1 [no_atp]:
  1081 lemma le_divide_eq_1:
  1084   "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))"
  1082   "(1 \<le> b / a) = ((0 < a & a \<le> b) | (a < 0 & b \<le> a))"
  1085 by (auto simp add: le_divide_eq)
  1083 by (auto simp add: le_divide_eq)
  1086 
  1084 
  1087 lemma divide_le_eq_1 [no_atp]:
  1085 lemma divide_le_eq_1:
  1088   "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)"
  1086   "(b / a \<le> 1) = ((0 < a & b \<le> a) | (a < 0 & a \<le> b) | a=0)"
  1089 by (auto simp add: divide_le_eq)
  1087 by (auto simp add: divide_le_eq)
  1090 
  1088 
  1091 lemma less_divide_eq_1 [no_atp]:
  1089 lemma less_divide_eq_1:
  1092   "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))"
  1090   "(1 < b / a) = ((0 < a & a < b) | (a < 0 & b < a))"
  1093 by (auto simp add: less_divide_eq)
  1091 by (auto simp add: less_divide_eq)
  1094 
  1092 
  1095 lemma divide_less_eq_1 [no_atp]:
  1093 lemma divide_less_eq_1:
  1096   "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)"
  1094   "(b / a < 1) = ((0 < a & b < a) | (a < 0 & a < b) | a=0)"
  1097 by (auto simp add: divide_less_eq)
  1095 by (auto simp add: divide_less_eq)
  1098 
  1096 
  1099 
  1097 
  1100 text {*Conditional Simplification Rules: No Case Splits*}
  1098 text {*Conditional Simplification Rules: No Case Splits*}
  1101 
  1099 
  1102 lemma le_divide_eq_1_pos [simp,no_atp]:
  1100 lemma le_divide_eq_1_pos [simp]:
  1103   "0 < a \<Longrightarrow> (1 \<le> b/a) = (a \<le> b)"
  1101   "0 < a \<Longrightarrow> (1 \<le> b/a) = (a \<le> b)"
  1104 by (auto simp add: le_divide_eq)
  1102 by (auto simp add: le_divide_eq)
  1105 
  1103 
  1106 lemma le_divide_eq_1_neg [simp,no_atp]:
  1104 lemma le_divide_eq_1_neg [simp]:
  1107   "a < 0 \<Longrightarrow> (1 \<le> b/a) = (b \<le> a)"
  1105   "a < 0 \<Longrightarrow> (1 \<le> b/a) = (b \<le> a)"
  1108 by (auto simp add: le_divide_eq)
  1106 by (auto simp add: le_divide_eq)
  1109 
  1107 
  1110 lemma divide_le_eq_1_pos [simp,no_atp]:
  1108 lemma divide_le_eq_1_pos [simp]:
  1111   "0 < a \<Longrightarrow> (b/a \<le> 1) = (b \<le> a)"
  1109   "0 < a \<Longrightarrow> (b/a \<le> 1) = (b \<le> a)"
  1112 by (auto simp add: divide_le_eq)
  1110 by (auto simp add: divide_le_eq)
  1113 
  1111 
  1114 lemma divide_le_eq_1_neg [simp,no_atp]:
  1112 lemma divide_le_eq_1_neg [simp]:
  1115   "a < 0 \<Longrightarrow> (b/a \<le> 1) = (a \<le> b)"
  1113   "a < 0 \<Longrightarrow> (b/a \<le> 1) = (a \<le> b)"
  1116 by (auto simp add: divide_le_eq)
  1114 by (auto simp add: divide_le_eq)
  1117 
  1115 
  1118 lemma less_divide_eq_1_pos [simp,no_atp]:
  1116 lemma less_divide_eq_1_pos [simp]:
  1119   "0 < a \<Longrightarrow> (1 < b/a) = (a < b)"
  1117   "0 < a \<Longrightarrow> (1 < b/a) = (a < b)"
  1120 by (auto simp add: less_divide_eq)
  1118 by (auto simp add: less_divide_eq)
  1121 
  1119 
  1122 lemma less_divide_eq_1_neg [simp,no_atp]:
  1120 lemma less_divide_eq_1_neg [simp]:
  1123   "a < 0 \<Longrightarrow> (1 < b/a) = (b < a)"
  1121   "a < 0 \<Longrightarrow> (1 < b/a) = (b < a)"
  1124 by (auto simp add: less_divide_eq)
  1122 by (auto simp add: less_divide_eq)
  1125 
  1123 
  1126 lemma divide_less_eq_1_pos [simp,no_atp]:
  1124 lemma divide_less_eq_1_pos [simp]:
  1127   "0 < a \<Longrightarrow> (b/a < 1) = (b < a)"
  1125   "0 < a \<Longrightarrow> (b/a < 1) = (b < a)"
  1128 by (auto simp add: divide_less_eq)
  1126 by (auto simp add: divide_less_eq)
  1129 
  1127 
  1130 lemma divide_less_eq_1_neg [simp,no_atp]:
  1128 lemma divide_less_eq_1_neg [simp]:
  1131   "a < 0 \<Longrightarrow> b/a < 1 <-> a < b"
  1129   "a < 0 \<Longrightarrow> b/a < 1 <-> a < b"
  1132 by (auto simp add: divide_less_eq)
  1130 by (auto simp add: divide_less_eq)
  1133 
  1131 
  1134 lemma eq_divide_eq_1 [simp,no_atp]:
  1132 lemma eq_divide_eq_1 [simp]:
  1135   "(1 = b/a) = ((a \<noteq> 0 & a = b))"
  1133   "(1 = b/a) = ((a \<noteq> 0 & a = b))"
  1136 by (auto simp add: eq_divide_eq)
  1134 by (auto simp add: eq_divide_eq)
  1137 
  1135 
  1138 lemma divide_eq_eq_1 [simp,no_atp]:
  1136 lemma divide_eq_eq_1 [simp]:
  1139   "(b/a = 1) = ((a \<noteq> 0 & a = b))"
  1137   "(b/a = 1) = ((a \<noteq> 0 & a = b))"
  1140 by (auto simp add: divide_eq_eq)
  1138 by (auto simp add: divide_eq_eq)
  1141 
  1139 
  1142 lemma abs_inverse [simp]:
  1140 lemma abs_inverse [simp]:
  1143      "\<bar>inverse a\<bar> = 
  1141      "\<bar>inverse a\<bar> =