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