src/HOL/Ring_and_Field.thy
changeset 14738 83f1a514dcb4
parent 14603 985eb6708207
child 14754 a080eeeaec14
     1.1 --- a/src/HOL/Ring_and_Field.thy	Tue May 11 14:00:02 2004 +0200
     1.2 +++ b/src/HOL/Ring_and_Field.thy	Tue May 11 20:11:08 2004 +0200
     1.3 @@ -2,286 +2,132 @@
     1.4      ID:      $Id$
     1.5      Author:  Gertrud Bauer and Markus Wenzel, TU Muenchen
     1.6               Lawrence C Paulson, University of Cambridge
     1.7 +             Revised and splitted into Ring_and_Field.thy and Group.thy 
     1.8 +             by Steven Obua, TU Muenchen, in May 2004
     1.9      License: GPL (GNU GENERAL PUBLIC LICENSE)
    1.10  *)
    1.11  
    1.12 -header {* Ring and field structures *}
    1.13 +header {* (Ordered) Rings and Fields *}
    1.14  
    1.15 -theory Ring_and_Field = Inductive:
    1.16 +theory Ring_and_Field = OrderedGroup:
    1.17  
    1.18 -subsection {* Abstract algebraic structures *}
    1.19 +text {*
    1.20 +  The theory of partially ordered rings is taken from the books:
    1.21 +  \begin{itemize}
    1.22 +  \item \emph{Lattice Theory} by Garret Birkhoff, American Mathematical Society 1979 
    1.23 +  \item \emph{Partially Ordered Algebraic Systems}, Pergamon Press 1963
    1.24 +  \end{itemize}
    1.25 +  Most of the used notions can also be looked up in 
    1.26 +  \begin{itemize}
    1.27 +  \item \emph{www.mathworld.com} by Eric Weisstein et. al.
    1.28 +  \item \emph{Algebra I} by van der Waerden, Springer.
    1.29 +  \end{itemize}
    1.30 +*}
    1.31  
    1.32 -subsection {* Types Classes @{text plus_ac0} and @{text times_ac1} *}
    1.33 +axclass semiring \<subseteq> ab_semigroup_add, semigroup_mult
    1.34 +  left_distrib: "(a + b) * c = a * c + b * c"
    1.35 +  right_distrib: "a * (b + c) = a * b + a * c"
    1.36  
    1.37 -axclass plus_ac0 \<subseteq> plus, zero
    1.38 -  commute:     "x + y = y + x"
    1.39 -  assoc:       "(x + y) + z = x + (y + z)"
    1.40 -  zero [simp]: "0 + x = x"
    1.41 +axclass semiring_0 \<subseteq> semiring, comm_monoid_add
    1.42  
    1.43 -lemma plus_ac0_left_commute: "x + (y+z) = y + ((x+z)::'a::plus_ac0)"
    1.44 -by(rule mk_left_commute[of "op +",OF plus_ac0.assoc plus_ac0.commute])
    1.45 +axclass comm_semiring \<subseteq> ab_semigroup_add, ab_semigroup_mult  
    1.46 +  mult_commute: "a * b = b * a"
    1.47 +  distrib: "(a + b) * c = a * c + b * c"
    1.48  
    1.49 -lemma plus_ac0_zero_right [simp]: "x + 0 = (x ::'a::plus_ac0)"
    1.50 -apply (rule plus_ac0.commute [THEN trans])
    1.51 -apply (rule plus_ac0.zero)
    1.52 -done
    1.53 -
    1.54 -lemmas plus_ac0 = plus_ac0.assoc plus_ac0.commute plus_ac0_left_commute
    1.55 -                  plus_ac0.zero plus_ac0_zero_right
    1.56 -
    1.57 -axclass times_ac1 \<subseteq> times, one
    1.58 -  commute:     "x * y = y * x"
    1.59 -  assoc:       "(x * y) * z = x * (y * z)"
    1.60 -  one [simp]:  "1 * x = x"
    1.61 -
    1.62 -theorem times_ac1_left_commute: "(x::'a::times_ac1) * ((y::'a) * z) =
    1.63 -  y * (x * z)"
    1.64 -by(rule mk_left_commute[of "op *",OF times_ac1.assoc times_ac1.commute])
    1.65 -
    1.66 -theorem times_ac1_one_right [simp]: "(x::'a::times_ac1) * 1 = x"
    1.67 -proof -
    1.68 -  have "x * 1 = 1 * x"
    1.69 -    by (rule times_ac1.commute)
    1.70 -  also have "... = x"
    1.71 -    by (rule times_ac1.one)
    1.72 -  finally show ?thesis .
    1.73 +instance comm_semiring \<subseteq> semiring
    1.74 +proof
    1.75 +  fix a b c :: 'a
    1.76 +  show "(a + b) * c = a * c + b * c" by (simp add: distrib)
    1.77 +  have "a * (b + c) = (b + c) * a" by (simp add: mult_ac)
    1.78 +  also have "... = b * a + c * a" by (simp only: distrib)
    1.79 +  also have "... = a * b + a * c" by (simp add: mult_ac)
    1.80 +  finally show "a * (b + c) = a * b + a * c" by blast
    1.81  qed
    1.82  
    1.83 -theorems times_ac1 = times_ac1.assoc times_ac1.commute times_ac1_left_commute
    1.84 -  times_ac1.one times_ac1_one_right
    1.85 +axclass comm_semiring_0 \<subseteq> comm_semiring, comm_monoid_add
    1.86  
    1.87 +instance comm_semiring_0 \<subseteq> semiring_0 ..
    1.88  
    1.89 -text{*This class is the same as @{text plus_ac0}, while using the same axiom
    1.90 -names as the other axclasses.*}
    1.91 -axclass abelian_semigroup \<subseteq> zero, plus
    1.92 -  add_assoc: "(a + b) + c = a + (b + c)"
    1.93 -  add_commute: "a + b = b + a"
    1.94 -  add_0 [simp]: "0 + a = a"
    1.95 -
    1.96 -text{*This class underlies both @{text semiring} and @{text ring}*}
    1.97 -axclass almost_semiring \<subseteq> abelian_semigroup, one, times
    1.98 -  mult_assoc: "(a * b) * c = a * (b * c)"
    1.99 -  mult_commute: "a * b = b * a"
   1.100 -  mult_1 [simp]: "1 * a = a"
   1.101 -
   1.102 -  left_distrib: "(a + b) * c = a * c + b * c"
   1.103 +axclass axclass_0_neq_1 \<subseteq> zero, one
   1.104    zero_neq_one [simp]: "0 \<noteq> 1"
   1.105  
   1.106 +axclass semiring_1 \<subseteq> axclass_0_neq_1, semiring_0, monoid_mult
   1.107  
   1.108 -axclass semiring \<subseteq> almost_semiring
   1.109 -  add_left_imp_eq: "a + b = a + c ==> b=c"
   1.110 -    --{*This axiom is needed for semirings only: for rings, etc., it is
   1.111 -        redundant. Including it allows many more of the following results
   1.112 -        to be proved for semirings too.*}
   1.113 +axclass comm_semiring_1 \<subseteq> axclass_0_neq_1, comm_semiring_0, comm_monoid_mult (* previously almost_semiring *)
   1.114  
   1.115 -instance abelian_semigroup \<subseteq> plus_ac0
   1.116 -proof
   1.117 -  fix x y z :: 'a
   1.118 -  show "x + y = y + x" by (rule add_commute)
   1.119 -  show "x + y + z = x + (y + z)" by (rule add_assoc)
   1.120 -  show "0+x = x" by (rule add_0)
   1.121 -qed
   1.122 +instance comm_semiring_1 \<subseteq> semiring_1 ..
   1.123  
   1.124 -instance almost_semiring \<subseteq> times_ac1
   1.125 -proof
   1.126 -  fix x y z :: 'a
   1.127 -  show "x * y = y * x" by (rule mult_commute)
   1.128 -  show "x * y * z = x * (y * z)" by (rule mult_assoc)
   1.129 -  show "1*x = x" by simp
   1.130 -qed
   1.131 +axclass axclass_no_zero_divisors \<subseteq> zero, times
   1.132 +  no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0"
   1.133  
   1.134 -axclass abelian_group \<subseteq> abelian_semigroup, minus
   1.135 -   left_minus [simp]: "-a + a = 0"
   1.136 -   diff_minus: "a - b = a + -b"
   1.137 +axclass comm_semiring_1_cancel \<subseteq> comm_semiring_1, cancel_ab_semigroup_add (* previously semiring *)
   1.138  
   1.139 -axclass ring \<subseteq> almost_semiring, abelian_group
   1.140 +axclass ring \<subseteq> semiring, ab_group_add
   1.141  
   1.142 -text{*Proving axiom @{text add_left_imp_eq} makes all @{text semiring}
   1.143 -      theorems available to members of @{term ring} *}
   1.144 -instance ring \<subseteq> semiring
   1.145 -proof
   1.146 -  fix a b c :: 'a
   1.147 -  assume "a + b = a + c"
   1.148 -  hence  "-a + a + b = -a + a + c" by (simp only: add_assoc)
   1.149 -  thus "b = c" by simp
   1.150 -qed
   1.151 +instance ring \<subseteq> semiring_0 ..
   1.152  
   1.153 -text{*This class underlies @{text ordered_semiring} and @{text ordered_ring}*}
   1.154 -axclass almost_ordered_semiring \<subseteq> semiring, linorder
   1.155 -  add_left_mono: "a \<le> b ==> c + a \<le> c + b"
   1.156 -  mult_strict_left_mono: "a < b ==> 0 < c ==> c * a < c * b"
   1.157 +axclass comm_ring \<subseteq> comm_semiring_0, ab_group_add
   1.158  
   1.159 -axclass ordered_semiring \<subseteq> almost_ordered_semiring
   1.160 -  zero_less_one [simp]: "0 < 1" --{*This too is needed for semirings only.*}
   1.161 +instance comm_ring \<subseteq> ring ..
   1.162  
   1.163 -axclass ordered_ring \<subseteq> almost_ordered_semiring, ring
   1.164 -  abs_if: "\<bar>a\<bar> = (if a < 0 then -a else a)"
   1.165 +instance comm_ring \<subseteq> comm_semiring_0 ..
   1.166  
   1.167 -axclass field \<subseteq> ring, inverse
   1.168 +axclass ring_1 \<subseteq> ring, semiring_1
   1.169 +
   1.170 +axclass comm_ring_1 \<subseteq> comm_ring, comm_semiring_1 (* previously ring *)
   1.171 +
   1.172 +instance comm_ring_1 \<subseteq> ring_1 ..
   1.173 +
   1.174 +instance comm_ring_1 \<subseteq> comm_semiring_1_cancel ..
   1.175 +
   1.176 +axclass idom \<subseteq> comm_ring_1, axclass_no_zero_divisors
   1.177 +
   1.178 +axclass field \<subseteq> comm_ring_1, inverse
   1.179    left_inverse [simp]: "a \<noteq> 0 ==> inverse a * a = 1"
   1.180    divide_inverse:      "a / b = a * inverse b"
   1.181  
   1.182 -axclass ordered_field \<subseteq> ordered_ring, field
   1.183 +lemma mult_zero_left [simp]: "0 * a = (0::'a::{semiring_0, cancel_semigroup_add})"
   1.184 +proof -
   1.185 +  have "0*a + 0*a = 0*a + 0"
   1.186 +    by (simp add: left_distrib [symmetric])
   1.187 +  thus ?thesis 
   1.188 +    by (simp only: add_left_cancel)
   1.189 +qed
   1.190  
   1.191 +lemma mult_zero_right [simp]: "a * 0 = (0::'a::{semiring_0, cancel_semigroup_add})"
   1.192 +proof -
   1.193 +  have "a*0 + a*0 = a*0 + 0"
   1.194 +    by (simp add: right_distrib [symmetric])
   1.195 +  thus ?thesis 
   1.196 +    by (simp only: add_left_cancel)
   1.197 +qed
   1.198 +
   1.199 +lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)"
   1.200 +proof cases
   1.201 +  assume "a=0" thus ?thesis by simp
   1.202 +next
   1.203 +  assume anz [simp]: "a\<noteq>0"
   1.204 +  { assume "a * b = 0"
   1.205 +    hence "inverse a * (a * b) = 0" by simp
   1.206 +    hence "b = 0"  by (simp (no_asm_use) add: mult_assoc [symmetric])}
   1.207 +  thus ?thesis by force
   1.208 +qed
   1.209 +
   1.210 +instance field \<subseteq> idom
   1.211 +by (intro_classes, simp)
   1.212 +  
   1.213  axclass division_by_zero \<subseteq> zero, inverse
   1.214    inverse_zero [simp]: "inverse 0 = 0"
   1.215  
   1.216 -
   1.217 -subsection {* Derived Rules for Addition *}
   1.218 -
   1.219 -lemma add_0_right [simp]: "a + 0 = (a::'a::plus_ac0)"
   1.220 -proof -
   1.221 -  have "a + 0 = 0 + a" by (rule plus_ac0.commute)
   1.222 -  also have "... = a" by simp
   1.223 -  finally show ?thesis .
   1.224 -qed
   1.225 -
   1.226 -lemma add_left_commute: "a + (b + c) = b + (a + (c::'a::plus_ac0))"
   1.227 -  by (rule mk_left_commute [of "op +", OF plus_ac0.assoc plus_ac0.commute])
   1.228 -
   1.229 -theorems add_ac = add_assoc add_commute add_left_commute
   1.230 -
   1.231 -lemma right_minus [simp]: "a + -(a::'a::abelian_group) = 0"
   1.232 -proof -
   1.233 -  have "a + -a = -a + a" by (simp add: add_ac)
   1.234 -  also have "... = 0" by simp
   1.235 -  finally show ?thesis .
   1.236 -qed
   1.237 -
   1.238 -lemma right_minus_eq: "(a - b = 0) = (a = (b::'a::abelian_group))"
   1.239 -proof
   1.240 -  have "a = a - b + b" by (simp add: diff_minus add_ac)
   1.241 -  also assume "a - b = 0"
   1.242 -  finally show "a = b" by simp
   1.243 -next
   1.244 -  assume "a = b"
   1.245 -  thus "a - b = 0" by (simp add: diff_minus)
   1.246 -qed
   1.247 -
   1.248 -lemma add_left_cancel [simp]:
   1.249 -     "(a + b = a + c) = (b = (c::'a::semiring))"
   1.250 -by (blast dest: add_left_imp_eq) 
   1.251 -
   1.252 -lemma add_right_cancel [simp]:
   1.253 -     "(b + a = c + a) = (b = (c::'a::semiring))"
   1.254 -  by (simp add: add_commute)
   1.255 -
   1.256 -lemma minus_minus [simp]: "- (- (a::'a::abelian_group)) = a" 
   1.257 -apply (rule right_minus_eq [THEN iffD1]) 
   1.258 -apply (simp add: diff_minus) 
   1.259 -done
   1.260 -
   1.261 -lemma equals_zero_I: "a+b = 0 ==> -a = (b::'a::abelian_group)"
   1.262 -apply (rule right_minus_eq [THEN iffD1, symmetric])
   1.263 -apply (simp add: diff_minus add_commute) 
   1.264 -done
   1.265 -
   1.266 -lemma minus_zero [simp]: "- 0 = (0::'a::abelian_group)"
   1.267 -by (simp add: equals_zero_I)
   1.268 -
   1.269 -lemma diff_self [simp]: "a - (a::'a::abelian_group) = 0"
   1.270 -  by (simp add: diff_minus)
   1.271 -
   1.272 -lemma diff_0 [simp]: "(0::'a::abelian_group) - a = -a"
   1.273 -by (simp add: diff_minus)
   1.274 -
   1.275 -lemma diff_0_right [simp]: "a - (0::'a::abelian_group) = a" 
   1.276 -by (simp add: diff_minus)
   1.277 -
   1.278 -lemma diff_minus_eq_add [simp]: "a - - b = a + (b::'a::abelian_group)"
   1.279 -by (simp add: diff_minus)
   1.280 -
   1.281 -lemma neg_equal_iff_equal [simp]: "(-a = -b) = (a = (b::'a::abelian_group))" 
   1.282 -proof 
   1.283 -  assume "- a = - b"
   1.284 -  hence "- (- a) = - (- b)"
   1.285 -    by simp
   1.286 -  thus "a=b" by simp
   1.287 -next
   1.288 -  assume "a=b"
   1.289 -  thus "-a = -b" by simp
   1.290 -qed
   1.291 -
   1.292 -lemma neg_equal_0_iff_equal [simp]: "(-a = 0) = (a = (0::'a::abelian_group))"
   1.293 -by (subst neg_equal_iff_equal [symmetric], simp)
   1.294 -
   1.295 -lemma neg_0_equal_iff_equal [simp]: "(0 = -a) = (0 = (a::'a::abelian_group))"
   1.296 -by (subst neg_equal_iff_equal [symmetric], simp)
   1.297 -
   1.298 -lemma add_minus_self [simp]: "a + b - b = (a::'a::abelian_group)"; 
   1.299 -  by (simp add: diff_minus add_assoc)
   1.300 -
   1.301 -lemma add_minus_self_left [simp]:  "a + (b - a)  = (b::'a::abelian_group)";
   1.302 -by (simp add: diff_minus add_left_commute [of a]) 
   1.303 -
   1.304 -lemma add_minus_self_right  [simp]:  "a + b - a  = (b::'a::abelian_group)";
   1.305 -by (simp add: diff_minus add_left_commute [of a] add_assoc) 
   1.306 -
   1.307 -lemma minus_add_self [simp]: "a - b + b = (a::'a::abelian_group)"; 
   1.308 -by (simp add: diff_minus add_assoc) 
   1.309 -
   1.310 -text{*The next two equations can make the simplifier loop!*}
   1.311 -
   1.312 -lemma equation_minus_iff: "(a = - b) = (b = - (a::'a::abelian_group))"
   1.313 -proof -
   1.314 -  have "(- (-a) = - b) = (- a = b)" by (rule neg_equal_iff_equal)
   1.315 -  thus ?thesis by (simp add: eq_commute)
   1.316 -qed
   1.317 -
   1.318 -lemma minus_equation_iff: "(- a = b) = (- (b::'a::abelian_group) = a)"
   1.319 -proof -
   1.320 -  have "(- a = - (-b)) = (a = -b)" by (rule neg_equal_iff_equal)
   1.321 -  thus ?thesis by (simp add: eq_commute)
   1.322 -qed
   1.323 -
   1.324 -
   1.325 -subsection {* Derived rules for multiplication *}
   1.326 -
   1.327 -lemma mult_1_right [simp]: "a * (1::'a::almost_semiring) = a"
   1.328 -proof -
   1.329 -  have "a * 1 = 1 * a" by (simp add: mult_commute)
   1.330 -  also have "... = a" by simp
   1.331 -  finally show ?thesis .
   1.332 -qed
   1.333 -
   1.334 -lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::almost_semiring))"
   1.335 -  by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute])
   1.336 -
   1.337 -theorems mult_ac = mult_assoc mult_commute mult_left_commute
   1.338 -
   1.339 -lemma mult_zero_left [simp]: "0 * a = (0::'a::semiring)"
   1.340 -proof -
   1.341 -  have "0*a + 0*a = 0*a + 0"
   1.342 -    by (simp add: left_distrib [symmetric])
   1.343 -  thus ?thesis by (simp only: add_left_cancel)
   1.344 -qed
   1.345 -
   1.346 -lemma mult_zero_right [simp]: "a * 0 = (0::'a::semiring)"
   1.347 -  by (simp add: mult_commute)
   1.348 -
   1.349 -
   1.350  subsection {* Distribution rules *}
   1.351  
   1.352 -lemma right_distrib: "a * (b + c) = a * b + a * (c::'a::almost_semiring)"
   1.353 -proof -
   1.354 -  have "a * (b + c) = (b + c) * a" by (simp add: mult_ac)
   1.355 -  also have "... = b * a + c * a" by (simp only: left_distrib)
   1.356 -  also have "... = a * b + a * c" by (simp add: mult_ac)
   1.357 -  finally show ?thesis .
   1.358 -qed
   1.359 -
   1.360  theorems ring_distrib = right_distrib left_distrib
   1.361  
   1.362  text{*For the @{text combine_numerals} simproc*}
   1.363  lemma combine_common_factor:
   1.364 -     "a*e + (b*e + c) = (a+b)*e + (c::'a::almost_semiring)"
   1.365 +     "a*e + (b*e + c) = (a+b)*e + (c::'a::semiring)"
   1.366  by (simp add: left_distrib add_ac)
   1.367  
   1.368 -lemma minus_add_distrib [simp]: "- (a + b) = -a + -(b::'a::abelian_group)"
   1.369 -apply (rule equals_zero_I)
   1.370 -apply (simp add: plus_ac0) 
   1.371 -done
   1.372 -
   1.373  lemma minus_mult_left: "- (a * b) = (-a) * (b::'a::ring)"
   1.374  apply (rule equals_zero_I)
   1.375  apply (simp add: left_distrib [symmetric]) 
   1.376 @@ -303,237 +149,86 @@
   1.377                minus_mult_left [symmetric] minus_mult_right [symmetric]) 
   1.378  
   1.379  lemma left_diff_distrib: "(a - b) * c = a * c - b * (c::'a::ring)"
   1.380 -by (simp add: mult_commute [of _ c] right_diff_distrib) 
   1.381 +by (simp add: left_distrib diff_minus 
   1.382 +              minus_mult_left [symmetric] minus_mult_right [symmetric]) 
   1.383  
   1.384 -lemma minus_diff_eq [simp]: "- (a - b) = b - (a::'a::ring)"
   1.385 -by (simp add: diff_minus add_commute) 
   1.386 +axclass pordered_semiring \<subseteq> semiring_0, pordered_ab_semigroup_add 
   1.387 +  mult_left_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b"
   1.388 +  mult_right_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> a * c <= b * c"
   1.389  
   1.390 +axclass pordered_cancel_semiring \<subseteq> pordered_semiring, cancel_ab_semigroup_add
   1.391  
   1.392 -subsection {* Ordering Rules for Addition *}
   1.393 +axclass ordered_semiring_strict \<subseteq> semiring_0, ordered_cancel_ab_semigroup_add
   1.394 +  mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"
   1.395 +  mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c"
   1.396  
   1.397 -lemma add_right_mono: "a \<le> (b::'a::almost_ordered_semiring) ==> a + c \<le> b + c"
   1.398 -by (simp add: add_commute [of _ c] add_left_mono)
   1.399 -
   1.400 -text {* non-strict, in both arguments *}
   1.401 -lemma add_mono:
   1.402 -     "[|a \<le> b;  c \<le> d|] ==> a + c \<le> b + (d::'a::almost_ordered_semiring)"
   1.403 -  apply (erule add_right_mono [THEN order_trans])
   1.404 -  apply (simp add: add_commute add_left_mono)
   1.405 -  done
   1.406 -
   1.407 -lemma add_strict_left_mono:
   1.408 -     "a < b ==> c + a < c + (b::'a::almost_ordered_semiring)"
   1.409 - by (simp add: order_less_le add_left_mono) 
   1.410 -
   1.411 -lemma add_strict_right_mono:
   1.412 -     "a < b ==> a + c < b + (c::'a::almost_ordered_semiring)"
   1.413 - by (simp add: add_commute [of _ c] add_strict_left_mono)
   1.414 -
   1.415 -text{*Strict monotonicity in both arguments*}
   1.416 -lemma add_strict_mono: "[|a<b; c<d|] ==> a + c < b + (d::'a::almost_ordered_semiring)"
   1.417 -apply (erule add_strict_right_mono [THEN order_less_trans])
   1.418 -apply (erule add_strict_left_mono)
   1.419 +instance ordered_semiring_strict \<subseteq> pordered_cancel_semiring
   1.420 +apply intro_classes
   1.421 +apply (case_tac "a < b & 0 < c")
   1.422 +apply (auto simp add: mult_strict_left_mono order_less_le)
   1.423 +apply (auto simp add: mult_strict_left_mono order_le_less)
   1.424 +apply (simp add: mult_strict_right_mono)
   1.425  done
   1.426  
   1.427 -lemma add_less_le_mono:
   1.428 -     "[| a<b; c\<le>d |] ==> a + c < b + (d::'a::almost_ordered_semiring)"
   1.429 -apply (erule add_strict_right_mono [THEN order_less_le_trans])
   1.430 -apply (erule add_left_mono) 
   1.431 +axclass pordered_comm_semiring \<subseteq> comm_semiring_0, pordered_ab_semigroup_add
   1.432 +  mult_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b"
   1.433 +
   1.434 +axclass pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring, cancel_ab_semigroup_add
   1.435 +
   1.436 +instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring ..
   1.437 +
   1.438 +axclass ordered_comm_semiring_strict \<subseteq> comm_semiring_0, ordered_cancel_ab_semigroup_add
   1.439 +  mult_strict_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"
   1.440 +
   1.441 +instance pordered_comm_semiring \<subseteq> pordered_semiring
   1.442 +by (intro_classes, insert mult_mono, simp_all add: mult_commute, blast+)
   1.443 +
   1.444 +instance pordered_cancel_comm_semiring \<subseteq> pordered_cancel_semiring ..
   1.445 +
   1.446 +instance ordered_comm_semiring_strict \<subseteq> ordered_semiring_strict
   1.447 +by (intro_classes, insert mult_strict_mono, simp_all add: mult_commute, blast+)
   1.448 +
   1.449 +instance ordered_comm_semiring_strict \<subseteq> pordered_cancel_comm_semiring
   1.450 +apply (intro_classes)
   1.451 +apply (case_tac "a < b & 0 < c")
   1.452 +apply (auto simp add: mult_strict_left_mono order_less_le)
   1.453 +apply (auto simp add: mult_strict_left_mono order_le_less)
   1.454  done
   1.455  
   1.456 -lemma add_le_less_mono:
   1.457 -     "[| a\<le>b; c<d |] ==> a + c < b + (d::'a::almost_ordered_semiring)"
   1.458 -apply (erule add_right_mono [THEN order_le_less_trans])
   1.459 -apply (erule add_strict_left_mono) 
   1.460 -done
   1.461 +axclass pordered_ring \<subseteq> ring, pordered_semiring 
   1.462  
   1.463 -lemma add_less_imp_less_left:
   1.464 -      assumes less: "c + a < c + b"  shows "a < (b::'a::almost_ordered_semiring)"
   1.465 -proof (rule ccontr)
   1.466 -  assume "~ a < b"
   1.467 -  hence "b \<le> a" by (simp add: linorder_not_less)
   1.468 -  hence "c+b \<le> c+a" by (rule add_left_mono)
   1.469 -  with this and less show False 
   1.470 -    by (simp add: linorder_not_less [symmetric])
   1.471 -qed
   1.472 +instance pordered_ring \<subseteq> pordered_ab_group_add ..
   1.473  
   1.474 -lemma add_less_imp_less_right:
   1.475 -      "a + c < b + c ==> a < (b::'a::almost_ordered_semiring)"
   1.476 -apply (rule add_less_imp_less_left [of c])
   1.477 -apply (simp add: add_commute)  
   1.478 -done
   1.479 +instance pordered_ring \<subseteq> pordered_cancel_semiring ..
   1.480  
   1.481 -lemma add_less_cancel_left [simp]:
   1.482 -    "(c+a < c+b) = (a < (b::'a::almost_ordered_semiring))"
   1.483 -by (blast intro: add_less_imp_less_left add_strict_left_mono) 
   1.484 +axclass lordered_ring \<subseteq> pordered_ring, lordered_ab_group_abs
   1.485  
   1.486 -lemma add_less_cancel_right [simp]:
   1.487 -    "(a+c < b+c) = (a < (b::'a::almost_ordered_semiring))"
   1.488 -by (blast intro: add_less_imp_less_right add_strict_right_mono)
   1.489 +axclass axclass_abs_if \<subseteq> minus, ord, zero
   1.490 +  abs_if: "abs a = (if (a < 0) then (-a) else a)"
   1.491  
   1.492 -lemma add_le_cancel_left [simp]:
   1.493 -    "(c+a \<le> c+b) = (a \<le> (b::'a::almost_ordered_semiring))"
   1.494 -by (simp add: linorder_not_less [symmetric]) 
   1.495 +axclass ordered_ring_strict \<subseteq> ring, ordered_semiring_strict, axclass_abs_if
   1.496  
   1.497 -lemma add_le_cancel_right [simp]:
   1.498 -    "(a+c \<le> b+c) = (a \<le> (b::'a::almost_ordered_semiring))"
   1.499 -by (simp add: linorder_not_less [symmetric]) 
   1.500 +instance ordered_ring_strict \<subseteq> lordered_ab_group ..
   1.501  
   1.502 -lemma add_le_imp_le_left:
   1.503 -      "c + a \<le> c + b ==> a \<le> (b::'a::almost_ordered_semiring)"
   1.504 -by simp
   1.505 +instance ordered_ring_strict \<subseteq> lordered_ring
   1.506 +by (intro_classes, simp add: abs_if join_eq_if)
   1.507  
   1.508 -lemma add_le_imp_le_right:
   1.509 -      "a + c \<le> b + c ==> a \<le> (b::'a::almost_ordered_semiring)"
   1.510 -by simp
   1.511 +axclass pordered_comm_ring \<subseteq> comm_ring, pordered_comm_semiring
   1.512  
   1.513 -lemma add_increasing: "[|0\<le>a; b\<le>c|] ==> b \<le> a + (c::'a::almost_ordered_semiring)"
   1.514 -by (insert add_mono [of 0 a b c], simp)
   1.515 +axclass ordered_semidom \<subseteq> comm_semiring_1_cancel, ordered_comm_semiring_strict (* previously ordered_semiring *)
   1.516 +  zero_less_one [simp]: "0 < 1"
   1.517  
   1.518 +axclass ordered_idom \<subseteq> comm_ring_1, ordered_comm_semiring_strict, axclass_abs_if (* previously ordered_ring *)
   1.519  
   1.520 -subsection {* Ordering Rules for Unary Minus *}
   1.521 +instance ordered_idom \<subseteq> ordered_ring_strict ..
   1.522  
   1.523 -lemma le_imp_neg_le:
   1.524 -      assumes "a \<le> (b::'a::ordered_ring)" shows "-b \<le> -a"
   1.525 -proof -
   1.526 -  have "-a+a \<le> -a+b"
   1.527 -    by (rule add_left_mono) 
   1.528 -  hence "0 \<le> -a+b"
   1.529 -    by simp
   1.530 -  hence "0 + (-b) \<le> (-a + b) + (-b)"
   1.531 -    by (rule add_right_mono) 
   1.532 -  thus ?thesis
   1.533 -    by (simp add: add_assoc)
   1.534 -qed
   1.535 -
   1.536 -lemma neg_le_iff_le [simp]: "(-b \<le> -a) = (a \<le> (b::'a::ordered_ring))"
   1.537 -proof 
   1.538 -  assume "- b \<le> - a"
   1.539 -  hence "- (- a) \<le> - (- b)"
   1.540 -    by (rule le_imp_neg_le)
   1.541 -  thus "a\<le>b" by simp
   1.542 -next
   1.543 -  assume "a\<le>b"
   1.544 -  thus "-b \<le> -a" by (rule le_imp_neg_le)
   1.545 -qed
   1.546 -
   1.547 -lemma neg_le_0_iff_le [simp]: "(-a \<le> 0) = (0 \<le> (a::'a::ordered_ring))"
   1.548 -by (subst neg_le_iff_le [symmetric], simp)
   1.549 -
   1.550 -lemma neg_0_le_iff_le [simp]: "(0 \<le> -a) = (a \<le> (0::'a::ordered_ring))"
   1.551 -by (subst neg_le_iff_le [symmetric], simp)
   1.552 -
   1.553 -lemma neg_less_iff_less [simp]: "(-b < -a) = (a < (b::'a::ordered_ring))"
   1.554 -by (force simp add: order_less_le) 
   1.555 -
   1.556 -lemma neg_less_0_iff_less [simp]: "(-a < 0) = (0 < (a::'a::ordered_ring))"
   1.557 -by (subst neg_less_iff_less [symmetric], simp)
   1.558 -
   1.559 -lemma neg_0_less_iff_less [simp]: "(0 < -a) = (a < (0::'a::ordered_ring))"
   1.560 -by (subst neg_less_iff_less [symmetric], simp)
   1.561 -
   1.562 -text{*The next several equations can make the simplifier loop!*}
   1.563 -
   1.564 -lemma less_minus_iff: "(a < - b) = (b < - (a::'a::ordered_ring))"
   1.565 -proof -
   1.566 -  have "(- (-a) < - b) = (b < - a)" by (rule neg_less_iff_less)
   1.567 -  thus ?thesis by simp
   1.568 -qed
   1.569 -
   1.570 -lemma minus_less_iff: "(- a < b) = (- b < (a::'a::ordered_ring))"
   1.571 -proof -
   1.572 -  have "(- a < - (-b)) = (- b < a)" by (rule neg_less_iff_less)
   1.573 -  thus ?thesis by simp
   1.574 -qed
   1.575 -
   1.576 -lemma le_minus_iff: "(a \<le> - b) = (b \<le> - (a::'a::ordered_ring))"
   1.577 -apply (simp add: linorder_not_less [symmetric])
   1.578 -apply (rule minus_less_iff) 
   1.579 -done
   1.580 -
   1.581 -lemma minus_le_iff: "(- a \<le> b) = (- b \<le> (a::'a::ordered_ring))"
   1.582 -apply (simp add: linorder_not_less [symmetric])
   1.583 -apply (rule less_minus_iff) 
   1.584 -done
   1.585 -
   1.586 -
   1.587 -subsection{*Subtraction Laws*}
   1.588 -
   1.589 -lemma add_diff_eq: "a + (b - c) = (a + b) - (c::'a::abelian_group)"
   1.590 -by (simp add: diff_minus plus_ac0)
   1.591 -
   1.592 -lemma diff_add_eq: "(a - b) + c = (a + c) - (b::'a::abelian_group)"
   1.593 -by (simp add: diff_minus plus_ac0)
   1.594 -
   1.595 -lemma diff_eq_eq: "(a-b = c) = (a = c + (b::'a::abelian_group))"
   1.596 -by (auto simp add: diff_minus add_assoc)
   1.597 -
   1.598 -lemma eq_diff_eq: "(a = c-b) = (a + (b::'a::abelian_group) = c)"
   1.599 -by (auto simp add: diff_minus add_assoc)
   1.600 -
   1.601 -lemma diff_diff_eq: "(a - b) - c = a - (b + (c::'a::abelian_group))"
   1.602 -by (simp add: diff_minus plus_ac0)
   1.603 -
   1.604 -lemma diff_diff_eq2: "a - (b - c) = (a + c) - (b::'a::abelian_group)"
   1.605 -by (simp add: diff_minus plus_ac0)
   1.606 -
   1.607 -text{*Further subtraction laws for ordered rings*}
   1.608 -
   1.609 -lemma less_iff_diff_less_0: "(a < b) = (a - b < (0::'a::ordered_ring))"
   1.610 -proof -
   1.611 -  have  "(a < b) = (a + (- b) < b + (-b))"  
   1.612 -    by (simp only: add_less_cancel_right)
   1.613 -  also have "... =  (a - b < 0)" by (simp add: diff_minus)
   1.614 -  finally show ?thesis .
   1.615 -qed
   1.616 -
   1.617 -lemma diff_less_eq: "(a-b < c) = (a < c + (b::'a::ordered_ring))"
   1.618 -apply (subst less_iff_diff_less_0)
   1.619 -apply (rule less_iff_diff_less_0 [of _ c, THEN ssubst])
   1.620 -apply (simp add: diff_minus add_ac)
   1.621 -done
   1.622 -
   1.623 -lemma less_diff_eq: "(a < c-b) = (a + (b::'a::ordered_ring) < c)"
   1.624 -apply (subst less_iff_diff_less_0)
   1.625 -apply (rule less_iff_diff_less_0 [of _ "c-b", THEN ssubst])
   1.626 -apply (simp add: diff_minus add_ac)
   1.627 -done
   1.628 -
   1.629 -lemma diff_le_eq: "(a-b \<le> c) = (a \<le> c + (b::'a::ordered_ring))"
   1.630 -by (simp add: linorder_not_less [symmetric] less_diff_eq)
   1.631 -
   1.632 -lemma le_diff_eq: "(a \<le> c-b) = (a + (b::'a::ordered_ring) \<le> c)"
   1.633 -by (simp add: linorder_not_less [symmetric] diff_less_eq)
   1.634 -
   1.635 -text{*This list of rewrites simplifies (in)equalities by bringing subtractions
   1.636 -  to the top and then moving negative terms to the other side.
   1.637 -  Use with @{text add_ac}*}
   1.638 -lemmas compare_rls =
   1.639 -       diff_minus [symmetric]
   1.640 -       add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
   1.641 -       diff_less_eq less_diff_eq diff_le_eq le_diff_eq
   1.642 -       diff_eq_eq eq_diff_eq
   1.643 -
   1.644 -text{*This list of rewrites decides ring equalities by ordered rewriting.*}
   1.645 -lemmas ring_eq_simps =
   1.646 -  times_ac1.assoc times_ac1.commute times_ac1_left_commute
   1.647 -  left_distrib right_distrib left_diff_distrib right_diff_distrib
   1.648 -  plus_ac0.assoc plus_ac0.commute plus_ac0_left_commute
   1.649 -  add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
   1.650 -  diff_eq_eq eq_diff_eq
   1.651 -
   1.652 -subsection{*Lemmas for the @{text cancel_numerals} simproc*}
   1.653 -
   1.654 -lemma eq_iff_diff_eq_0: "(a = b) = (a-b = (0::'a::abelian_group))"
   1.655 -by (simp add: compare_rls)
   1.656 -
   1.657 -lemma le_iff_diff_le_0: "(a \<le> b) = (a-b \<le> (0::'a::ordered_ring))"
   1.658 -by (simp add: compare_rls)
   1.659 +axclass ordered_field \<subseteq> field, ordered_idom
   1.660  
   1.661  lemma eq_add_iff1:
   1.662       "(a*e + c = b*e + d) = ((a-b)*e + c = (d::'a::ring))"
   1.663 +apply (simp add: diff_minus left_distrib)
   1.664  apply (simp add: diff_minus left_distrib add_ac)
   1.665 -apply (simp add: compare_rls minus_mult_left [symmetric]) 
   1.666 +apply (simp add: compare_rls minus_mult_left [symmetric])
   1.667  done
   1.668  
   1.669  lemma eq_add_iff2:
   1.670 @@ -543,167 +238,199 @@
   1.671  done
   1.672  
   1.673  lemma less_add_iff1:
   1.674 -     "(a*e + c < b*e + d) = ((a-b)*e + c < (d::'a::ordered_ring))"
   1.675 +     "(a*e + c < b*e + d) = ((a-b)*e + c < (d::'a::pordered_ring))"
   1.676  apply (simp add: diff_minus left_distrib add_ac)
   1.677  apply (simp add: compare_rls minus_mult_left [symmetric]) 
   1.678  done
   1.679  
   1.680  lemma less_add_iff2:
   1.681 -     "(a*e + c < b*e + d) = (c < (b-a)*e + (d::'a::ordered_ring))"
   1.682 +     "(a*e + c < b*e + d) = (c < (b-a)*e + (d::'a::pordered_ring))"
   1.683  apply (simp add: diff_minus left_distrib add_ac)
   1.684  apply (simp add: compare_rls minus_mult_left [symmetric]) 
   1.685  done
   1.686  
   1.687  lemma le_add_iff1:
   1.688 -     "(a*e + c \<le> b*e + d) = ((a-b)*e + c \<le> (d::'a::ordered_ring))"
   1.689 +     "(a*e + c \<le> b*e + d) = ((a-b)*e + c \<le> (d::'a::pordered_ring))"
   1.690  apply (simp add: diff_minus left_distrib add_ac)
   1.691  apply (simp add: compare_rls minus_mult_left [symmetric]) 
   1.692  done
   1.693  
   1.694  lemma le_add_iff2:
   1.695 -     "(a*e + c \<le> b*e + d) = (c \<le> (b-a)*e + (d::'a::ordered_ring))"
   1.696 +     "(a*e + c \<le> b*e + d) = (c \<le> (b-a)*e + (d::'a::pordered_ring))"
   1.697  apply (simp add: diff_minus left_distrib add_ac)
   1.698  apply (simp add: compare_rls minus_mult_left [symmetric]) 
   1.699  done
   1.700  
   1.701 -
   1.702  subsection {* Ordering Rules for Multiplication *}
   1.703  
   1.704 -lemma mult_strict_right_mono:
   1.705 -     "[|a < b; 0 < c|] ==> a * c < b * (c::'a::almost_ordered_semiring)"
   1.706 -by (simp add: mult_commute [of _ c] mult_strict_left_mono)
   1.707 -
   1.708 -lemma mult_left_mono:
   1.709 -     "[|a \<le> b; 0 \<le> c|] ==> c * a \<le> c * (b::'a::almost_ordered_semiring)"
   1.710 -  apply (case_tac "c=0", simp)
   1.711 -  apply (force simp add: mult_strict_left_mono order_le_less) 
   1.712 -  done
   1.713 -
   1.714 -lemma mult_right_mono:
   1.715 -     "[|a \<le> b; 0 \<le> c|] ==> a*c \<le> b * (c::'a::almost_ordered_semiring)"
   1.716 -  by (simp add: mult_left_mono mult_commute [of _ c]) 
   1.717 -
   1.718  lemma mult_left_le_imp_le:
   1.719 -     "[|c*a \<le> c*b; 0 < c|] ==> a \<le> (b::'a::almost_ordered_semiring)"
   1.720 +     "[|c*a \<le> c*b; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)"
   1.721    by (force simp add: mult_strict_left_mono linorder_not_less [symmetric])
   1.722   
   1.723  lemma mult_right_le_imp_le:
   1.724 -     "[|a*c \<le> b*c; 0 < c|] ==> a \<le> (b::'a::almost_ordered_semiring)"
   1.725 +     "[|a*c \<le> b*c; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)"
   1.726    by (force simp add: mult_strict_right_mono linorder_not_less [symmetric])
   1.727  
   1.728  lemma mult_left_less_imp_less:
   1.729 -     "[|c*a < c*b; 0 \<le> c|] ==> a < (b::'a::almost_ordered_semiring)"
   1.730 +     "[|c*a < c*b; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)"
   1.731    by (force simp add: mult_left_mono linorder_not_le [symmetric])
   1.732   
   1.733  lemma mult_right_less_imp_less:
   1.734 -     "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::almost_ordered_semiring)"
   1.735 +     "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)"
   1.736    by (force simp add: mult_right_mono linorder_not_le [symmetric])
   1.737  
   1.738  lemma mult_strict_left_mono_neg:
   1.739 -     "[|b < a; c < 0|] ==> c * a < c * (b::'a::ordered_ring)"
   1.740 +     "[|b < a; c < 0|] ==> c * a < c * (b::'a::ordered_ring_strict)"
   1.741  apply (drule mult_strict_left_mono [of _ _ "-c"])
   1.742  apply (simp_all add: minus_mult_left [symmetric]) 
   1.743  done
   1.744  
   1.745 +lemma mult_left_mono_neg:
   1.746 +     "[|b \<le> a; c \<le> 0|] ==> c * a \<le>  c * (b::'a::pordered_ring)"
   1.747 +apply (drule mult_left_mono [of _ _ "-c"])
   1.748 +apply (simp_all add: minus_mult_left [symmetric]) 
   1.749 +done
   1.750 +
   1.751  lemma mult_strict_right_mono_neg:
   1.752 -     "[|b < a; c < 0|] ==> a * c < b * (c::'a::ordered_ring)"
   1.753 +     "[|b < a; c < 0|] ==> a * c < b * (c::'a::ordered_ring_strict)"
   1.754  apply (drule mult_strict_right_mono [of _ _ "-c"])
   1.755  apply (simp_all add: minus_mult_right [symmetric]) 
   1.756  done
   1.757  
   1.758 +lemma mult_right_mono_neg:
   1.759 +     "[|b \<le> a; c \<le> 0|] ==> a * c \<le>  (b::'a::pordered_ring) * c"
   1.760 +apply (drule mult_right_mono [of _ _ "-c"])
   1.761 +apply (simp)
   1.762 +apply (simp_all add: minus_mult_right [symmetric]) 
   1.763 +done
   1.764  
   1.765  subsection{* Products of Signs *}
   1.766  
   1.767 -lemma mult_pos: "[| (0::'a::almost_ordered_semiring) < a; 0 < b |] ==> 0 < a*b"
   1.768 +lemma mult_pos: "[| (0::'a::ordered_semiring_strict) < a; 0 < b |] ==> 0 < a*b"
   1.769  by (drule mult_strict_left_mono [of 0 b], auto)
   1.770  
   1.771 -lemma mult_pos_neg: "[| (0::'a::almost_ordered_semiring) < a; b < 0 |] ==> a*b < 0"
   1.772 +lemma mult_pos_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; 0 \<le> b |] ==> 0 \<le> a*b"
   1.773 +by (drule mult_left_mono [of 0 b], auto)
   1.774 +
   1.775 +lemma mult_pos_neg: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> a*b < 0"
   1.776  by (drule mult_strict_left_mono [of b 0], auto)
   1.777  
   1.778 -lemma mult_neg: "[| a < (0::'a::ordered_ring); b < 0 |] ==> 0 < a*b"
   1.779 +lemma mult_pos_neg_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> a*b \<le> 0"
   1.780 +by (drule mult_left_mono [of b 0], auto)
   1.781 +
   1.782 +lemma mult_pos_neg2: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> b*a < 0" 
   1.783 +by (drule mult_strict_right_mono[of b 0], auto)
   1.784 +
   1.785 +lemma mult_pos_neg2_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> b*a \<le> 0" 
   1.786 +by (drule mult_right_mono[of b 0], auto)
   1.787 +
   1.788 +lemma mult_neg: "[| a < (0::'a::ordered_ring_strict); b < 0 |] ==> 0 < a*b"
   1.789  by (drule mult_strict_right_mono_neg, auto)
   1.790  
   1.791 +lemma mult_neg_le: "[| a \<le> (0::'a::pordered_ring); b \<le> 0 |] ==> 0 \<le> a*b"
   1.792 +by (drule mult_right_mono_neg[of a 0 b ], auto)
   1.793 +
   1.794  lemma zero_less_mult_pos:
   1.795 -     "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::almost_ordered_semiring)"
   1.796 +     "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)"
   1.797  apply (case_tac "b\<le>0") 
   1.798   apply (auto simp add: order_le_less linorder_not_less)
   1.799  apply (drule_tac mult_pos_neg [of a b]) 
   1.800   apply (auto dest: order_less_not_sym)
   1.801  done
   1.802  
   1.803 +lemma zero_less_mult_pos2:
   1.804 +     "[| 0 < b*a; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)"
   1.805 +apply (case_tac "b\<le>0") 
   1.806 + apply (auto simp add: order_le_less linorder_not_less)
   1.807 +apply (drule_tac mult_pos_neg2 [of a b]) 
   1.808 + apply (auto dest: order_less_not_sym)
   1.809 +done
   1.810 +
   1.811  lemma zero_less_mult_iff:
   1.812 -     "((0::'a::ordered_ring) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)"
   1.813 +     "((0::'a::ordered_ring_strict) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)"
   1.814  apply (auto simp add: order_le_less linorder_not_less mult_pos mult_neg)
   1.815  apply (blast dest: zero_less_mult_pos) 
   1.816 -apply (simp add: mult_commute [of a b]) 
   1.817 -apply (blast dest: zero_less_mult_pos) 
   1.818 +apply (blast dest: zero_less_mult_pos2)
   1.819  done
   1.820  
   1.821  text{*A field has no "zero divisors", and this theorem holds without the
   1.822        assumption of an ordering.  See @{text field_mult_eq_0_iff} below.*}
   1.823 -lemma mult_eq_0_iff [simp]: "(a*b = (0::'a::ordered_ring)) = (a = 0 | b = 0)"
   1.824 +lemma mult_eq_0_iff [simp]: "(a*b = (0::'a::ordered_ring_strict)) = (a = 0 | b = 0)"
   1.825  apply (case_tac "a < 0")
   1.826  apply (auto simp add: linorder_not_less order_le_less linorder_neq_iff)
   1.827  apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono)+
   1.828  done
   1.829  
   1.830  lemma zero_le_mult_iff:
   1.831 -     "((0::'a::ordered_ring) \<le> a*b) = (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)"
   1.832 +     "((0::'a::ordered_ring_strict) \<le> a*b) = (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)"
   1.833  by (auto simp add: eq_commute [of 0] order_le_less linorder_not_less
   1.834                     zero_less_mult_iff)
   1.835  
   1.836  lemma mult_less_0_iff:
   1.837 -     "(a*b < (0::'a::ordered_ring)) = (0 < a & b < 0 | a < 0 & 0 < b)"
   1.838 +     "(a*b < (0::'a::ordered_ring_strict)) = (0 < a & b < 0 | a < 0 & 0 < b)"
   1.839  apply (insert zero_less_mult_iff [of "-a" b]) 
   1.840  apply (force simp add: minus_mult_left[symmetric]) 
   1.841  done
   1.842  
   1.843  lemma mult_le_0_iff:
   1.844 -     "(a*b \<le> (0::'a::ordered_ring)) = (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)"
   1.845 +     "(a*b \<le> (0::'a::ordered_ring_strict)) = (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)"
   1.846  apply (insert zero_le_mult_iff [of "-a" b]) 
   1.847  apply (force simp add: minus_mult_left[symmetric]) 
   1.848  done
   1.849  
   1.850 -lemma zero_le_square: "(0::'a::ordered_ring) \<le> a*a"
   1.851 +lemma split_mult_pos_le: "(0 \<le> a & 0 \<le> b) | (a \<le> 0 & b \<le> 0) \<Longrightarrow> 0 \<le> a * (b::_::pordered_ring)"
   1.852 +by (auto simp add: mult_pos_le mult_neg_le)
   1.853 +
   1.854 +lemma split_mult_neg_le: "(0 \<le> a & b \<le> 0) | (a \<le> 0 & 0 \<le> b) \<Longrightarrow> a * b \<le> (0::_::pordered_cancel_semiring)" 
   1.855 +by (auto simp add: mult_pos_neg_le mult_pos_neg2_le)
   1.856 +
   1.857 +lemma zero_le_square: "(0::'a::ordered_ring_strict) \<le> a*a"
   1.858  by (simp add: zero_le_mult_iff linorder_linear) 
   1.859  
   1.860 -text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semiring}
   1.861 -      theorems available to members of @{term ordered_ring} *}
   1.862 -instance ordered_ring \<subseteq> ordered_semiring
   1.863 +text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semidom}
   1.864 +      theorems available to members of @{term ordered_idom} *}
   1.865 +
   1.866 +instance ordered_idom \<subseteq> ordered_semidom
   1.867  proof
   1.868    have "(0::'a) \<le> 1*1" by (rule zero_le_square)
   1.869    thus "(0::'a) < 1" by (simp add: order_le_less) 
   1.870  qed
   1.871  
   1.872 +instance ordered_ring_strict \<subseteq> axclass_no_zero_divisors 
   1.873 +by (intro_classes, simp)
   1.874 +
   1.875 +instance ordered_idom \<subseteq> idom ..
   1.876 +
   1.877  text{*All three types of comparision involving 0 and 1 are covered.*}
   1.878  
   1.879  declare zero_neq_one [THEN not_sym, simp]
   1.880  
   1.881 -lemma zero_le_one [simp]: "(0::'a::ordered_semiring) \<le> 1"
   1.882 +lemma zero_le_one [simp]: "(0::'a::ordered_semidom) \<le> 1"
   1.883    by (rule zero_less_one [THEN order_less_imp_le]) 
   1.884  
   1.885 -lemma not_one_le_zero [simp]: "~ (1::'a::ordered_semiring) \<le> 0"
   1.886 -by (simp add: linorder_not_le zero_less_one) 
   1.887 +lemma not_one_le_zero [simp]: "~ (1::'a::ordered_semidom) \<le> 0"
   1.888 +by (simp add: linorder_not_le) 
   1.889  
   1.890 -lemma not_one_less_zero [simp]: "~ (1::'a::ordered_semiring) < 0"
   1.891 -by (simp add: linorder_not_less zero_le_one) 
   1.892 -
   1.893 +lemma not_one_less_zero [simp]: "~ (1::'a::ordered_semidom) < 0"
   1.894 +by (simp add: linorder_not_less) 
   1.895  
   1.896  subsection{*More Monotonicity*}
   1.897  
   1.898  lemma mult_left_mono_neg:
   1.899 -     "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::ordered_ring)"
   1.900 +     "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::pordered_ring)"
   1.901  apply (drule mult_left_mono [of _ _ "-c"]) 
   1.902  apply (simp_all add: minus_mult_left [symmetric]) 
   1.903  done
   1.904  
   1.905  lemma mult_right_mono_neg:
   1.906 -     "[|b \<le> a; c \<le> 0|] ==> a * c \<le> b * (c::'a::ordered_ring)"
   1.907 -  by (simp add: mult_left_mono_neg mult_commute [of _ c]) 
   1.908 +     "[|b \<le> a; c \<le> 0|] ==> a * c \<le> b * (c::'a::pordered_ring)"
   1.909 +apply (drule mult_right_mono [of _ _ "-c"]) 
   1.910 +apply (simp_all add: minus_mult_right [symmetric]) 
   1.911 +done  
   1.912  
   1.913  text{*Strict monotonicity in both arguments*}
   1.914  lemma mult_strict_mono:
   1.915 -     "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring)"
   1.916 +     "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring_strict)"
   1.917  apply (case_tac "c=0")
   1.918   apply (simp add: mult_pos) 
   1.919  apply (erule mult_strict_right_mono [THEN order_less_trans])
   1.920 @@ -713,31 +440,30 @@
   1.921  
   1.922  text{*This weaker variant has more natural premises*}
   1.923  lemma mult_strict_mono':
   1.924 -     "[| a<b; c<d; 0 \<le> a; 0 \<le> c|] ==> a * c < b * (d::'a::ordered_semiring)"
   1.925 +     "[| a<b; c<d; 0 \<le> a; 0 \<le> c|] ==> a * c < b * (d::'a::ordered_semiring_strict)"
   1.926  apply (rule mult_strict_mono)
   1.927  apply (blast intro: order_le_less_trans)+
   1.928  done
   1.929  
   1.930  lemma mult_mono:
   1.931       "[|a \<le> b; c \<le> d; 0 \<le> b; 0 \<le> c|] 
   1.932 -      ==> a * c  \<le>  b * (d::'a::ordered_semiring)"
   1.933 +      ==> a * c  \<le>  b * (d::'a::pordered_semiring)"
   1.934  apply (erule mult_right_mono [THEN order_trans], assumption)
   1.935  apply (erule mult_left_mono, assumption)
   1.936  done
   1.937  
   1.938 -lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semiring)"
   1.939 +lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semidom)"
   1.940  apply (insert mult_strict_mono [of 1 m 1 n]) 
   1.941  apply (simp add:  order_less_trans [OF zero_less_one]) 
   1.942  done
   1.943  
   1.944 -
   1.945  subsection{*Cancellation Laws for Relationships With a Common Factor*}
   1.946  
   1.947  text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"},
   1.948     also with the relations @{text "\<le>"} and equality.*}
   1.949  
   1.950  lemma mult_less_cancel_right:
   1.951 -    "(a*c < b*c) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring)))"
   1.952 +    "(a*c < b*c) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring_strict)))"
   1.953  apply (case_tac "c = 0")
   1.954  apply (auto simp add: linorder_neq_iff mult_strict_right_mono 
   1.955                        mult_strict_right_mono_neg)
   1.956 @@ -750,20 +476,29 @@
   1.957  done
   1.958  
   1.959  lemma mult_less_cancel_left:
   1.960 -    "(c*a < c*b) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring)))"
   1.961 -by (simp add: mult_commute [of c] mult_less_cancel_right)
   1.962 +    "(c*a < c*b) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring_strict)))"
   1.963 +apply (case_tac "c = 0")
   1.964 +apply (auto simp add: linorder_neq_iff mult_strict_left_mono 
   1.965 +                      mult_strict_left_mono_neg)
   1.966 +apply (auto simp add: linorder_not_less 
   1.967 +                      linorder_not_le [symmetric, of "c*a"]
   1.968 +                      linorder_not_le [symmetric, of a])
   1.969 +apply (erule_tac [!] notE)
   1.970 +apply (auto simp add: order_less_imp_le mult_left_mono 
   1.971 +                      mult_left_mono_neg)
   1.972 +done
   1.973  
   1.974  lemma mult_le_cancel_right:
   1.975 -     "(a*c \<le> b*c) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring)))"
   1.976 +     "(a*c \<le> b*c) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring_strict)))"
   1.977  by (simp add: linorder_not_less [symmetric] mult_less_cancel_right)
   1.978  
   1.979  lemma mult_le_cancel_left:
   1.980 -     "(c*a \<le> c*b) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring)))"
   1.981 -by (simp add: mult_commute [of c] mult_le_cancel_right)
   1.982 +     "(c*a \<le> c*b) = ((0<c --> a\<le>b) & (c<0 --> b \<le> (a::'a::ordered_ring_strict)))"
   1.983 +by (simp add: linorder_not_less [symmetric] mult_less_cancel_left)
   1.984  
   1.985  lemma mult_less_imp_less_left:
   1.986        assumes less: "c*a < c*b" and nonneg: "0 \<le> c"
   1.987 -      shows "a < (b::'a::ordered_semiring)"
   1.988 +      shows "a < (b::'a::ordered_semiring_strict)"
   1.989  proof (rule ccontr)
   1.990    assume "~ a < b"
   1.991    hence "b \<le> a" by (simp add: linorder_not_less)
   1.992 @@ -773,12 +508,19 @@
   1.993  qed
   1.994  
   1.995  lemma mult_less_imp_less_right:
   1.996 -    "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring)"
   1.997 -  by (rule mult_less_imp_less_left, simp add: mult_commute)
   1.998 +  assumes less: "a*c < b*c" and nonneg: "0 <= c"
   1.999 +  shows "a < (b::'a::ordered_semiring_strict)"
  1.1000 +proof (rule ccontr)
  1.1001 +  assume "~ a < b"
  1.1002 +  hence "b \<le> a" by (simp add: linorder_not_less)
  1.1003 +  hence "b*c \<le> a*c" by (rule mult_right_mono)
  1.1004 +  with this and less show False 
  1.1005 +    by (simp add: linorder_not_less [symmetric])
  1.1006 +qed  
  1.1007  
  1.1008  text{*Cancellation of equalities with a common factor*}
  1.1009  lemma mult_cancel_right [simp]:
  1.1010 -     "(a*c = b*c) = (c = (0::'a::ordered_ring) | a=b)"
  1.1011 +     "(a*c = b*c) = (c = (0::'a::ordered_ring_strict) | a=b)"
  1.1012  apply (cut_tac linorder_less_linear [of 0 c])
  1.1013  apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono
  1.1014               simp add: linorder_neq_iff)
  1.1015 @@ -787,10 +529,21 @@
  1.1016  text{*These cancellation theorems require an ordering. Versions are proved
  1.1017        below that work for fields without an ordering.*}
  1.1018  lemma mult_cancel_left [simp]:
  1.1019 -     "(c*a = c*b) = (c = (0::'a::ordered_ring) | a=b)"
  1.1020 -by (simp add: mult_commute [of c] mult_cancel_right)
  1.1021 +     "(c*a = c*b) = (c = (0::'a::ordered_ring_strict) | a=b)"
  1.1022 +apply (cut_tac linorder_less_linear [of 0 c])
  1.1023 +apply (force dest: mult_strict_left_mono_neg mult_strict_left_mono
  1.1024 +             simp add: linorder_neq_iff)
  1.1025 +done
  1.1026  
  1.1027 -
  1.1028 +text{*This list of rewrites decides ring equalities by ordered rewriting.*}
  1.1029 +lemmas ring_eq_simps =
  1.1030 +  mult_ac
  1.1031 +  left_distrib right_distrib left_diff_distrib right_diff_distrib
  1.1032 +  add_ac
  1.1033 +  add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2
  1.1034 +  diff_eq_eq eq_diff_eq
  1.1035 +    
  1.1036 +thm ring_eq_simps
  1.1037  subsection {* Fields *}
  1.1038  
  1.1039  lemma right_inverse [simp]:
  1.1040 @@ -1571,14 +1324,14 @@
  1.1041  
  1.1042  subsection {* Ordered Fields are Dense *}
  1.1043  
  1.1044 -lemma less_add_one: "a < (a+1::'a::ordered_semiring)"
  1.1045 +lemma less_add_one: "a < (a+1::'a::ordered_semidom)"
  1.1046  proof -
  1.1047 -  have "a+0 < (a+1::'a::ordered_semiring)"
  1.1048 +  have "a+0 < (a+1::'a::ordered_semidom)"
  1.1049      by (blast intro: zero_less_one add_strict_left_mono) 
  1.1050    thus ?thesis by simp
  1.1051  qed
  1.1052  
  1.1053 -lemma zero_less_two: "0 < (1+1::'a::ordered_semiring)"
  1.1054 +lemma zero_less_two: "0 < (1+1::'a::ordered_semidom)"
  1.1055    by (blast intro: order_less_trans zero_less_one less_add_one) 
  1.1056  
  1.1057  lemma less_half_sum: "a < b ==> a < (a+b) / (1+1::'a::ordered_field)"
  1.1058 @@ -1590,62 +1343,102 @@
  1.1059  lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b"
  1.1060  by (blast intro!: less_half_sum gt_half_sum)
  1.1061  
  1.1062 -
  1.1063  subsection {* Absolute Value *}
  1.1064  
  1.1065 -lemma abs_zero [simp]: "abs 0 = (0::'a::ordered_ring)"
  1.1066 -by (simp add: abs_if)
  1.1067 -
  1.1068 -lemma abs_one [simp]: "abs 1 = (1::'a::ordered_ring)"
  1.1069 +lemma abs_one [simp]: "abs 1 = (1::'a::ordered_idom)"
  1.1070    by (simp add: abs_if zero_less_one [THEN order_less_not_sym]) 
  1.1071  
  1.1072 -lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_ring)" 
  1.1073 -apply (case_tac "a=0 | b=0", force) 
  1.1074 -apply (auto elim: order_less_asym
  1.1075 -            simp add: abs_if mult_less_0_iff linorder_neq_iff
  1.1076 -                  minus_mult_left [symmetric] minus_mult_right [symmetric])  
  1.1077 -done
  1.1078 +lemma abs_le_mult: "abs (a * b) \<le> (abs a) * (abs (b::'a::lordered_ring))" 
  1.1079 +proof -
  1.1080 +  let ?x = "pprt a * pprt b - pprt a * nprt b - nprt a * pprt b + nprt a * nprt b"
  1.1081 +  let ?y = "pprt a * pprt b + pprt a * nprt b + nprt a * pprt b + nprt a * nprt b"
  1.1082 +  have a: "(abs a) * (abs b) = ?x"
  1.1083 +    by (simp only: abs_prts[of a] abs_prts[of b] ring_eq_simps)
  1.1084 +  {
  1.1085 +    fix u v :: 'a
  1.1086 +    have bh: "\<lbrakk>u = a; v = b\<rbrakk> \<Longrightarrow> u * v = ?y"
  1.1087 +      apply (subst prts[of u], subst prts[of v])
  1.1088 +      apply (simp add: left_distrib right_distrib add_ac) 
  1.1089 +      done
  1.1090 +  }
  1.1091 +  note b = this[OF refl[of a] refl[of b]]
  1.1092 +  note addm = add_mono[of "0::'a" _ "0::'a", simplified]
  1.1093 +  note addm2 = add_mono[of _ "0::'a" _ "0::'a", simplified]
  1.1094 +  have xy: "- ?x <= ?y"
  1.1095 +    apply (simp add: compare_rls)
  1.1096 +    apply (rule add_le_imp_le_left[of "-(pprt a * nprt b + nprt a * pprt b)"])
  1.1097 +    apply (simp add: add_ac)
  1.1098 +    proof -
  1.1099 +      let ?r = "nprt a * nprt b +(nprt a * nprt b + (nprt a * pprt b + (pprt a * nprt b + (pprt a * pprt b + (pprt a * pprt b +
  1.1100 +	(- (nprt a * pprt b) + - (pprt a * nprt b)))))))"
  1.1101 +      let ?rr = "nprt a * nprt b + nprt a * nprt b + ((nprt a * pprt b) + (- (nprt a * pprt b))) + ((pprt a * nprt b) + - (pprt a * nprt b))
  1.1102 +	+ pprt a * pprt b + pprt a * pprt b"
  1.1103 +      have a:"?r = ?rr" by (simp only: add_ac)      
  1.1104 +      have "0 <= ?rr"
  1.1105 +	apply (simp)
  1.1106 +	apply (rule addm)+
  1.1107 +	apply (simp_all add: mult_neg_le mult_pos_le)
  1.1108 +	done
  1.1109 +      with a show "0 <= ?r" by simp
  1.1110 +    qed
  1.1111 +  have yx: "?y <= ?x"
  1.1112 +    apply (simp add: add_ac)
  1.1113 +    apply (simp add: compare_rls)
  1.1114 +    apply (rule add_le_imp_le_right[of _ "-(pprt a * pprt b)"])
  1.1115 +    apply (simp add: add_ac)
  1.1116 +    apply (rule addm2, (simp add: mult_pos_neg_le mult_pos_neg2_le)+)+
  1.1117 +    done
  1.1118 +  have i1: "a*b <= abs a * abs b" by (simp only: a b yx)
  1.1119 +  have i2: "- (abs a * abs b) <= a*b" by (simp only: a b xy)
  1.1120 +  show ?thesis
  1.1121 +    apply (rule abs_leI)
  1.1122 +    apply (simp add: i1)
  1.1123 +    apply (simp add: i2[simplified minus_le_iff])
  1.1124 +    done
  1.1125 +qed
  1.1126  
  1.1127 -lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)"
  1.1128 +lemma abs_eq_mult: 
  1.1129 +  assumes "(0 \<le> a \<or> a \<le> 0) \<and> (0 \<le> b \<or> b \<le> 0)"
  1.1130 +  shows "abs (a*b) = abs a * abs (b::'a::lordered_ring)"
  1.1131 +proof -
  1.1132 +  have s: "(0 <= a*b) | (a*b <= 0)"
  1.1133 +    apply (auto)    
  1.1134 +    apply (rule_tac split_mult_pos_le)
  1.1135 +    apply (rule_tac contrapos_np[of "a*b <= 0"])
  1.1136 +    apply (simp)
  1.1137 +    apply (rule_tac split_mult_neg_le)
  1.1138 +    apply (insert prems)
  1.1139 +    apply (blast)
  1.1140 +    done
  1.1141 +  have mulprts: "a * b = (pprt a + nprt a) * (pprt b + nprt b)"
  1.1142 +    by (simp add: prts[symmetric])
  1.1143 +  show ?thesis
  1.1144 +  proof cases
  1.1145 +    assume "0 <= a * b"
  1.1146 +    then show ?thesis
  1.1147 +      apply (simp_all add: mulprts abs_prts)
  1.1148 +      apply (insert prems)
  1.1149 +      apply (auto simp add: ring_eq_simps iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt]
  1.1150 +	iff2imp[OF le_zero_iff_pprt_id] iff2imp[OF zero_le_iff_nprt_id] order_antisym mult_pos_neg_le[of a b] mult_pos_neg2_le[of b a])
  1.1151 +      done
  1.1152 +  next
  1.1153 +    assume "~(0 <= a*b)"
  1.1154 +    with s have "a*b <= 0" by simp
  1.1155 +    then show ?thesis
  1.1156 +      apply (simp_all add: mulprts abs_prts)
  1.1157 +      apply (insert prems)
  1.1158 +      apply (auto simp add: ring_eq_simps iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt]
  1.1159 +	iff2imp[OF le_zero_iff_pprt_id] iff2imp[OF zero_le_iff_nprt_id] order_antisym mult_pos_le[of a b] mult_neg_le[of a b])
  1.1160 +      done
  1.1161 +  qed
  1.1162 +qed
  1.1163 +
  1.1164 +lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_idom)" 
  1.1165 +by (simp add: abs_eq_mult linorder_linear)
  1.1166 +
  1.1167 +lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_idom)"
  1.1168  by (simp add: abs_if) 
  1.1169  
  1.1170 -lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))"
  1.1171 -by (simp add: abs_if)
  1.1172 -
  1.1173 -lemma zero_less_abs_iff [simp]: "(0 < abs a) = (a \<noteq> (0::'a::ordered_ring))"
  1.1174 -by (simp add: abs_if linorder_neq_iff)
  1.1175 -
  1.1176 -lemma abs_not_less_zero [simp]: "~ abs a < (0::'a::ordered_ring)"
  1.1177 -apply (simp add: abs_if)
  1.1178 -by (simp add: abs_if  order_less_not_sym [of a 0])
  1.1179 -
  1.1180 -lemma abs_le_zero_iff [simp]: "(abs a \<le> (0::'a::ordered_ring)) = (a = 0)" 
  1.1181 -by (simp add: order_le_less) 
  1.1182 -
  1.1183 -lemma abs_minus_cancel [simp]: "abs (-a) = abs(a::'a::ordered_ring)"
  1.1184 -apply (auto simp add: abs_if linorder_not_less order_less_not_sym [of 0 a])  
  1.1185 -apply (drule order_antisym, assumption, simp) 
  1.1186 -done
  1.1187 -
  1.1188 -lemma abs_ge_zero [simp]: "(0::'a::ordered_ring) \<le> abs a"
  1.1189 -apply (simp add: abs_if order_less_imp_le)
  1.1190 -apply (simp add: linorder_not_less) 
  1.1191 -done
  1.1192 -
  1.1193 -lemma abs_idempotent [simp]: "abs (abs a) = abs (a::'a::ordered_ring)"
  1.1194 -  by (force elim: order_less_asym simp add: abs_if)
  1.1195 -
  1.1196 -lemma abs_zero_iff [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))"
  1.1197 -by (simp add: abs_if)
  1.1198 -
  1.1199 -lemma abs_ge_self: "a \<le> abs (a::'a::ordered_ring)"
  1.1200 -apply (simp add: abs_if)
  1.1201 -apply (simp add: order_less_imp_le order_trans [of _ 0])
  1.1202 -done
  1.1203 -
  1.1204 -lemma abs_ge_minus_self: "-a \<le> abs (a::'a::ordered_ring)"
  1.1205 -by (insert abs_ge_self [of "-a"], simp)
  1.1206 -
  1.1207  lemma nonzero_abs_inverse:
  1.1208       "a \<noteq> 0 ==> abs (inverse (a::'a::ordered_field)) = inverse (abs a)"
  1.1209  apply (auto simp add: linorder_neq_iff abs_if nonzero_inverse_minus_eq 
  1.1210 @@ -1670,72 +1463,8 @@
  1.1211  apply (simp add: nonzero_abs_divide) 
  1.1212  done
  1.1213  
  1.1214 -lemma abs_leI: "[|a \<le> b; -a \<le> b|] ==> abs a \<le> (b::'a::ordered_ring)"
  1.1215 -by (simp add: abs_if)
  1.1216 -
  1.1217 -lemma le_minus_self_iff: "(a \<le> -a) = (a \<le> (0::'a::ordered_ring))"
  1.1218 -proof 
  1.1219 -  assume ale: "a \<le> -a"
  1.1220 -  show "a\<le>0"
  1.1221 -    apply (rule classical) 
  1.1222 -    apply (simp add: linorder_not_le) 
  1.1223 -    apply (blast intro: ale order_trans order_less_imp_le
  1.1224 -                        neg_0_le_iff_le [THEN iffD1]) 
  1.1225 -    done
  1.1226 -next
  1.1227 -  assume "a\<le>0"
  1.1228 -  hence "0 \<le> -a" by (simp only: neg_0_le_iff_le)
  1.1229 -  thus "a \<le> -a"  by (blast intro: prems order_trans) 
  1.1230 -qed
  1.1231 -
  1.1232 -lemma minus_le_self_iff: "(-a \<le> a) = (0 \<le> (a::'a::ordered_ring))"
  1.1233 -by (insert le_minus_self_iff [of "-a"], simp)
  1.1234 -
  1.1235 -lemma eq_minus_self_iff: "(a = -a) = (a = (0::'a::ordered_ring))"
  1.1236 -by (force simp add: order_eq_iff le_minus_self_iff minus_le_self_iff)
  1.1237 -
  1.1238 -lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::ordered_ring))"
  1.1239 -by (simp add: order_less_le le_minus_self_iff eq_minus_self_iff)
  1.1240 -
  1.1241 -lemma abs_le_D1: "abs a \<le> b ==> a \<le> (b::'a::ordered_ring)"
  1.1242 -apply (simp add: abs_if split: split_if_asm)
  1.1243 -apply (rule order_trans [of _ "-a"]) 
  1.1244 - apply (simp add: less_minus_self_iff order_less_imp_le, assumption)
  1.1245 -done
  1.1246 -
  1.1247 -lemma abs_le_D2: "abs a \<le> b ==> -a \<le> (b::'a::ordered_ring)"
  1.1248 -by (insert abs_le_D1 [of "-a"], simp)
  1.1249 -
  1.1250 -lemma abs_le_iff: "(abs a \<le> b) = (a \<le> b & -a \<le> (b::'a::ordered_ring))"
  1.1251 -by (blast intro: abs_leI dest: abs_le_D1 abs_le_D2)
  1.1252 -
  1.1253 -lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_ring))" 
  1.1254 -apply (simp add: order_less_le abs_le_iff)  
  1.1255 -apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff)
  1.1256 -apply (simp add: le_minus_self_iff linorder_neq_iff) 
  1.1257 -done
  1.1258 -(*
  1.1259 -apply (simp add: order_less_le abs_le_iff)  
  1.1260 -apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff) 
  1.1261 - apply (simp add:  linorder_not_less [symmetric])
  1.1262 -apply (simp add: le_minus_self_iff linorder_neq_iff) 
  1.1263 -apply (simp add:  linorder_not_less [symmetric]) 
  1.1264 -done
  1.1265 -*)
  1.1266 -
  1.1267 -lemma abs_triangle_ineq: "abs (a+b) \<le> abs a + abs (b::'a::ordered_ring)"
  1.1268 -by (force simp add: abs_le_iff abs_ge_self abs_ge_minus_self add_mono)
  1.1269 -
  1.1270 -lemma abs_diff_triangle_ineq:
  1.1271 -     "\<bar>(a::'a::ordered_ring) + b - (c+d)\<bar> \<le> \<bar>a-c\<bar> + \<bar>b-d\<bar>"
  1.1272 -proof -
  1.1273 -  have "\<bar>a + b - (c+d)\<bar> = \<bar>(a-c) + (b-d)\<bar>" by (simp add: diff_minus add_ac)
  1.1274 -  also have "... \<le> \<bar>a-c\<bar> + \<bar>b-d\<bar>" by (rule abs_triangle_ineq)
  1.1275 -  finally show ?thesis .
  1.1276 -qed
  1.1277 -
  1.1278  lemma abs_mult_less:
  1.1279 -     "[| abs a < c; abs b < d |] ==> abs a * abs b < c*(d::'a::ordered_ring)"
  1.1280 +     "[| abs a < c; abs b < d |] ==> abs a * abs b < c*(d::'a::ordered_idom)"
  1.1281  proof -
  1.1282    assume ac: "abs a < c"
  1.1283    hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero)
  1.1284 @@ -1743,272 +1472,221 @@
  1.1285    thus ?thesis by (simp add: ac cpos mult_strict_mono) 
  1.1286  qed
  1.1287  
  1.1288 +lemma eq_minus_self_iff: "(a = -a) = (a = (0::'a::ordered_idom))"
  1.1289 +by (force simp add: order_eq_iff le_minus_self_iff minus_le_self_iff)
  1.1290 +
  1.1291 +lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::ordered_idom))"
  1.1292 +by (simp add: order_less_le le_minus_self_iff eq_minus_self_iff)
  1.1293 +
  1.1294 +lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_idom))" 
  1.1295 +apply (simp add: order_less_le abs_le_iff)  
  1.1296 +apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff)
  1.1297 +apply (simp add: le_minus_self_iff linorder_neq_iff) 
  1.1298 +done
  1.1299 +
  1.1300  text{*Moving this up spoils many proofs using @{text mult_le_cancel_right}*}
  1.1301  declare times_divide_eq_left [simp]
  1.1302  
  1.1303 -ML
  1.1304 -{*
  1.1305 -val add_assoc = thm"add_assoc";
  1.1306 -val add_commute = thm"add_commute";
  1.1307 -val mult_assoc = thm"mult_assoc";
  1.1308 -val mult_commute = thm"mult_commute";
  1.1309 -val zero_neq_one = thm"zero_neq_one";
  1.1310 -val diff_minus = thm"diff_minus";
  1.1311 -val abs_if = thm"abs_if";
  1.1312 -val divide_inverse = thm"divide_inverse";
  1.1313 -val inverse_zero = thm"inverse_zero";
  1.1314 -val divide_zero = thm"divide_zero";
  1.1315 -
  1.1316 -val add_0 = thm"add_0";
  1.1317 -val add_0_right = thm"add_0_right";
  1.1318 -val add_zero_left = thm"add_0";
  1.1319 -val add_zero_right = thm"add_0_right";
  1.1320 -
  1.1321 -val add_left_commute = thm"add_left_commute";
  1.1322 -val left_minus = thm"left_minus";
  1.1323 -val right_minus = thm"right_minus";
  1.1324 -val right_minus_eq = thm"right_minus_eq";
  1.1325 -val add_left_cancel = thm"add_left_cancel";
  1.1326 -val add_right_cancel = thm"add_right_cancel";
  1.1327 -val minus_minus = thm"minus_minus";
  1.1328 -val equals_zero_I = thm"equals_zero_I";
  1.1329 -val minus_zero = thm"minus_zero";
  1.1330 -val diff_self = thm"diff_self";
  1.1331 -val diff_0 = thm"diff_0";
  1.1332 -val diff_0_right = thm"diff_0_right";
  1.1333 -val diff_minus_eq_add = thm"diff_minus_eq_add";
  1.1334 -val neg_equal_iff_equal = thm"neg_equal_iff_equal";
  1.1335 -val neg_equal_0_iff_equal = thm"neg_equal_0_iff_equal";
  1.1336 -val neg_0_equal_iff_equal = thm"neg_0_equal_iff_equal";
  1.1337 -val equation_minus_iff = thm"equation_minus_iff";
  1.1338 -val minus_equation_iff = thm"minus_equation_iff";
  1.1339 -val mult_1 = thm"mult_1";
  1.1340 -val mult_1_right = thm"mult_1_right";
  1.1341 -val mult_left_commute = thm"mult_left_commute";
  1.1342 -val mult_zero_left = thm"mult_zero_left";
  1.1343 -val mult_zero_right = thm"mult_zero_right";
  1.1344 +ML {*
  1.1345  val left_distrib = thm "left_distrib";
  1.1346 -val right_distrib = thm"right_distrib";
  1.1347 -val combine_common_factor = thm"combine_common_factor";
  1.1348 -val minus_add_distrib = thm"minus_add_distrib";
  1.1349 -val minus_mult_left = thm"minus_mult_left";
  1.1350 -val minus_mult_right = thm"minus_mult_right";
  1.1351 -val minus_mult_minus = thm"minus_mult_minus";
  1.1352 -val minus_mult_commute = thm"minus_mult_commute";
  1.1353 -val right_diff_distrib = thm"right_diff_distrib";
  1.1354 -val left_diff_distrib = thm"left_diff_distrib";
  1.1355 -val minus_diff_eq = thm"minus_diff_eq";
  1.1356 -val add_left_mono = thm"add_left_mono";
  1.1357 -val add_right_mono = thm"add_right_mono";
  1.1358 -val add_mono = thm"add_mono";
  1.1359 -val add_strict_left_mono = thm"add_strict_left_mono";
  1.1360 -val add_strict_right_mono = thm"add_strict_right_mono";
  1.1361 -val add_strict_mono = thm"add_strict_mono";
  1.1362 -val add_less_le_mono = thm"add_less_le_mono";
  1.1363 -val add_le_less_mono = thm"add_le_less_mono";
  1.1364 -val add_less_imp_less_left = thm"add_less_imp_less_left";
  1.1365 -val add_less_imp_less_right = thm"add_less_imp_less_right";
  1.1366 -val add_less_cancel_left = thm"add_less_cancel_left";
  1.1367 -val add_less_cancel_right = thm"add_less_cancel_right";
  1.1368 -val add_le_cancel_left = thm"add_le_cancel_left";
  1.1369 -val add_le_cancel_right = thm"add_le_cancel_right";
  1.1370 -val add_le_imp_le_left = thm"add_le_imp_le_left";
  1.1371 -val add_le_imp_le_right = thm"add_le_imp_le_right";
  1.1372 -val le_imp_neg_le = thm"le_imp_neg_le";
  1.1373 -val neg_le_iff_le = thm"neg_le_iff_le";
  1.1374 -val neg_le_0_iff_le = thm"neg_le_0_iff_le";
  1.1375 -val neg_0_le_iff_le = thm"neg_0_le_iff_le";
  1.1376 -val neg_less_iff_less = thm"neg_less_iff_less";
  1.1377 -val neg_less_0_iff_less = thm"neg_less_0_iff_less";
  1.1378 -val neg_0_less_iff_less = thm"neg_0_less_iff_less";
  1.1379 -val less_minus_iff = thm"less_minus_iff";
  1.1380 -val minus_less_iff = thm"minus_less_iff";
  1.1381 -val le_minus_iff = thm"le_minus_iff";
  1.1382 -val minus_le_iff = thm"minus_le_iff";
  1.1383 -val add_diff_eq = thm"add_diff_eq";
  1.1384 -val diff_add_eq = thm"diff_add_eq";
  1.1385 -val diff_eq_eq = thm"diff_eq_eq";
  1.1386 -val eq_diff_eq = thm"eq_diff_eq";
  1.1387 -val diff_diff_eq = thm"diff_diff_eq";
  1.1388 -val diff_diff_eq2 = thm"diff_diff_eq2";
  1.1389 -val less_iff_diff_less_0 = thm"less_iff_diff_less_0";
  1.1390 -val diff_less_eq = thm"diff_less_eq";
  1.1391 -val less_diff_eq = thm"less_diff_eq";
  1.1392 -val diff_le_eq = thm"diff_le_eq";
  1.1393 -val le_diff_eq = thm"le_diff_eq";
  1.1394 -val eq_iff_diff_eq_0 = thm"eq_iff_diff_eq_0";
  1.1395 -val le_iff_diff_le_0 = thm"le_iff_diff_le_0";
  1.1396 -val eq_add_iff1 = thm"eq_add_iff1";
  1.1397 -val eq_add_iff2 = thm"eq_add_iff2";
  1.1398 -val less_add_iff1 = thm"less_add_iff1";
  1.1399 -val less_add_iff2 = thm"less_add_iff2";
  1.1400 -val le_add_iff1 = thm"le_add_iff1";
  1.1401 -val le_add_iff2 = thm"le_add_iff2";
  1.1402 -val mult_strict_left_mono = thm"mult_strict_left_mono";
  1.1403 -val mult_strict_right_mono = thm"mult_strict_right_mono";
  1.1404 -val mult_left_mono = thm"mult_left_mono";
  1.1405 -val mult_right_mono = thm"mult_right_mono";
  1.1406 -val mult_left_le_imp_le = thm"mult_left_le_imp_le";
  1.1407 -val mult_right_le_imp_le = thm"mult_right_le_imp_le";
  1.1408 -val mult_left_less_imp_less = thm"mult_left_less_imp_less";
  1.1409 -val mult_right_less_imp_less = thm"mult_right_less_imp_less";
  1.1410 -val mult_strict_left_mono_neg = thm"mult_strict_left_mono_neg";
  1.1411 -val mult_strict_right_mono_neg = thm"mult_strict_right_mono_neg";
  1.1412 -val mult_pos = thm"mult_pos";
  1.1413 -val mult_pos_neg = thm"mult_pos_neg";
  1.1414 -val mult_neg = thm"mult_neg";
  1.1415 -val zero_less_mult_pos = thm"zero_less_mult_pos";
  1.1416 -val zero_less_mult_iff = thm"zero_less_mult_iff";
  1.1417 -val mult_eq_0_iff = thm"mult_eq_0_iff";
  1.1418 -val zero_le_mult_iff = thm"zero_le_mult_iff";
  1.1419 -val mult_less_0_iff = thm"mult_less_0_iff";
  1.1420 -val mult_le_0_iff = thm"mult_le_0_iff";
  1.1421 -val zero_le_square = thm"zero_le_square";
  1.1422 -val zero_less_one = thm"zero_less_one";
  1.1423 -val zero_le_one = thm"zero_le_one";
  1.1424 -val not_one_less_zero = thm"not_one_less_zero";
  1.1425 -val not_one_le_zero = thm"not_one_le_zero";
  1.1426 -val mult_left_mono_neg = thm"mult_left_mono_neg";
  1.1427 -val mult_right_mono_neg = thm"mult_right_mono_neg";
  1.1428 -val mult_strict_mono = thm"mult_strict_mono";
  1.1429 -val mult_strict_mono' = thm"mult_strict_mono'";
  1.1430 -val mult_mono = thm"mult_mono";
  1.1431 -val mult_less_cancel_right = thm"mult_less_cancel_right";
  1.1432 -val mult_less_cancel_left = thm"mult_less_cancel_left";
  1.1433 -val mult_le_cancel_right = thm"mult_le_cancel_right";
  1.1434 -val mult_le_cancel_left = thm"mult_le_cancel_left";
  1.1435 -val mult_less_imp_less_left = thm"mult_less_imp_less_left";
  1.1436 -val mult_less_imp_less_right = thm"mult_less_imp_less_right";
  1.1437 -val mult_cancel_right = thm"mult_cancel_right";
  1.1438 -val mult_cancel_left = thm"mult_cancel_left";
  1.1439 +val right_distrib = thm "right_distrib";
  1.1440 +val mult_commute = thm "mult_commute";
  1.1441 +val distrib = thm "distrib";
  1.1442 +val zero_neq_one = thm "zero_neq_one";
  1.1443 +val no_zero_divisors = thm "no_zero_divisors";
  1.1444  val left_inverse = thm "left_inverse";
  1.1445 -val right_inverse = thm"right_inverse";
  1.1446 -val right_inverse_eq = thm"right_inverse_eq";
  1.1447 -val nonzero_inverse_eq_divide = thm"nonzero_inverse_eq_divide";
  1.1448 -val divide_self = thm"divide_self";
  1.1449 -val inverse_divide = thm"inverse_divide";
  1.1450 -val divide_zero_left = thm"divide_zero_left";
  1.1451 -val inverse_eq_divide = thm"inverse_eq_divide";
  1.1452 -val add_divide_distrib = thm"add_divide_distrib";
  1.1453 -val field_mult_eq_0_iff = thm"field_mult_eq_0_iff";
  1.1454 -val field_mult_cancel_right = thm"field_mult_cancel_right";
  1.1455 -val field_mult_cancel_left = thm"field_mult_cancel_left";
  1.1456 -val nonzero_imp_inverse_nonzero = thm"nonzero_imp_inverse_nonzero";
  1.1457 -val inverse_zero_imp_zero = thm"inverse_zero_imp_zero";
  1.1458 -val inverse_nonzero_imp_nonzero = thm"inverse_nonzero_imp_nonzero";
  1.1459 -val inverse_nonzero_iff_nonzero = thm"inverse_nonzero_iff_nonzero";
  1.1460 -val nonzero_inverse_minus_eq = thm"nonzero_inverse_minus_eq";
  1.1461 -val inverse_minus_eq = thm"inverse_minus_eq";
  1.1462 -val nonzero_inverse_eq_imp_eq = thm"nonzero_inverse_eq_imp_eq";
  1.1463 -val inverse_eq_imp_eq = thm"inverse_eq_imp_eq";
  1.1464 -val inverse_eq_iff_eq = thm"inverse_eq_iff_eq";
  1.1465 -val nonzero_inverse_inverse_eq = thm"nonzero_inverse_inverse_eq";
  1.1466 -val inverse_inverse_eq = thm"inverse_inverse_eq";
  1.1467 -val inverse_1 = thm"inverse_1";
  1.1468 -val nonzero_inverse_mult_distrib = thm"nonzero_inverse_mult_distrib";
  1.1469 -val inverse_mult_distrib = thm"inverse_mult_distrib";
  1.1470 -val inverse_add = thm"inverse_add";
  1.1471 -val nonzero_mult_divide_cancel_left = thm"nonzero_mult_divide_cancel_left";
  1.1472 -val mult_divide_cancel_left = thm"mult_divide_cancel_left";
  1.1473 -val nonzero_mult_divide_cancel_right = thm"nonzero_mult_divide_cancel_right";
  1.1474 -val mult_divide_cancel_right = thm"mult_divide_cancel_right";
  1.1475 -val mult_divide_cancel_eq_if = thm"mult_divide_cancel_eq_if";
  1.1476 -val divide_1 = thm"divide_1";
  1.1477 -val times_divide_eq_right = thm"times_divide_eq_right";
  1.1478 -val times_divide_eq_left = thm"times_divide_eq_left";
  1.1479 -val divide_divide_eq_right = thm"divide_divide_eq_right";
  1.1480 -val divide_divide_eq_left = thm"divide_divide_eq_left";
  1.1481 -val nonzero_minus_divide_left = thm"nonzero_minus_divide_left";
  1.1482 -val nonzero_minus_divide_right = thm"nonzero_minus_divide_right";
  1.1483 -val nonzero_minus_divide_divide = thm"nonzero_minus_divide_divide";
  1.1484 -val minus_divide_left = thm"minus_divide_left";
  1.1485 -val minus_divide_right = thm"minus_divide_right";
  1.1486 -val minus_divide_divide = thm"minus_divide_divide";
  1.1487 -val positive_imp_inverse_positive = thm"positive_imp_inverse_positive";
  1.1488 -val negative_imp_inverse_negative = thm"negative_imp_inverse_negative";
  1.1489 -val inverse_le_imp_le = thm"inverse_le_imp_le";
  1.1490 -val inverse_positive_imp_positive = thm"inverse_positive_imp_positive";
  1.1491 -val inverse_positive_iff_positive = thm"inverse_positive_iff_positive";
  1.1492 -val inverse_negative_imp_negative = thm"inverse_negative_imp_negative";
  1.1493 -val inverse_negative_iff_negative = thm"inverse_negative_iff_negative";
  1.1494 -val inverse_nonnegative_iff_nonnegative = thm"inverse_nonnegative_iff_nonnegative";
  1.1495 -val inverse_nonpositive_iff_nonpositive = thm"inverse_nonpositive_iff_nonpositive";
  1.1496 -val less_imp_inverse_less = thm"less_imp_inverse_less";
  1.1497 -val inverse_less_imp_less = thm"inverse_less_imp_less";
  1.1498 -val inverse_less_iff_less = thm"inverse_less_iff_less";
  1.1499 -val le_imp_inverse_le = thm"le_imp_inverse_le";
  1.1500 -val inverse_le_iff_le = thm"inverse_le_iff_le";
  1.1501 -val inverse_le_imp_le_neg = thm"inverse_le_imp_le_neg";
  1.1502 -val less_imp_inverse_less_neg = thm"less_imp_inverse_less_neg";
  1.1503 -val inverse_less_imp_less_neg = thm"inverse_less_imp_less_neg";
  1.1504 -val inverse_less_iff_less_neg = thm"inverse_less_iff_less_neg";
  1.1505 -val le_imp_inverse_le_neg = thm"le_imp_inverse_le_neg";
  1.1506 -val inverse_le_iff_le_neg = thm"inverse_le_iff_le_neg";
  1.1507 -val zero_less_divide_iff = thm"zero_less_divide_iff";
  1.1508 -val divide_less_0_iff = thm"divide_less_0_iff";
  1.1509 -val zero_le_divide_iff = thm"zero_le_divide_iff";
  1.1510 -val divide_le_0_iff = thm"divide_le_0_iff";
  1.1511 -val divide_eq_0_iff = thm"divide_eq_0_iff";
  1.1512 -val pos_le_divide_eq = thm"pos_le_divide_eq";
  1.1513 -val neg_le_divide_eq = thm"neg_le_divide_eq";
  1.1514 -val le_divide_eq = thm"le_divide_eq";
  1.1515 -val pos_divide_le_eq = thm"pos_divide_le_eq";
  1.1516 -val neg_divide_le_eq = thm"neg_divide_le_eq";
  1.1517 -val divide_le_eq = thm"divide_le_eq";
  1.1518 -val pos_less_divide_eq = thm"pos_less_divide_eq";
  1.1519 -val neg_less_divide_eq = thm"neg_less_divide_eq";
  1.1520 -val less_divide_eq = thm"less_divide_eq";
  1.1521 -val pos_divide_less_eq = thm"pos_divide_less_eq";
  1.1522 -val neg_divide_less_eq = thm"neg_divide_less_eq";
  1.1523 -val divide_less_eq = thm"divide_less_eq";
  1.1524 -val nonzero_eq_divide_eq = thm"nonzero_eq_divide_eq";
  1.1525 -val eq_divide_eq = thm"eq_divide_eq";
  1.1526 -val nonzero_divide_eq_eq = thm"nonzero_divide_eq_eq";
  1.1527 -val divide_eq_eq = thm"divide_eq_eq";
  1.1528 -val divide_cancel_right = thm"divide_cancel_right";
  1.1529 -val divide_cancel_left = thm"divide_cancel_left";
  1.1530 -val divide_strict_right_mono = thm"divide_strict_right_mono";
  1.1531 -val divide_right_mono = thm"divide_right_mono";
  1.1532 -val divide_strict_left_mono = thm"divide_strict_left_mono";
  1.1533 -val divide_left_mono = thm"divide_left_mono";
  1.1534 -val divide_strict_left_mono_neg = thm"divide_strict_left_mono_neg";
  1.1535 -val divide_strict_right_mono_neg = thm"divide_strict_right_mono_neg";
  1.1536 -val zero_less_two = thm"zero_less_two";
  1.1537 -val less_half_sum = thm"less_half_sum";
  1.1538 -val gt_half_sum = thm"gt_half_sum";
  1.1539 -val dense = thm"dense";
  1.1540 -val abs_zero = thm"abs_zero";
  1.1541 -val abs_one = thm"abs_one";
  1.1542 -val abs_mult = thm"abs_mult";
  1.1543 -val abs_mult_self = thm"abs_mult_self";
  1.1544 -val abs_eq_0 = thm"abs_eq_0";
  1.1545 -val zero_less_abs_iff = thm"zero_less_abs_iff";
  1.1546 -val abs_not_less_zero = thm"abs_not_less_zero";
  1.1547 -val abs_le_zero_iff = thm"abs_le_zero_iff";
  1.1548 -val abs_minus_cancel = thm"abs_minus_cancel";
  1.1549 -val abs_ge_zero = thm"abs_ge_zero";
  1.1550 -val abs_idempotent = thm"abs_idempotent";
  1.1551 -val abs_zero_iff = thm"abs_zero_iff";
  1.1552 -val abs_ge_self = thm"abs_ge_self";
  1.1553 -val abs_ge_minus_self = thm"abs_ge_minus_self";
  1.1554 -val nonzero_abs_inverse = thm"nonzero_abs_inverse";
  1.1555 -val abs_inverse = thm"abs_inverse";
  1.1556 -val nonzero_abs_divide = thm"nonzero_abs_divide";
  1.1557 -val abs_divide = thm"abs_divide";
  1.1558 -val abs_leI = thm"abs_leI";
  1.1559 -val le_minus_self_iff = thm"le_minus_self_iff";
  1.1560 -val minus_le_self_iff = thm"minus_le_self_iff";
  1.1561 -val eq_minus_self_iff = thm"eq_minus_self_iff";
  1.1562 -val less_minus_self_iff = thm"less_minus_self_iff";
  1.1563 -val abs_le_D1 = thm"abs_le_D1";
  1.1564 -val abs_le_D2 = thm"abs_le_D2";
  1.1565 -val abs_le_iff = thm"abs_le_iff";
  1.1566 -val abs_less_iff = thm"abs_less_iff";
  1.1567 -val abs_triangle_ineq = thm"abs_triangle_ineq";
  1.1568 -val abs_mult_less = thm"abs_mult_less";
  1.1569 -
  1.1570 -val compare_rls = thms"compare_rls";
  1.1571 +val divide_inverse = thm "divide_inverse";
  1.1572 +val mult_zero_left = thm "mult_zero_left";
  1.1573 +val mult_zero_right = thm "mult_zero_right";
  1.1574 +val field_mult_eq_0_iff = thm "field_mult_eq_0_iff";
  1.1575 +val inverse_zero = thm "inverse_zero";
  1.1576 +val ring_distrib = thms "ring_distrib";
  1.1577 +val combine_common_factor = thm "combine_common_factor";
  1.1578 +val minus_mult_left = thm "minus_mult_left";
  1.1579 +val minus_mult_right = thm "minus_mult_right";
  1.1580 +val minus_mult_minus = thm "minus_mult_minus";
  1.1581 +val minus_mult_commute = thm "minus_mult_commute";
  1.1582 +val right_diff_distrib = thm "right_diff_distrib";
  1.1583 +val left_diff_distrib = thm "left_diff_distrib";
  1.1584 +val mult_left_mono = thm "mult_left_mono";
  1.1585 +val mult_right_mono = thm "mult_right_mono";
  1.1586 +val mult_strict_left_mono = thm "mult_strict_left_mono";
  1.1587 +val mult_strict_right_mono = thm "mult_strict_right_mono";
  1.1588 +val mult_mono = thm "mult_mono";
  1.1589 +val mult_strict_mono = thm "mult_strict_mono";
  1.1590 +val abs_if = thm "abs_if";
  1.1591 +val zero_less_one = thm "zero_less_one";
  1.1592 +val eq_add_iff1 = thm "eq_add_iff1";
  1.1593 +val eq_add_iff2 = thm "eq_add_iff2";
  1.1594 +val less_add_iff1 = thm "less_add_iff1";
  1.1595 +val less_add_iff2 = thm "less_add_iff2";
  1.1596 +val le_add_iff1 = thm "le_add_iff1";
  1.1597 +val le_add_iff2 = thm "le_add_iff2";
  1.1598 +val mult_left_le_imp_le = thm "mult_left_le_imp_le";
  1.1599 +val mult_right_le_imp_le = thm "mult_right_le_imp_le";
  1.1600 +val mult_left_less_imp_less = thm "mult_left_less_imp_less";
  1.1601 +val mult_right_less_imp_less = thm "mult_right_less_imp_less";
  1.1602 +val mult_strict_left_mono_neg = thm "mult_strict_left_mono_neg";
  1.1603 +val mult_left_mono_neg = thm "mult_left_mono_neg";
  1.1604 +val mult_strict_right_mono_neg = thm "mult_strict_right_mono_neg";
  1.1605 +val mult_right_mono_neg = thm "mult_right_mono_neg";
  1.1606 +val mult_pos = thm "mult_pos";
  1.1607 +val mult_pos_le = thm "mult_pos_le";
  1.1608 +val mult_pos_neg = thm "mult_pos_neg";
  1.1609 +val mult_pos_neg_le = thm "mult_pos_neg_le";
  1.1610 +val mult_pos_neg2 = thm "mult_pos_neg2";
  1.1611 +val mult_pos_neg2_le = thm "mult_pos_neg2_le";
  1.1612 +val mult_neg = thm "mult_neg";
  1.1613 +val mult_neg_le = thm "mult_neg_le";
  1.1614 +val zero_less_mult_pos = thm "zero_less_mult_pos";
  1.1615 +val zero_less_mult_pos2 = thm "zero_less_mult_pos2";
  1.1616 +val zero_less_mult_iff = thm "zero_less_mult_iff";
  1.1617 +val mult_eq_0_iff = thm "mult_eq_0_iff";
  1.1618 +val zero_le_mult_iff = thm "zero_le_mult_iff";
  1.1619 +val mult_less_0_iff = thm "mult_less_0_iff";
  1.1620 +val mult_le_0_iff = thm "mult_le_0_iff";
  1.1621 +val split_mult_pos_le = thm "split_mult_pos_le";
  1.1622 +val split_mult_neg_le = thm "split_mult_neg_le";
  1.1623 +val zero_le_square = thm "zero_le_square";
  1.1624 +val zero_le_one = thm "zero_le_one";
  1.1625 +val not_one_le_zero = thm "not_one_le_zero";
  1.1626 +val not_one_less_zero = thm "not_one_less_zero";
  1.1627 +val mult_left_mono_neg = thm "mult_left_mono_neg";
  1.1628 +val mult_right_mono_neg = thm "mult_right_mono_neg";
  1.1629 +val mult_strict_mono = thm "mult_strict_mono";
  1.1630 +val mult_strict_mono' = thm "mult_strict_mono'";
  1.1631 +val mult_mono = thm "mult_mono";
  1.1632 +val less_1_mult = thm "less_1_mult";
  1.1633 +val mult_less_cancel_right = thm "mult_less_cancel_right";
  1.1634 +val mult_less_cancel_left = thm "mult_less_cancel_left";
  1.1635 +val mult_le_cancel_right = thm "mult_le_cancel_right";
  1.1636 +val mult_le_cancel_left = thm "mult_le_cancel_left";
  1.1637 +val mult_less_imp_less_left = thm "mult_less_imp_less_left";
  1.1638 +val mult_less_imp_less_right = thm "mult_less_imp_less_right";
  1.1639 +val mult_cancel_right = thm "mult_cancel_right";
  1.1640 +val mult_cancel_left = thm "mult_cancel_left";
  1.1641 +val ring_eq_simps = thms "ring_eq_simps";
  1.1642 +val right_inverse = thm "right_inverse";
  1.1643 +val right_inverse_eq = thm "right_inverse_eq";
  1.1644 +val nonzero_inverse_eq_divide = thm "nonzero_inverse_eq_divide";
  1.1645 +val divide_self = thm "divide_self";
  1.1646 +val divide_zero = thm "divide_zero";
  1.1647 +val divide_zero_left = thm "divide_zero_left";
  1.1648 +val inverse_eq_divide = thm "inverse_eq_divide";
  1.1649 +val add_divide_distrib = thm "add_divide_distrib";
  1.1650 +val field_mult_eq_0_iff = thm "field_mult_eq_0_iff";
  1.1651 +val field_mult_cancel_right_lemma = thm "field_mult_cancel_right_lemma";
  1.1652 +val field_mult_cancel_right = thm "field_mult_cancel_right";
  1.1653 +val field_mult_cancel_left = thm "field_mult_cancel_left";
  1.1654 +val nonzero_imp_inverse_nonzero = thm "nonzero_imp_inverse_nonzero";
  1.1655 +val inverse_zero_imp_zero = thm "inverse_zero_imp_zero";
  1.1656 +val inverse_nonzero_imp_nonzero = thm "inverse_nonzero_imp_nonzero";
  1.1657 +val inverse_nonzero_iff_nonzero = thm "inverse_nonzero_iff_nonzero";
  1.1658 +val nonzero_inverse_minus_eq = thm "nonzero_inverse_minus_eq";
  1.1659 +val inverse_minus_eq = thm "inverse_minus_eq";
  1.1660 +val nonzero_inverse_eq_imp_eq = thm "nonzero_inverse_eq_imp_eq";
  1.1661 +val inverse_eq_imp_eq = thm "inverse_eq_imp_eq";
  1.1662 +val inverse_eq_iff_eq = thm "inverse_eq_iff_eq";
  1.1663 +val nonzero_inverse_inverse_eq = thm "nonzero_inverse_inverse_eq";
  1.1664 +val inverse_inverse_eq = thm "inverse_inverse_eq";
  1.1665 +val inverse_1 = thm "inverse_1";
  1.1666 +val nonzero_inverse_mult_distrib = thm "nonzero_inverse_mult_distrib";
  1.1667 +val inverse_mult_distrib = thm "inverse_mult_distrib";
  1.1668 +val inverse_add = thm "inverse_add";
  1.1669 +val inverse_divide = thm "inverse_divide";
  1.1670 +val nonzero_mult_divide_cancel_left = thm "nonzero_mult_divide_cancel_left";
  1.1671 +val mult_divide_cancel_left = thm "mult_divide_cancel_left";
  1.1672 +val nonzero_mult_divide_cancel_right = thm "nonzero_mult_divide_cancel_right";
  1.1673 +val mult_divide_cancel_right = thm "mult_divide_cancel_right";
  1.1674 +val mult_divide_cancel_eq_if = thm "mult_divide_cancel_eq_if";
  1.1675 +val divide_1 = thm "divide_1";
  1.1676 +val times_divide_eq_right = thm "times_divide_eq_right";
  1.1677 +val times_divide_eq_left = thm "times_divide_eq_left";
  1.1678 +val divide_divide_eq_right = thm "divide_divide_eq_right";
  1.1679 +val divide_divide_eq_left = thm "divide_divide_eq_left";
  1.1680 +val nonzero_minus_divide_left = thm "nonzero_minus_divide_left";
  1.1681 +val nonzero_minus_divide_right = thm "nonzero_minus_divide_right";
  1.1682 +val nonzero_minus_divide_divide = thm "nonzero_minus_divide_divide";
  1.1683 +val minus_divide_left = thm "minus_divide_left";
  1.1684 +val minus_divide_right = thm "minus_divide_right";
  1.1685 +val minus_divide_divide = thm "minus_divide_divide";
  1.1686 +val diff_divide_distrib = thm "diff_divide_distrib";
  1.1687 +val positive_imp_inverse_positive = thm "positive_imp_inverse_positive";
  1.1688 +val negative_imp_inverse_negative = thm "negative_imp_inverse_negative";
  1.1689 +val inverse_le_imp_le = thm "inverse_le_imp_le";
  1.1690 +val inverse_positive_imp_positive = thm "inverse_positive_imp_positive";
  1.1691 +val inverse_positive_iff_positive = thm "inverse_positive_iff_positive";
  1.1692 +val inverse_negative_imp_negative = thm "inverse_negative_imp_negative";
  1.1693 +val inverse_negative_iff_negative = thm "inverse_negative_iff_negative";
  1.1694 +val inverse_nonnegative_iff_nonnegative = thm "inverse_nonnegative_iff_nonnegative";
  1.1695 +val inverse_nonpositive_iff_nonpositive = thm "inverse_nonpositive_iff_nonpositive";
  1.1696 +val less_imp_inverse_less = thm "less_imp_inverse_less";
  1.1697 +val inverse_less_imp_less = thm "inverse_less_imp_less";
  1.1698 +val inverse_less_iff_less = thm "inverse_less_iff_less";
  1.1699 +val le_imp_inverse_le = thm "le_imp_inverse_le";
  1.1700 +val inverse_le_iff_le = thm "inverse_le_iff_le";
  1.1701 +val inverse_le_imp_le_neg = thm "inverse_le_imp_le_neg";
  1.1702 +val less_imp_inverse_less_neg = thm "less_imp_inverse_less_neg";
  1.1703 +val inverse_less_imp_less_neg = thm "inverse_less_imp_less_neg";
  1.1704 +val inverse_less_iff_less_neg = thm "inverse_less_iff_less_neg";
  1.1705 +val le_imp_inverse_le_neg = thm "le_imp_inverse_le_neg";
  1.1706 +val inverse_le_iff_le_neg = thm "inverse_le_iff_le_neg";
  1.1707 +val one_less_inverse_iff = thm "one_less_inverse_iff";
  1.1708 +val inverse_eq_1_iff = thm "inverse_eq_1_iff";
  1.1709 +val one_le_inverse_iff = thm "one_le_inverse_iff";
  1.1710 +val inverse_less_1_iff = thm "inverse_less_1_iff";
  1.1711 +val inverse_le_1_iff = thm "inverse_le_1_iff";
  1.1712 +val zero_less_divide_iff = thm "zero_less_divide_iff";
  1.1713 +val divide_less_0_iff = thm "divide_less_0_iff";
  1.1714 +val zero_le_divide_iff = thm "zero_le_divide_iff";
  1.1715 +val divide_le_0_iff = thm "divide_le_0_iff";
  1.1716 +val divide_eq_0_iff = thm "divide_eq_0_iff";
  1.1717 +val pos_le_divide_eq = thm "pos_le_divide_eq";
  1.1718 +val neg_le_divide_eq = thm "neg_le_divide_eq";
  1.1719 +val le_divide_eq = thm "le_divide_eq";
  1.1720 +val pos_divide_le_eq = thm "pos_divide_le_eq";
  1.1721 +val neg_divide_le_eq = thm "neg_divide_le_eq";
  1.1722 +val divide_le_eq = thm "divide_le_eq";
  1.1723 +val pos_less_divide_eq = thm "pos_less_divide_eq";
  1.1724 +val neg_less_divide_eq = thm "neg_less_divide_eq";
  1.1725 +val less_divide_eq = thm "less_divide_eq";
  1.1726 +val pos_divide_less_eq = thm "pos_divide_less_eq";
  1.1727 +val neg_divide_less_eq = thm "neg_divide_less_eq";
  1.1728 +val divide_less_eq = thm "divide_less_eq";
  1.1729 +val nonzero_eq_divide_eq = thm "nonzero_eq_divide_eq";
  1.1730 +val eq_divide_eq = thm "eq_divide_eq";
  1.1731 +val nonzero_divide_eq_eq = thm "nonzero_divide_eq_eq";
  1.1732 +val divide_eq_eq = thm "divide_eq_eq";
  1.1733 +val divide_cancel_right = thm "divide_cancel_right";
  1.1734 +val divide_cancel_left = thm "divide_cancel_left";
  1.1735 +val divide_eq_1_iff = thm "divide_eq_1_iff";
  1.1736 +val one_eq_divide_iff = thm "one_eq_divide_iff";
  1.1737 +val zero_eq_1_divide_iff = thm "zero_eq_1_divide_iff";
  1.1738 +val one_divide_eq_0_iff = thm "one_divide_eq_0_iff";
  1.1739 +val divide_strict_right_mono = thm "divide_strict_right_mono";
  1.1740 +val divide_right_mono = thm "divide_right_mono";
  1.1741 +val divide_strict_left_mono = thm "divide_strict_left_mono";
  1.1742 +val divide_left_mono = thm "divide_left_mono";
  1.1743 +val divide_strict_left_mono_neg = thm "divide_strict_left_mono_neg";
  1.1744 +val divide_strict_right_mono_neg = thm "divide_strict_right_mono_neg";
  1.1745 +val less_add_one = thm "less_add_one";
  1.1746 +val zero_less_two = thm "zero_less_two";
  1.1747 +val less_half_sum = thm "less_half_sum";
  1.1748 +val gt_half_sum = thm "gt_half_sum";
  1.1749 +val dense = thm "dense";
  1.1750 +val abs_one = thm "abs_one";
  1.1751 +val abs_le_mult = thm "abs_le_mult";
  1.1752 +val abs_eq_mult = thm "abs_eq_mult";
  1.1753 +val abs_mult = thm "abs_mult";
  1.1754 +val abs_mult_self = thm "abs_mult_self";
  1.1755 +val nonzero_abs_inverse = thm "nonzero_abs_inverse";
  1.1756 +val abs_inverse = thm "abs_inverse";
  1.1757 +val nonzero_abs_divide = thm "nonzero_abs_divide";
  1.1758 +val abs_divide = thm "abs_divide";
  1.1759 +val abs_mult_less = thm "abs_mult_less";
  1.1760 +val eq_minus_self_iff = thm "eq_minus_self_iff";
  1.1761 +val less_minus_self_iff = thm "less_minus_self_iff";
  1.1762 +val abs_less_iff = thm "abs_less_iff";
  1.1763  *}
  1.1764  
  1.1765 -
  1.1766  end