1 (* Title: HOL/Ring_and_Field.thy |
1 (* Title: HOL/Ring_and_Field.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Gertrud Bauer and Markus Wenzel, TU Muenchen |
3 Author: Gertrud Bauer and Markus Wenzel, TU Muenchen |
4 Lawrence C Paulson, University of Cambridge |
4 Lawrence C Paulson, University of Cambridge |
|
5 Revised and splitted into Ring_and_Field.thy and Group.thy |
|
6 by Steven Obua, TU Muenchen, in May 2004 |
5 License: GPL (GNU GENERAL PUBLIC LICENSE) |
7 License: GPL (GNU GENERAL PUBLIC LICENSE) |
6 *) |
8 *) |
7 |
9 |
8 header {* Ring and field structures *} |
10 header {* (Ordered) Rings and Fields *} |
9 |
11 |
10 theory Ring_and_Field = Inductive: |
12 theory Ring_and_Field = OrderedGroup: |
11 |
13 |
12 subsection {* Abstract algebraic structures *} |
14 text {* |
13 |
15 The theory of partially ordered rings is taken from the books: |
14 subsection {* Types Classes @{text plus_ac0} and @{text times_ac1} *} |
16 \begin{itemize} |
15 |
17 \item \emph{Lattice Theory} by Garret Birkhoff, American Mathematical Society 1979 |
16 axclass plus_ac0 \<subseteq> plus, zero |
18 \item \emph{Partially Ordered Algebraic Systems}, Pergamon Press 1963 |
17 commute: "x + y = y + x" |
19 \end{itemize} |
18 assoc: "(x + y) + z = x + (y + z)" |
20 Most of the used notions can also be looked up in |
19 zero [simp]: "0 + x = x" |
21 \begin{itemize} |
20 |
22 \item \emph{www.mathworld.com} by Eric Weisstein et. al. |
21 lemma plus_ac0_left_commute: "x + (y+z) = y + ((x+z)::'a::plus_ac0)" |
23 \item \emph{Algebra I} by van der Waerden, Springer. |
22 by(rule mk_left_commute[of "op +",OF plus_ac0.assoc plus_ac0.commute]) |
24 \end{itemize} |
23 |
25 *} |
24 lemma plus_ac0_zero_right [simp]: "x + 0 = (x ::'a::plus_ac0)" |
26 |
25 apply (rule plus_ac0.commute [THEN trans]) |
27 axclass semiring \<subseteq> ab_semigroup_add, semigroup_mult |
26 apply (rule plus_ac0.zero) |
28 left_distrib: "(a + b) * c = a * c + b * c" |
27 done |
29 right_distrib: "a * (b + c) = a * b + a * c" |
28 |
30 |
29 lemmas plus_ac0 = plus_ac0.assoc plus_ac0.commute plus_ac0_left_commute |
31 axclass semiring_0 \<subseteq> semiring, comm_monoid_add |
30 plus_ac0.zero plus_ac0_zero_right |
32 |
31 |
33 axclass comm_semiring \<subseteq> ab_semigroup_add, ab_semigroup_mult |
32 axclass times_ac1 \<subseteq> times, one |
|
33 commute: "x * y = y * x" |
|
34 assoc: "(x * y) * z = x * (y * z)" |
|
35 one [simp]: "1 * x = x" |
|
36 |
|
37 theorem times_ac1_left_commute: "(x::'a::times_ac1) * ((y::'a) * z) = |
|
38 y * (x * z)" |
|
39 by(rule mk_left_commute[of "op *",OF times_ac1.assoc times_ac1.commute]) |
|
40 |
|
41 theorem times_ac1_one_right [simp]: "(x::'a::times_ac1) * 1 = x" |
|
42 proof - |
|
43 have "x * 1 = 1 * x" |
|
44 by (rule times_ac1.commute) |
|
45 also have "... = x" |
|
46 by (rule times_ac1.one) |
|
47 finally show ?thesis . |
|
48 qed |
|
49 |
|
50 theorems times_ac1 = times_ac1.assoc times_ac1.commute times_ac1_left_commute |
|
51 times_ac1.one times_ac1_one_right |
|
52 |
|
53 |
|
54 text{*This class is the same as @{text plus_ac0}, while using the same axiom |
|
55 names as the other axclasses.*} |
|
56 axclass abelian_semigroup \<subseteq> zero, plus |
|
57 add_assoc: "(a + b) + c = a + (b + c)" |
|
58 add_commute: "a + b = b + a" |
|
59 add_0 [simp]: "0 + a = a" |
|
60 |
|
61 text{*This class underlies both @{text semiring} and @{text ring}*} |
|
62 axclass almost_semiring \<subseteq> abelian_semigroup, one, times |
|
63 mult_assoc: "(a * b) * c = a * (b * c)" |
|
64 mult_commute: "a * b = b * a" |
34 mult_commute: "a * b = b * a" |
65 mult_1 [simp]: "1 * a = a" |
35 distrib: "(a + b) * c = a * c + b * c" |
66 |
36 |
67 left_distrib: "(a + b) * c = a * c + b * c" |
37 instance comm_semiring \<subseteq> semiring |
68 zero_neq_one [simp]: "0 \<noteq> 1" |
|
69 |
|
70 |
|
71 axclass semiring \<subseteq> almost_semiring |
|
72 add_left_imp_eq: "a + b = a + c ==> b=c" |
|
73 --{*This axiom is needed for semirings only: for rings, etc., it is |
|
74 redundant. Including it allows many more of the following results |
|
75 to be proved for semirings too.*} |
|
76 |
|
77 instance abelian_semigroup \<subseteq> plus_ac0 |
|
78 proof |
|
79 fix x y z :: 'a |
|
80 show "x + y = y + x" by (rule add_commute) |
|
81 show "x + y + z = x + (y + z)" by (rule add_assoc) |
|
82 show "0+x = x" by (rule add_0) |
|
83 qed |
|
84 |
|
85 instance almost_semiring \<subseteq> times_ac1 |
|
86 proof |
|
87 fix x y z :: 'a |
|
88 show "x * y = y * x" by (rule mult_commute) |
|
89 show "x * y * z = x * (y * z)" by (rule mult_assoc) |
|
90 show "1*x = x" by simp |
|
91 qed |
|
92 |
|
93 axclass abelian_group \<subseteq> abelian_semigroup, minus |
|
94 left_minus [simp]: "-a + a = 0" |
|
95 diff_minus: "a - b = a + -b" |
|
96 |
|
97 axclass ring \<subseteq> almost_semiring, abelian_group |
|
98 |
|
99 text{*Proving axiom @{text add_left_imp_eq} makes all @{text semiring} |
|
100 theorems available to members of @{term ring} *} |
|
101 instance ring \<subseteq> semiring |
|
102 proof |
38 proof |
103 fix a b c :: 'a |
39 fix a b c :: 'a |
104 assume "a + b = a + c" |
40 show "(a + b) * c = a * c + b * c" by (simp add: distrib) |
105 hence "-a + a + b = -a + a + c" by (simp only: add_assoc) |
41 have "a * (b + c) = (b + c) * a" by (simp add: mult_ac) |
106 thus "b = c" by simp |
42 also have "... = b * a + c * a" by (simp only: distrib) |
107 qed |
43 also have "... = a * b + a * c" by (simp add: mult_ac) |
108 |
44 finally show "a * (b + c) = a * b + a * c" by blast |
109 text{*This class underlies @{text ordered_semiring} and @{text ordered_ring}*} |
45 qed |
110 axclass almost_ordered_semiring \<subseteq> semiring, linorder |
46 |
111 add_left_mono: "a \<le> b ==> c + a \<le> c + b" |
47 axclass comm_semiring_0 \<subseteq> comm_semiring, comm_monoid_add |
112 mult_strict_left_mono: "a < b ==> 0 < c ==> c * a < c * b" |
48 |
113 |
49 instance comm_semiring_0 \<subseteq> semiring_0 .. |
114 axclass ordered_semiring \<subseteq> almost_ordered_semiring |
50 |
115 zero_less_one [simp]: "0 < 1" --{*This too is needed for semirings only.*} |
51 axclass axclass_0_neq_1 \<subseteq> zero, one |
116 |
52 zero_neq_one [simp]: "0 \<noteq> 1" |
117 axclass ordered_ring \<subseteq> almost_ordered_semiring, ring |
53 |
118 abs_if: "\<bar>a\<bar> = (if a < 0 then -a else a)" |
54 axclass semiring_1 \<subseteq> axclass_0_neq_1, semiring_0, monoid_mult |
119 |
55 |
120 axclass field \<subseteq> ring, inverse |
56 axclass comm_semiring_1 \<subseteq> axclass_0_neq_1, comm_semiring_0, comm_monoid_mult (* previously almost_semiring *) |
|
57 |
|
58 instance comm_semiring_1 \<subseteq> semiring_1 .. |
|
59 |
|
60 axclass axclass_no_zero_divisors \<subseteq> zero, times |
|
61 no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0" |
|
62 |
|
63 axclass comm_semiring_1_cancel \<subseteq> comm_semiring_1, cancel_ab_semigroup_add (* previously semiring *) |
|
64 |
|
65 axclass ring \<subseteq> semiring, ab_group_add |
|
66 |
|
67 instance ring \<subseteq> semiring_0 .. |
|
68 |
|
69 axclass comm_ring \<subseteq> comm_semiring_0, ab_group_add |
|
70 |
|
71 instance comm_ring \<subseteq> ring .. |
|
72 |
|
73 instance comm_ring \<subseteq> comm_semiring_0 .. |
|
74 |
|
75 axclass ring_1 \<subseteq> ring, semiring_1 |
|
76 |
|
77 axclass comm_ring_1 \<subseteq> comm_ring, comm_semiring_1 (* previously ring *) |
|
78 |
|
79 instance comm_ring_1 \<subseteq> ring_1 .. |
|
80 |
|
81 instance comm_ring_1 \<subseteq> comm_semiring_1_cancel .. |
|
82 |
|
83 axclass idom \<subseteq> comm_ring_1, axclass_no_zero_divisors |
|
84 |
|
85 axclass field \<subseteq> comm_ring_1, inverse |
121 left_inverse [simp]: "a \<noteq> 0 ==> inverse a * a = 1" |
86 left_inverse [simp]: "a \<noteq> 0 ==> inverse a * a = 1" |
122 divide_inverse: "a / b = a * inverse b" |
87 divide_inverse: "a / b = a * inverse b" |
123 |
88 |
124 axclass ordered_field \<subseteq> ordered_ring, field |
89 lemma mult_zero_left [simp]: "0 * a = (0::'a::{semiring_0, cancel_semigroup_add})" |
125 |
90 proof - |
|
91 have "0*a + 0*a = 0*a + 0" |
|
92 by (simp add: left_distrib [symmetric]) |
|
93 thus ?thesis |
|
94 by (simp only: add_left_cancel) |
|
95 qed |
|
96 |
|
97 lemma mult_zero_right [simp]: "a * 0 = (0::'a::{semiring_0, cancel_semigroup_add})" |
|
98 proof - |
|
99 have "a*0 + a*0 = a*0 + 0" |
|
100 by (simp add: right_distrib [symmetric]) |
|
101 thus ?thesis |
|
102 by (simp only: add_left_cancel) |
|
103 qed |
|
104 |
|
105 lemma field_mult_eq_0_iff [simp]: "(a*b = (0::'a::field)) = (a = 0 | b = 0)" |
|
106 proof cases |
|
107 assume "a=0" thus ?thesis by simp |
|
108 next |
|
109 assume anz [simp]: "a\<noteq>0" |
|
110 { assume "a * b = 0" |
|
111 hence "inverse a * (a * b) = 0" by simp |
|
112 hence "b = 0" by (simp (no_asm_use) add: mult_assoc [symmetric])} |
|
113 thus ?thesis by force |
|
114 qed |
|
115 |
|
116 instance field \<subseteq> idom |
|
117 by (intro_classes, simp) |
|
118 |
126 axclass division_by_zero \<subseteq> zero, inverse |
119 axclass division_by_zero \<subseteq> zero, inverse |
127 inverse_zero [simp]: "inverse 0 = 0" |
120 inverse_zero [simp]: "inverse 0 = 0" |
128 |
121 |
129 |
|
130 subsection {* Derived Rules for Addition *} |
|
131 |
|
132 lemma add_0_right [simp]: "a + 0 = (a::'a::plus_ac0)" |
|
133 proof - |
|
134 have "a + 0 = 0 + a" by (rule plus_ac0.commute) |
|
135 also have "... = a" by simp |
|
136 finally show ?thesis . |
|
137 qed |
|
138 |
|
139 lemma add_left_commute: "a + (b + c) = b + (a + (c::'a::plus_ac0))" |
|
140 by (rule mk_left_commute [of "op +", OF plus_ac0.assoc plus_ac0.commute]) |
|
141 |
|
142 theorems add_ac = add_assoc add_commute add_left_commute |
|
143 |
|
144 lemma right_minus [simp]: "a + -(a::'a::abelian_group) = 0" |
|
145 proof - |
|
146 have "a + -a = -a + a" by (simp add: add_ac) |
|
147 also have "... = 0" by simp |
|
148 finally show ?thesis . |
|
149 qed |
|
150 |
|
151 lemma right_minus_eq: "(a - b = 0) = (a = (b::'a::abelian_group))" |
|
152 proof |
|
153 have "a = a - b + b" by (simp add: diff_minus add_ac) |
|
154 also assume "a - b = 0" |
|
155 finally show "a = b" by simp |
|
156 next |
|
157 assume "a = b" |
|
158 thus "a - b = 0" by (simp add: diff_minus) |
|
159 qed |
|
160 |
|
161 lemma add_left_cancel [simp]: |
|
162 "(a + b = a + c) = (b = (c::'a::semiring))" |
|
163 by (blast dest: add_left_imp_eq) |
|
164 |
|
165 lemma add_right_cancel [simp]: |
|
166 "(b + a = c + a) = (b = (c::'a::semiring))" |
|
167 by (simp add: add_commute) |
|
168 |
|
169 lemma minus_minus [simp]: "- (- (a::'a::abelian_group)) = a" |
|
170 apply (rule right_minus_eq [THEN iffD1]) |
|
171 apply (simp add: diff_minus) |
|
172 done |
|
173 |
|
174 lemma equals_zero_I: "a+b = 0 ==> -a = (b::'a::abelian_group)" |
|
175 apply (rule right_minus_eq [THEN iffD1, symmetric]) |
|
176 apply (simp add: diff_minus add_commute) |
|
177 done |
|
178 |
|
179 lemma minus_zero [simp]: "- 0 = (0::'a::abelian_group)" |
|
180 by (simp add: equals_zero_I) |
|
181 |
|
182 lemma diff_self [simp]: "a - (a::'a::abelian_group) = 0" |
|
183 by (simp add: diff_minus) |
|
184 |
|
185 lemma diff_0 [simp]: "(0::'a::abelian_group) - a = -a" |
|
186 by (simp add: diff_minus) |
|
187 |
|
188 lemma diff_0_right [simp]: "a - (0::'a::abelian_group) = a" |
|
189 by (simp add: diff_minus) |
|
190 |
|
191 lemma diff_minus_eq_add [simp]: "a - - b = a + (b::'a::abelian_group)" |
|
192 by (simp add: diff_minus) |
|
193 |
|
194 lemma neg_equal_iff_equal [simp]: "(-a = -b) = (a = (b::'a::abelian_group))" |
|
195 proof |
|
196 assume "- a = - b" |
|
197 hence "- (- a) = - (- b)" |
|
198 by simp |
|
199 thus "a=b" by simp |
|
200 next |
|
201 assume "a=b" |
|
202 thus "-a = -b" by simp |
|
203 qed |
|
204 |
|
205 lemma neg_equal_0_iff_equal [simp]: "(-a = 0) = (a = (0::'a::abelian_group))" |
|
206 by (subst neg_equal_iff_equal [symmetric], simp) |
|
207 |
|
208 lemma neg_0_equal_iff_equal [simp]: "(0 = -a) = (0 = (a::'a::abelian_group))" |
|
209 by (subst neg_equal_iff_equal [symmetric], simp) |
|
210 |
|
211 lemma add_minus_self [simp]: "a + b - b = (a::'a::abelian_group)"; |
|
212 by (simp add: diff_minus add_assoc) |
|
213 |
|
214 lemma add_minus_self_left [simp]: "a + (b - a) = (b::'a::abelian_group)"; |
|
215 by (simp add: diff_minus add_left_commute [of a]) |
|
216 |
|
217 lemma add_minus_self_right [simp]: "a + b - a = (b::'a::abelian_group)"; |
|
218 by (simp add: diff_minus add_left_commute [of a] add_assoc) |
|
219 |
|
220 lemma minus_add_self [simp]: "a - b + b = (a::'a::abelian_group)"; |
|
221 by (simp add: diff_minus add_assoc) |
|
222 |
|
223 text{*The next two equations can make the simplifier loop!*} |
|
224 |
|
225 lemma equation_minus_iff: "(a = - b) = (b = - (a::'a::abelian_group))" |
|
226 proof - |
|
227 have "(- (-a) = - b) = (- a = b)" by (rule neg_equal_iff_equal) |
|
228 thus ?thesis by (simp add: eq_commute) |
|
229 qed |
|
230 |
|
231 lemma minus_equation_iff: "(- a = b) = (- (b::'a::abelian_group) = a)" |
|
232 proof - |
|
233 have "(- a = - (-b)) = (a = -b)" by (rule neg_equal_iff_equal) |
|
234 thus ?thesis by (simp add: eq_commute) |
|
235 qed |
|
236 |
|
237 |
|
238 subsection {* Derived rules for multiplication *} |
|
239 |
|
240 lemma mult_1_right [simp]: "a * (1::'a::almost_semiring) = a" |
|
241 proof - |
|
242 have "a * 1 = 1 * a" by (simp add: mult_commute) |
|
243 also have "... = a" by simp |
|
244 finally show ?thesis . |
|
245 qed |
|
246 |
|
247 lemma mult_left_commute: "a * (b * c) = b * (a * (c::'a::almost_semiring))" |
|
248 by (rule mk_left_commute [of "op *", OF mult_assoc mult_commute]) |
|
249 |
|
250 theorems mult_ac = mult_assoc mult_commute mult_left_commute |
|
251 |
|
252 lemma mult_zero_left [simp]: "0 * a = (0::'a::semiring)" |
|
253 proof - |
|
254 have "0*a + 0*a = 0*a + 0" |
|
255 by (simp add: left_distrib [symmetric]) |
|
256 thus ?thesis by (simp only: add_left_cancel) |
|
257 qed |
|
258 |
|
259 lemma mult_zero_right [simp]: "a * 0 = (0::'a::semiring)" |
|
260 by (simp add: mult_commute) |
|
261 |
|
262 |
|
263 subsection {* Distribution rules *} |
122 subsection {* Distribution rules *} |
264 |
|
265 lemma right_distrib: "a * (b + c) = a * b + a * (c::'a::almost_semiring)" |
|
266 proof - |
|
267 have "a * (b + c) = (b + c) * a" by (simp add: mult_ac) |
|
268 also have "... = b * a + c * a" by (simp only: left_distrib) |
|
269 also have "... = a * b + a * c" by (simp add: mult_ac) |
|
270 finally show ?thesis . |
|
271 qed |
|
272 |
123 |
273 theorems ring_distrib = right_distrib left_distrib |
124 theorems ring_distrib = right_distrib left_distrib |
274 |
125 |
275 text{*For the @{text combine_numerals} simproc*} |
126 text{*For the @{text combine_numerals} simproc*} |
276 lemma combine_common_factor: |
127 lemma combine_common_factor: |
277 "a*e + (b*e + c) = (a+b)*e + (c::'a::almost_semiring)" |
128 "a*e + (b*e + c) = (a+b)*e + (c::'a::semiring)" |
278 by (simp add: left_distrib add_ac) |
129 by (simp add: left_distrib add_ac) |
279 |
|
280 lemma minus_add_distrib [simp]: "- (a + b) = -a + -(b::'a::abelian_group)" |
|
281 apply (rule equals_zero_I) |
|
282 apply (simp add: plus_ac0) |
|
283 done |
|
284 |
130 |
285 lemma minus_mult_left: "- (a * b) = (-a) * (b::'a::ring)" |
131 lemma minus_mult_left: "- (a * b) = (-a) * (b::'a::ring)" |
286 apply (rule equals_zero_I) |
132 apply (rule equals_zero_I) |
287 apply (simp add: left_distrib [symmetric]) |
133 apply (simp add: left_distrib [symmetric]) |
288 done |
134 done |
301 lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)" |
147 lemma right_diff_distrib: "a * (b - c) = a * b - a * (c::'a::ring)" |
302 by (simp add: right_distrib diff_minus |
148 by (simp add: right_distrib diff_minus |
303 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
149 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
304 |
150 |
305 lemma left_diff_distrib: "(a - b) * c = a * c - b * (c::'a::ring)" |
151 lemma left_diff_distrib: "(a - b) * c = a * c - b * (c::'a::ring)" |
306 by (simp add: mult_commute [of _ c] right_diff_distrib) |
152 by (simp add: left_distrib diff_minus |
307 |
153 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
308 lemma minus_diff_eq [simp]: "- (a - b) = b - (a::'a::ring)" |
154 |
309 by (simp add: diff_minus add_commute) |
155 axclass pordered_semiring \<subseteq> semiring_0, pordered_ab_semigroup_add |
310 |
156 mult_left_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b" |
311 |
157 mult_right_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> a * c <= b * c" |
312 subsection {* Ordering Rules for Addition *} |
158 |
313 |
159 axclass pordered_cancel_semiring \<subseteq> pordered_semiring, cancel_ab_semigroup_add |
314 lemma add_right_mono: "a \<le> (b::'a::almost_ordered_semiring) ==> a + c \<le> b + c" |
160 |
315 by (simp add: add_commute [of _ c] add_left_mono) |
161 axclass ordered_semiring_strict \<subseteq> semiring_0, ordered_cancel_ab_semigroup_add |
316 |
162 mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" |
317 text {* non-strict, in both arguments *} |
163 mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c" |
318 lemma add_mono: |
164 |
319 "[|a \<le> b; c \<le> d|] ==> a + c \<le> b + (d::'a::almost_ordered_semiring)" |
165 instance ordered_semiring_strict \<subseteq> pordered_cancel_semiring |
320 apply (erule add_right_mono [THEN order_trans]) |
166 apply intro_classes |
321 apply (simp add: add_commute add_left_mono) |
167 apply (case_tac "a < b & 0 < c") |
322 done |
168 apply (auto simp add: mult_strict_left_mono order_less_le) |
323 |
169 apply (auto simp add: mult_strict_left_mono order_le_less) |
324 lemma add_strict_left_mono: |
170 apply (simp add: mult_strict_right_mono) |
325 "a < b ==> c + a < c + (b::'a::almost_ordered_semiring)" |
171 done |
326 by (simp add: order_less_le add_left_mono) |
172 |
327 |
173 axclass pordered_comm_semiring \<subseteq> comm_semiring_0, pordered_ab_semigroup_add |
328 lemma add_strict_right_mono: |
174 mult_mono: "a <= b \<Longrightarrow> 0 <= c \<Longrightarrow> c * a <= c * b" |
329 "a < b ==> a + c < b + (c::'a::almost_ordered_semiring)" |
175 |
330 by (simp add: add_commute [of _ c] add_strict_left_mono) |
176 axclass pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring, cancel_ab_semigroup_add |
331 |
177 |
332 text{*Strict monotonicity in both arguments*} |
178 instance pordered_cancel_comm_semiring \<subseteq> pordered_comm_semiring .. |
333 lemma add_strict_mono: "[|a<b; c<d|] ==> a + c < b + (d::'a::almost_ordered_semiring)" |
179 |
334 apply (erule add_strict_right_mono [THEN order_less_trans]) |
180 axclass ordered_comm_semiring_strict \<subseteq> comm_semiring_0, ordered_cancel_ab_semigroup_add |
335 apply (erule add_strict_left_mono) |
181 mult_strict_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b" |
336 done |
182 |
337 |
183 instance pordered_comm_semiring \<subseteq> pordered_semiring |
338 lemma add_less_le_mono: |
184 by (intro_classes, insert mult_mono, simp_all add: mult_commute, blast+) |
339 "[| a<b; c\<le>d |] ==> a + c < b + (d::'a::almost_ordered_semiring)" |
185 |
340 apply (erule add_strict_right_mono [THEN order_less_le_trans]) |
186 instance pordered_cancel_comm_semiring \<subseteq> pordered_cancel_semiring .. |
341 apply (erule add_left_mono) |
187 |
342 done |
188 instance ordered_comm_semiring_strict \<subseteq> ordered_semiring_strict |
343 |
189 by (intro_classes, insert mult_strict_mono, simp_all add: mult_commute, blast+) |
344 lemma add_le_less_mono: |
190 |
345 "[| a\<le>b; c<d |] ==> a + c < b + (d::'a::almost_ordered_semiring)" |
191 instance ordered_comm_semiring_strict \<subseteq> pordered_cancel_comm_semiring |
346 apply (erule add_right_mono [THEN order_le_less_trans]) |
192 apply (intro_classes) |
347 apply (erule add_strict_left_mono) |
193 apply (case_tac "a < b & 0 < c") |
348 done |
194 apply (auto simp add: mult_strict_left_mono order_less_le) |
349 |
195 apply (auto simp add: mult_strict_left_mono order_le_less) |
350 lemma add_less_imp_less_left: |
196 done |
351 assumes less: "c + a < c + b" shows "a < (b::'a::almost_ordered_semiring)" |
197 |
352 proof (rule ccontr) |
198 axclass pordered_ring \<subseteq> ring, pordered_semiring |
353 assume "~ a < b" |
199 |
354 hence "b \<le> a" by (simp add: linorder_not_less) |
200 instance pordered_ring \<subseteq> pordered_ab_group_add .. |
355 hence "c+b \<le> c+a" by (rule add_left_mono) |
201 |
356 with this and less show False |
202 instance pordered_ring \<subseteq> pordered_cancel_semiring .. |
357 by (simp add: linorder_not_less [symmetric]) |
203 |
358 qed |
204 axclass lordered_ring \<subseteq> pordered_ring, lordered_ab_group_abs |
359 |
205 |
360 lemma add_less_imp_less_right: |
206 axclass axclass_abs_if \<subseteq> minus, ord, zero |
361 "a + c < b + c ==> a < (b::'a::almost_ordered_semiring)" |
207 abs_if: "abs a = (if (a < 0) then (-a) else a)" |
362 apply (rule add_less_imp_less_left [of c]) |
208 |
363 apply (simp add: add_commute) |
209 axclass ordered_ring_strict \<subseteq> ring, ordered_semiring_strict, axclass_abs_if |
364 done |
210 |
365 |
211 instance ordered_ring_strict \<subseteq> lordered_ab_group .. |
366 lemma add_less_cancel_left [simp]: |
212 |
367 "(c+a < c+b) = (a < (b::'a::almost_ordered_semiring))" |
213 instance ordered_ring_strict \<subseteq> lordered_ring |
368 by (blast intro: add_less_imp_less_left add_strict_left_mono) |
214 by (intro_classes, simp add: abs_if join_eq_if) |
369 |
215 |
370 lemma add_less_cancel_right [simp]: |
216 axclass pordered_comm_ring \<subseteq> comm_ring, pordered_comm_semiring |
371 "(a+c < b+c) = (a < (b::'a::almost_ordered_semiring))" |
217 |
372 by (blast intro: add_less_imp_less_right add_strict_right_mono) |
218 axclass ordered_semidom \<subseteq> comm_semiring_1_cancel, ordered_comm_semiring_strict (* previously ordered_semiring *) |
373 |
219 zero_less_one [simp]: "0 < 1" |
374 lemma add_le_cancel_left [simp]: |
220 |
375 "(c+a \<le> c+b) = (a \<le> (b::'a::almost_ordered_semiring))" |
221 axclass ordered_idom \<subseteq> comm_ring_1, ordered_comm_semiring_strict, axclass_abs_if (* previously ordered_ring *) |
376 by (simp add: linorder_not_less [symmetric]) |
222 |
377 |
223 instance ordered_idom \<subseteq> ordered_ring_strict .. |
378 lemma add_le_cancel_right [simp]: |
224 |
379 "(a+c \<le> b+c) = (a \<le> (b::'a::almost_ordered_semiring))" |
225 axclass ordered_field \<subseteq> field, ordered_idom |
380 by (simp add: linorder_not_less [symmetric]) |
|
381 |
|
382 lemma add_le_imp_le_left: |
|
383 "c + a \<le> c + b ==> a \<le> (b::'a::almost_ordered_semiring)" |
|
384 by simp |
|
385 |
|
386 lemma add_le_imp_le_right: |
|
387 "a + c \<le> b + c ==> a \<le> (b::'a::almost_ordered_semiring)" |
|
388 by simp |
|
389 |
|
390 lemma add_increasing: "[|0\<le>a; b\<le>c|] ==> b \<le> a + (c::'a::almost_ordered_semiring)" |
|
391 by (insert add_mono [of 0 a b c], simp) |
|
392 |
|
393 |
|
394 subsection {* Ordering Rules for Unary Minus *} |
|
395 |
|
396 lemma le_imp_neg_le: |
|
397 assumes "a \<le> (b::'a::ordered_ring)" shows "-b \<le> -a" |
|
398 proof - |
|
399 have "-a+a \<le> -a+b" |
|
400 by (rule add_left_mono) |
|
401 hence "0 \<le> -a+b" |
|
402 by simp |
|
403 hence "0 + (-b) \<le> (-a + b) + (-b)" |
|
404 by (rule add_right_mono) |
|
405 thus ?thesis |
|
406 by (simp add: add_assoc) |
|
407 qed |
|
408 |
|
409 lemma neg_le_iff_le [simp]: "(-b \<le> -a) = (a \<le> (b::'a::ordered_ring))" |
|
410 proof |
|
411 assume "- b \<le> - a" |
|
412 hence "- (- a) \<le> - (- b)" |
|
413 by (rule le_imp_neg_le) |
|
414 thus "a\<le>b" by simp |
|
415 next |
|
416 assume "a\<le>b" |
|
417 thus "-b \<le> -a" by (rule le_imp_neg_le) |
|
418 qed |
|
419 |
|
420 lemma neg_le_0_iff_le [simp]: "(-a \<le> 0) = (0 \<le> (a::'a::ordered_ring))" |
|
421 by (subst neg_le_iff_le [symmetric], simp) |
|
422 |
|
423 lemma neg_0_le_iff_le [simp]: "(0 \<le> -a) = (a \<le> (0::'a::ordered_ring))" |
|
424 by (subst neg_le_iff_le [symmetric], simp) |
|
425 |
|
426 lemma neg_less_iff_less [simp]: "(-b < -a) = (a < (b::'a::ordered_ring))" |
|
427 by (force simp add: order_less_le) |
|
428 |
|
429 lemma neg_less_0_iff_less [simp]: "(-a < 0) = (0 < (a::'a::ordered_ring))" |
|
430 by (subst neg_less_iff_less [symmetric], simp) |
|
431 |
|
432 lemma neg_0_less_iff_less [simp]: "(0 < -a) = (a < (0::'a::ordered_ring))" |
|
433 by (subst neg_less_iff_less [symmetric], simp) |
|
434 |
|
435 text{*The next several equations can make the simplifier loop!*} |
|
436 |
|
437 lemma less_minus_iff: "(a < - b) = (b < - (a::'a::ordered_ring))" |
|
438 proof - |
|
439 have "(- (-a) < - b) = (b < - a)" by (rule neg_less_iff_less) |
|
440 thus ?thesis by simp |
|
441 qed |
|
442 |
|
443 lemma minus_less_iff: "(- a < b) = (- b < (a::'a::ordered_ring))" |
|
444 proof - |
|
445 have "(- a < - (-b)) = (- b < a)" by (rule neg_less_iff_less) |
|
446 thus ?thesis by simp |
|
447 qed |
|
448 |
|
449 lemma le_minus_iff: "(a \<le> - b) = (b \<le> - (a::'a::ordered_ring))" |
|
450 apply (simp add: linorder_not_less [symmetric]) |
|
451 apply (rule minus_less_iff) |
|
452 done |
|
453 |
|
454 lemma minus_le_iff: "(- a \<le> b) = (- b \<le> (a::'a::ordered_ring))" |
|
455 apply (simp add: linorder_not_less [symmetric]) |
|
456 apply (rule less_minus_iff) |
|
457 done |
|
458 |
|
459 |
|
460 subsection{*Subtraction Laws*} |
|
461 |
|
462 lemma add_diff_eq: "a + (b - c) = (a + b) - (c::'a::abelian_group)" |
|
463 by (simp add: diff_minus plus_ac0) |
|
464 |
|
465 lemma diff_add_eq: "(a - b) + c = (a + c) - (b::'a::abelian_group)" |
|
466 by (simp add: diff_minus plus_ac0) |
|
467 |
|
468 lemma diff_eq_eq: "(a-b = c) = (a = c + (b::'a::abelian_group))" |
|
469 by (auto simp add: diff_minus add_assoc) |
|
470 |
|
471 lemma eq_diff_eq: "(a = c-b) = (a + (b::'a::abelian_group) = c)" |
|
472 by (auto simp add: diff_minus add_assoc) |
|
473 |
|
474 lemma diff_diff_eq: "(a - b) - c = a - (b + (c::'a::abelian_group))" |
|
475 by (simp add: diff_minus plus_ac0) |
|
476 |
|
477 lemma diff_diff_eq2: "a - (b - c) = (a + c) - (b::'a::abelian_group)" |
|
478 by (simp add: diff_minus plus_ac0) |
|
479 |
|
480 text{*Further subtraction laws for ordered rings*} |
|
481 |
|
482 lemma less_iff_diff_less_0: "(a < b) = (a - b < (0::'a::ordered_ring))" |
|
483 proof - |
|
484 have "(a < b) = (a + (- b) < b + (-b))" |
|
485 by (simp only: add_less_cancel_right) |
|
486 also have "... = (a - b < 0)" by (simp add: diff_minus) |
|
487 finally show ?thesis . |
|
488 qed |
|
489 |
|
490 lemma diff_less_eq: "(a-b < c) = (a < c + (b::'a::ordered_ring))" |
|
491 apply (subst less_iff_diff_less_0) |
|
492 apply (rule less_iff_diff_less_0 [of _ c, THEN ssubst]) |
|
493 apply (simp add: diff_minus add_ac) |
|
494 done |
|
495 |
|
496 lemma less_diff_eq: "(a < c-b) = (a + (b::'a::ordered_ring) < c)" |
|
497 apply (subst less_iff_diff_less_0) |
|
498 apply (rule less_iff_diff_less_0 [of _ "c-b", THEN ssubst]) |
|
499 apply (simp add: diff_minus add_ac) |
|
500 done |
|
501 |
|
502 lemma diff_le_eq: "(a-b \<le> c) = (a \<le> c + (b::'a::ordered_ring))" |
|
503 by (simp add: linorder_not_less [symmetric] less_diff_eq) |
|
504 |
|
505 lemma le_diff_eq: "(a \<le> c-b) = (a + (b::'a::ordered_ring) \<le> c)" |
|
506 by (simp add: linorder_not_less [symmetric] diff_less_eq) |
|
507 |
|
508 text{*This list of rewrites simplifies (in)equalities by bringing subtractions |
|
509 to the top and then moving negative terms to the other side. |
|
510 Use with @{text add_ac}*} |
|
511 lemmas compare_rls = |
|
512 diff_minus [symmetric] |
|
513 add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2 |
|
514 diff_less_eq less_diff_eq diff_le_eq le_diff_eq |
|
515 diff_eq_eq eq_diff_eq |
|
516 |
|
517 text{*This list of rewrites decides ring equalities by ordered rewriting.*} |
|
518 lemmas ring_eq_simps = |
|
519 times_ac1.assoc times_ac1.commute times_ac1_left_commute |
|
520 left_distrib right_distrib left_diff_distrib right_diff_distrib |
|
521 plus_ac0.assoc plus_ac0.commute plus_ac0_left_commute |
|
522 add_diff_eq diff_add_eq diff_diff_eq diff_diff_eq2 |
|
523 diff_eq_eq eq_diff_eq |
|
524 |
|
525 subsection{*Lemmas for the @{text cancel_numerals} simproc*} |
|
526 |
|
527 lemma eq_iff_diff_eq_0: "(a = b) = (a-b = (0::'a::abelian_group))" |
|
528 by (simp add: compare_rls) |
|
529 |
|
530 lemma le_iff_diff_le_0: "(a \<le> b) = (a-b \<le> (0::'a::ordered_ring))" |
|
531 by (simp add: compare_rls) |
|
532 |
226 |
533 lemma eq_add_iff1: |
227 lemma eq_add_iff1: |
534 "(a*e + c = b*e + d) = ((a-b)*e + c = (d::'a::ring))" |
228 "(a*e + c = b*e + d) = ((a-b)*e + c = (d::'a::ring))" |
|
229 apply (simp add: diff_minus left_distrib) |
535 apply (simp add: diff_minus left_distrib add_ac) |
230 apply (simp add: diff_minus left_distrib add_ac) |
536 apply (simp add: compare_rls minus_mult_left [symmetric]) |
231 apply (simp add: compare_rls minus_mult_left [symmetric]) |
537 done |
232 done |
538 |
233 |
539 lemma eq_add_iff2: |
234 lemma eq_add_iff2: |
540 "(a*e + c = b*e + d) = (c = (b-a)*e + (d::'a::ring))" |
235 "(a*e + c = b*e + d) = (c = (b-a)*e + (d::'a::ring))" |
541 apply (simp add: diff_minus left_distrib add_ac) |
236 apply (simp add: diff_minus left_distrib add_ac) |
542 apply (simp add: compare_rls minus_mult_left [symmetric]) |
237 apply (simp add: compare_rls minus_mult_left [symmetric]) |
543 done |
238 done |
544 |
239 |
545 lemma less_add_iff1: |
240 lemma less_add_iff1: |
546 "(a*e + c < b*e + d) = ((a-b)*e + c < (d::'a::ordered_ring))" |
241 "(a*e + c < b*e + d) = ((a-b)*e + c < (d::'a::pordered_ring))" |
547 apply (simp add: diff_minus left_distrib add_ac) |
242 apply (simp add: diff_minus left_distrib add_ac) |
548 apply (simp add: compare_rls minus_mult_left [symmetric]) |
243 apply (simp add: compare_rls minus_mult_left [symmetric]) |
549 done |
244 done |
550 |
245 |
551 lemma less_add_iff2: |
246 lemma less_add_iff2: |
552 "(a*e + c < b*e + d) = (c < (b-a)*e + (d::'a::ordered_ring))" |
247 "(a*e + c < b*e + d) = (c < (b-a)*e + (d::'a::pordered_ring))" |
553 apply (simp add: diff_minus left_distrib add_ac) |
248 apply (simp add: diff_minus left_distrib add_ac) |
554 apply (simp add: compare_rls minus_mult_left [symmetric]) |
249 apply (simp add: compare_rls minus_mult_left [symmetric]) |
555 done |
250 done |
556 |
251 |
557 lemma le_add_iff1: |
252 lemma le_add_iff1: |
558 "(a*e + c \<le> b*e + d) = ((a-b)*e + c \<le> (d::'a::ordered_ring))" |
253 "(a*e + c \<le> b*e + d) = ((a-b)*e + c \<le> (d::'a::pordered_ring))" |
559 apply (simp add: diff_minus left_distrib add_ac) |
254 apply (simp add: diff_minus left_distrib add_ac) |
560 apply (simp add: compare_rls minus_mult_left [symmetric]) |
255 apply (simp add: compare_rls minus_mult_left [symmetric]) |
561 done |
256 done |
562 |
257 |
563 lemma le_add_iff2: |
258 lemma le_add_iff2: |
564 "(a*e + c \<le> b*e + d) = (c \<le> (b-a)*e + (d::'a::ordered_ring))" |
259 "(a*e + c \<le> b*e + d) = (c \<le> (b-a)*e + (d::'a::pordered_ring))" |
565 apply (simp add: diff_minus left_distrib add_ac) |
260 apply (simp add: diff_minus left_distrib add_ac) |
566 apply (simp add: compare_rls minus_mult_left [symmetric]) |
261 apply (simp add: compare_rls minus_mult_left [symmetric]) |
567 done |
262 done |
568 |
263 |
569 |
|
570 subsection {* Ordering Rules for Multiplication *} |
264 subsection {* Ordering Rules for Multiplication *} |
571 |
265 |
572 lemma mult_strict_right_mono: |
|
573 "[|a < b; 0 < c|] ==> a * c < b * (c::'a::almost_ordered_semiring)" |
|
574 by (simp add: mult_commute [of _ c] mult_strict_left_mono) |
|
575 |
|
576 lemma mult_left_mono: |
|
577 "[|a \<le> b; 0 \<le> c|] ==> c * a \<le> c * (b::'a::almost_ordered_semiring)" |
|
578 apply (case_tac "c=0", simp) |
|
579 apply (force simp add: mult_strict_left_mono order_le_less) |
|
580 done |
|
581 |
|
582 lemma mult_right_mono: |
|
583 "[|a \<le> b; 0 \<le> c|] ==> a*c \<le> b * (c::'a::almost_ordered_semiring)" |
|
584 by (simp add: mult_left_mono mult_commute [of _ c]) |
|
585 |
|
586 lemma mult_left_le_imp_le: |
266 lemma mult_left_le_imp_le: |
587 "[|c*a \<le> c*b; 0 < c|] ==> a \<le> (b::'a::almost_ordered_semiring)" |
267 "[|c*a \<le> c*b; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)" |
588 by (force simp add: mult_strict_left_mono linorder_not_less [symmetric]) |
268 by (force simp add: mult_strict_left_mono linorder_not_less [symmetric]) |
589 |
269 |
590 lemma mult_right_le_imp_le: |
270 lemma mult_right_le_imp_le: |
591 "[|a*c \<le> b*c; 0 < c|] ==> a \<le> (b::'a::almost_ordered_semiring)" |
271 "[|a*c \<le> b*c; 0 < c|] ==> a \<le> (b::'a::ordered_semiring_strict)" |
592 by (force simp add: mult_strict_right_mono linorder_not_less [symmetric]) |
272 by (force simp add: mult_strict_right_mono linorder_not_less [symmetric]) |
593 |
273 |
594 lemma mult_left_less_imp_less: |
274 lemma mult_left_less_imp_less: |
595 "[|c*a < c*b; 0 \<le> c|] ==> a < (b::'a::almost_ordered_semiring)" |
275 "[|c*a < c*b; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)" |
596 by (force simp add: mult_left_mono linorder_not_le [symmetric]) |
276 by (force simp add: mult_left_mono linorder_not_le [symmetric]) |
597 |
277 |
598 lemma mult_right_less_imp_less: |
278 lemma mult_right_less_imp_less: |
599 "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::almost_ordered_semiring)" |
279 "[|a*c < b*c; 0 \<le> c|] ==> a < (b::'a::ordered_semiring_strict)" |
600 by (force simp add: mult_right_mono linorder_not_le [symmetric]) |
280 by (force simp add: mult_right_mono linorder_not_le [symmetric]) |
601 |
281 |
602 lemma mult_strict_left_mono_neg: |
282 lemma mult_strict_left_mono_neg: |
603 "[|b < a; c < 0|] ==> c * a < c * (b::'a::ordered_ring)" |
283 "[|b < a; c < 0|] ==> c * a < c * (b::'a::ordered_ring_strict)" |
604 apply (drule mult_strict_left_mono [of _ _ "-c"]) |
284 apply (drule mult_strict_left_mono [of _ _ "-c"]) |
605 apply (simp_all add: minus_mult_left [symmetric]) |
285 apply (simp_all add: minus_mult_left [symmetric]) |
606 done |
286 done |
607 |
287 |
|
288 lemma mult_left_mono_neg: |
|
289 "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::pordered_ring)" |
|
290 apply (drule mult_left_mono [of _ _ "-c"]) |
|
291 apply (simp_all add: minus_mult_left [symmetric]) |
|
292 done |
|
293 |
608 lemma mult_strict_right_mono_neg: |
294 lemma mult_strict_right_mono_neg: |
609 "[|b < a; c < 0|] ==> a * c < b * (c::'a::ordered_ring)" |
295 "[|b < a; c < 0|] ==> a * c < b * (c::'a::ordered_ring_strict)" |
610 apply (drule mult_strict_right_mono [of _ _ "-c"]) |
296 apply (drule mult_strict_right_mono [of _ _ "-c"]) |
611 apply (simp_all add: minus_mult_right [symmetric]) |
297 apply (simp_all add: minus_mult_right [symmetric]) |
612 done |
298 done |
613 |
299 |
|
300 lemma mult_right_mono_neg: |
|
301 "[|b \<le> a; c \<le> 0|] ==> a * c \<le> (b::'a::pordered_ring) * c" |
|
302 apply (drule mult_right_mono [of _ _ "-c"]) |
|
303 apply (simp) |
|
304 apply (simp_all add: minus_mult_right [symmetric]) |
|
305 done |
614 |
306 |
615 subsection{* Products of Signs *} |
307 subsection{* Products of Signs *} |
616 |
308 |
617 lemma mult_pos: "[| (0::'a::almost_ordered_semiring) < a; 0 < b |] ==> 0 < a*b" |
309 lemma mult_pos: "[| (0::'a::ordered_semiring_strict) < a; 0 < b |] ==> 0 < a*b" |
618 by (drule mult_strict_left_mono [of 0 b], auto) |
310 by (drule mult_strict_left_mono [of 0 b], auto) |
619 |
311 |
620 lemma mult_pos_neg: "[| (0::'a::almost_ordered_semiring) < a; b < 0 |] ==> a*b < 0" |
312 lemma mult_pos_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; 0 \<le> b |] ==> 0 \<le> a*b" |
|
313 by (drule mult_left_mono [of 0 b], auto) |
|
314 |
|
315 lemma mult_pos_neg: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> a*b < 0" |
621 by (drule mult_strict_left_mono [of b 0], auto) |
316 by (drule mult_strict_left_mono [of b 0], auto) |
622 |
317 |
623 lemma mult_neg: "[| a < (0::'a::ordered_ring); b < 0 |] ==> 0 < a*b" |
318 lemma mult_pos_neg_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> a*b \<le> 0" |
|
319 by (drule mult_left_mono [of b 0], auto) |
|
320 |
|
321 lemma mult_pos_neg2: "[| (0::'a::ordered_semiring_strict) < a; b < 0 |] ==> b*a < 0" |
|
322 by (drule mult_strict_right_mono[of b 0], auto) |
|
323 |
|
324 lemma mult_pos_neg2_le: "[| (0::'a::pordered_cancel_semiring) \<le> a; b \<le> 0 |] ==> b*a \<le> 0" |
|
325 by (drule mult_right_mono[of b 0], auto) |
|
326 |
|
327 lemma mult_neg: "[| a < (0::'a::ordered_ring_strict); b < 0 |] ==> 0 < a*b" |
624 by (drule mult_strict_right_mono_neg, auto) |
328 by (drule mult_strict_right_mono_neg, auto) |
625 |
329 |
|
330 lemma mult_neg_le: "[| a \<le> (0::'a::pordered_ring); b \<le> 0 |] ==> 0 \<le> a*b" |
|
331 by (drule mult_right_mono_neg[of a 0 b ], auto) |
|
332 |
626 lemma zero_less_mult_pos: |
333 lemma zero_less_mult_pos: |
627 "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::almost_ordered_semiring)" |
334 "[| 0 < a*b; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)" |
628 apply (case_tac "b\<le>0") |
335 apply (case_tac "b\<le>0") |
629 apply (auto simp add: order_le_less linorder_not_less) |
336 apply (auto simp add: order_le_less linorder_not_less) |
630 apply (drule_tac mult_pos_neg [of a b]) |
337 apply (drule_tac mult_pos_neg [of a b]) |
631 apply (auto dest: order_less_not_sym) |
338 apply (auto dest: order_less_not_sym) |
632 done |
339 done |
633 |
340 |
|
341 lemma zero_less_mult_pos2: |
|
342 "[| 0 < b*a; 0 < a|] ==> 0 < (b::'a::ordered_semiring_strict)" |
|
343 apply (case_tac "b\<le>0") |
|
344 apply (auto simp add: order_le_less linorder_not_less) |
|
345 apply (drule_tac mult_pos_neg2 [of a b]) |
|
346 apply (auto dest: order_less_not_sym) |
|
347 done |
|
348 |
634 lemma zero_less_mult_iff: |
349 lemma zero_less_mult_iff: |
635 "((0::'a::ordered_ring) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)" |
350 "((0::'a::ordered_ring_strict) < a*b) = (0 < a & 0 < b | a < 0 & b < 0)" |
636 apply (auto simp add: order_le_less linorder_not_less mult_pos mult_neg) |
351 apply (auto simp add: order_le_less linorder_not_less mult_pos mult_neg) |
637 apply (blast dest: zero_less_mult_pos) |
352 apply (blast dest: zero_less_mult_pos) |
638 apply (simp add: mult_commute [of a b]) |
353 apply (blast dest: zero_less_mult_pos2) |
639 apply (blast dest: zero_less_mult_pos) |
|
640 done |
354 done |
641 |
355 |
642 text{*A field has no "zero divisors", and this theorem holds without the |
356 text{*A field has no "zero divisors", and this theorem holds without the |
643 assumption of an ordering. See @{text field_mult_eq_0_iff} below.*} |
357 assumption of an ordering. See @{text field_mult_eq_0_iff} below.*} |
644 lemma mult_eq_0_iff [simp]: "(a*b = (0::'a::ordered_ring)) = (a = 0 | b = 0)" |
358 lemma mult_eq_0_iff [simp]: "(a*b = (0::'a::ordered_ring_strict)) = (a = 0 | b = 0)" |
645 apply (case_tac "a < 0") |
359 apply (case_tac "a < 0") |
646 apply (auto simp add: linorder_not_less order_le_less linorder_neq_iff) |
360 apply (auto simp add: linorder_not_less order_le_less linorder_neq_iff) |
647 apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono)+ |
361 apply (force dest: mult_strict_right_mono_neg mult_strict_right_mono)+ |
648 done |
362 done |
649 |
363 |
650 lemma zero_le_mult_iff: |
364 lemma zero_le_mult_iff: |
651 "((0::'a::ordered_ring) \<le> a*b) = (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)" |
365 "((0::'a::ordered_ring_strict) \<le> a*b) = (0 \<le> a & 0 \<le> b | a \<le> 0 & b \<le> 0)" |
652 by (auto simp add: eq_commute [of 0] order_le_less linorder_not_less |
366 by (auto simp add: eq_commute [of 0] order_le_less linorder_not_less |
653 zero_less_mult_iff) |
367 zero_less_mult_iff) |
654 |
368 |
655 lemma mult_less_0_iff: |
369 lemma mult_less_0_iff: |
656 "(a*b < (0::'a::ordered_ring)) = (0 < a & b < 0 | a < 0 & 0 < b)" |
370 "(a*b < (0::'a::ordered_ring_strict)) = (0 < a & b < 0 | a < 0 & 0 < b)" |
657 apply (insert zero_less_mult_iff [of "-a" b]) |
371 apply (insert zero_less_mult_iff [of "-a" b]) |
658 apply (force simp add: minus_mult_left[symmetric]) |
372 apply (force simp add: minus_mult_left[symmetric]) |
659 done |
373 done |
660 |
374 |
661 lemma mult_le_0_iff: |
375 lemma mult_le_0_iff: |
662 "(a*b \<le> (0::'a::ordered_ring)) = (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)" |
376 "(a*b \<le> (0::'a::ordered_ring_strict)) = (0 \<le> a & b \<le> 0 | a \<le> 0 & 0 \<le> b)" |
663 apply (insert zero_le_mult_iff [of "-a" b]) |
377 apply (insert zero_le_mult_iff [of "-a" b]) |
664 apply (force simp add: minus_mult_left[symmetric]) |
378 apply (force simp add: minus_mult_left[symmetric]) |
665 done |
379 done |
666 |
380 |
667 lemma zero_le_square: "(0::'a::ordered_ring) \<le> a*a" |
381 lemma split_mult_pos_le: "(0 \<le> a & 0 \<le> b) | (a \<le> 0 & b \<le> 0) \<Longrightarrow> 0 \<le> a * (b::_::pordered_ring)" |
|
382 by (auto simp add: mult_pos_le mult_neg_le) |
|
383 |
|
384 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)" |
|
385 by (auto simp add: mult_pos_neg_le mult_pos_neg2_le) |
|
386 |
|
387 lemma zero_le_square: "(0::'a::ordered_ring_strict) \<le> a*a" |
668 by (simp add: zero_le_mult_iff linorder_linear) |
388 by (simp add: zero_le_mult_iff linorder_linear) |
669 |
389 |
670 text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semiring} |
390 text{*Proving axiom @{text zero_less_one} makes all @{text ordered_semidom} |
671 theorems available to members of @{term ordered_ring} *} |
391 theorems available to members of @{term ordered_idom} *} |
672 instance ordered_ring \<subseteq> ordered_semiring |
392 |
|
393 instance ordered_idom \<subseteq> ordered_semidom |
673 proof |
394 proof |
674 have "(0::'a) \<le> 1*1" by (rule zero_le_square) |
395 have "(0::'a) \<le> 1*1" by (rule zero_le_square) |
675 thus "(0::'a) < 1" by (simp add: order_le_less) |
396 thus "(0::'a) < 1" by (simp add: order_le_less) |
676 qed |
397 qed |
677 |
398 |
|
399 instance ordered_ring_strict \<subseteq> axclass_no_zero_divisors |
|
400 by (intro_classes, simp) |
|
401 |
|
402 instance ordered_idom \<subseteq> idom .. |
|
403 |
678 text{*All three types of comparision involving 0 and 1 are covered.*} |
404 text{*All three types of comparision involving 0 and 1 are covered.*} |
679 |
405 |
680 declare zero_neq_one [THEN not_sym, simp] |
406 declare zero_neq_one [THEN not_sym, simp] |
681 |
407 |
682 lemma zero_le_one [simp]: "(0::'a::ordered_semiring) \<le> 1" |
408 lemma zero_le_one [simp]: "(0::'a::ordered_semidom) \<le> 1" |
683 by (rule zero_less_one [THEN order_less_imp_le]) |
409 by (rule zero_less_one [THEN order_less_imp_le]) |
684 |
410 |
685 lemma not_one_le_zero [simp]: "~ (1::'a::ordered_semiring) \<le> 0" |
411 lemma not_one_le_zero [simp]: "~ (1::'a::ordered_semidom) \<le> 0" |
686 by (simp add: linorder_not_le zero_less_one) |
412 by (simp add: linorder_not_le) |
687 |
413 |
688 lemma not_one_less_zero [simp]: "~ (1::'a::ordered_semiring) < 0" |
414 lemma not_one_less_zero [simp]: "~ (1::'a::ordered_semidom) < 0" |
689 by (simp add: linorder_not_less zero_le_one) |
415 by (simp add: linorder_not_less) |
690 |
|
691 |
416 |
692 subsection{*More Monotonicity*} |
417 subsection{*More Monotonicity*} |
693 |
418 |
694 lemma mult_left_mono_neg: |
419 lemma mult_left_mono_neg: |
695 "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::ordered_ring)" |
420 "[|b \<le> a; c \<le> 0|] ==> c * a \<le> c * (b::'a::pordered_ring)" |
696 apply (drule mult_left_mono [of _ _ "-c"]) |
421 apply (drule mult_left_mono [of _ _ "-c"]) |
697 apply (simp_all add: minus_mult_left [symmetric]) |
422 apply (simp_all add: minus_mult_left [symmetric]) |
698 done |
423 done |
699 |
424 |
700 lemma mult_right_mono_neg: |
425 lemma mult_right_mono_neg: |
701 "[|b \<le> a; c \<le> 0|] ==> a * c \<le> b * (c::'a::ordered_ring)" |
426 "[|b \<le> a; c \<le> 0|] ==> a * c \<le> b * (c::'a::pordered_ring)" |
702 by (simp add: mult_left_mono_neg mult_commute [of _ c]) |
427 apply (drule mult_right_mono [of _ _ "-c"]) |
|
428 apply (simp_all add: minus_mult_right [symmetric]) |
|
429 done |
703 |
430 |
704 text{*Strict monotonicity in both arguments*} |
431 text{*Strict monotonicity in both arguments*} |
705 lemma mult_strict_mono: |
432 lemma mult_strict_mono: |
706 "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring)" |
433 "[|a<b; c<d; 0<b; 0\<le>c|] ==> a * c < b * (d::'a::ordered_semiring_strict)" |
707 apply (case_tac "c=0") |
434 apply (case_tac "c=0") |
708 apply (simp add: mult_pos) |
435 apply (simp add: mult_pos) |
709 apply (erule mult_strict_right_mono [THEN order_less_trans]) |
436 apply (erule mult_strict_right_mono [THEN order_less_trans]) |
710 apply (force simp add: order_le_less) |
437 apply (force simp add: order_le_less) |
711 apply (erule mult_strict_left_mono, assumption) |
438 apply (erule mult_strict_left_mono, assumption) |
712 done |
439 done |
713 |
440 |
714 text{*This weaker variant has more natural premises*} |
441 text{*This weaker variant has more natural premises*} |
715 lemma mult_strict_mono': |
442 lemma mult_strict_mono': |
716 "[| a<b; c<d; 0 \<le> a; 0 \<le> c|] ==> a * c < b * (d::'a::ordered_semiring)" |
443 "[| a<b; c<d; 0 \<le> a; 0 \<le> c|] ==> a * c < b * (d::'a::ordered_semiring_strict)" |
717 apply (rule mult_strict_mono) |
444 apply (rule mult_strict_mono) |
718 apply (blast intro: order_le_less_trans)+ |
445 apply (blast intro: order_le_less_trans)+ |
719 done |
446 done |
720 |
447 |
721 lemma mult_mono: |
448 lemma mult_mono: |
722 "[|a \<le> b; c \<le> d; 0 \<le> b; 0 \<le> c|] |
449 "[|a \<le> b; c \<le> d; 0 \<le> b; 0 \<le> c|] |
723 ==> a * c \<le> b * (d::'a::ordered_semiring)" |
450 ==> a * c \<le> b * (d::'a::pordered_semiring)" |
724 apply (erule mult_right_mono [THEN order_trans], assumption) |
451 apply (erule mult_right_mono [THEN order_trans], assumption) |
725 apply (erule mult_left_mono, assumption) |
452 apply (erule mult_left_mono, assumption) |
726 done |
453 done |
727 |
454 |
728 lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semiring)" |
455 lemma less_1_mult: "[| 1 < m; 1 < n |] ==> 1 < m*(n::'a::ordered_semidom)" |
729 apply (insert mult_strict_mono [of 1 m 1 n]) |
456 apply (insert mult_strict_mono [of 1 m 1 n]) |
730 apply (simp add: order_less_trans [OF zero_less_one]) |
457 apply (simp add: order_less_trans [OF zero_less_one]) |
731 done |
458 done |
732 |
459 |
733 |
|
734 subsection{*Cancellation Laws for Relationships With a Common Factor*} |
460 subsection{*Cancellation Laws for Relationships With a Common Factor*} |
735 |
461 |
736 text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"}, |
462 text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"}, |
737 also with the relations @{text "\<le>"} and equality.*} |
463 also with the relations @{text "\<le>"} and equality.*} |
738 |
464 |
739 lemma mult_less_cancel_right: |
465 lemma mult_less_cancel_right: |
740 "(a*c < b*c) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring)))" |
466 "(a*c < b*c) = ((0 < c & a < b) | (c < 0 & b < (a::'a::ordered_ring_strict)))" |
741 apply (case_tac "c = 0") |
467 apply (case_tac "c = 0") |
742 apply (auto simp add: linorder_neq_iff mult_strict_right_mono |
468 apply (auto simp add: linorder_neq_iff mult_strict_right_mono |
743 mult_strict_right_mono_neg) |
469 mult_strict_right_mono_neg) |
744 apply (auto simp add: linorder_not_less |
470 apply (auto simp add: linorder_not_less |
745 linorder_not_le [symmetric, of "a*c"] |
471 linorder_not_le [symmetric, of "a*c"] |
1588 by (simp add: zero_less_two pos_divide_less_eq right_distrib) |
1341 by (simp add: zero_less_two pos_divide_less_eq right_distrib) |
1589 |
1342 |
1590 lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b" |
1343 lemma dense: "a < b ==> \<exists>r::'a::ordered_field. a < r & r < b" |
1591 by (blast intro!: less_half_sum gt_half_sum) |
1344 by (blast intro!: less_half_sum gt_half_sum) |
1592 |
1345 |
1593 |
|
1594 subsection {* Absolute Value *} |
1346 subsection {* Absolute Value *} |
1595 |
1347 |
1596 lemma abs_zero [simp]: "abs 0 = (0::'a::ordered_ring)" |
1348 lemma abs_one [simp]: "abs 1 = (1::'a::ordered_idom)" |
1597 by (simp add: abs_if) |
|
1598 |
|
1599 lemma abs_one [simp]: "abs 1 = (1::'a::ordered_ring)" |
|
1600 by (simp add: abs_if zero_less_one [THEN order_less_not_sym]) |
1349 by (simp add: abs_if zero_less_one [THEN order_less_not_sym]) |
1601 |
1350 |
1602 lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_ring)" |
1351 lemma abs_le_mult: "abs (a * b) \<le> (abs a) * (abs (b::'a::lordered_ring))" |
1603 apply (case_tac "a=0 | b=0", force) |
1352 proof - |
1604 apply (auto elim: order_less_asym |
1353 let ?x = "pprt a * pprt b - pprt a * nprt b - nprt a * pprt b + nprt a * nprt b" |
1605 simp add: abs_if mult_less_0_iff linorder_neq_iff |
1354 let ?y = "pprt a * pprt b + pprt a * nprt b + nprt a * pprt b + nprt a * nprt b" |
1606 minus_mult_left [symmetric] minus_mult_right [symmetric]) |
1355 have a: "(abs a) * (abs b) = ?x" |
1607 done |
1356 by (simp only: abs_prts[of a] abs_prts[of b] ring_eq_simps) |
1608 |
1357 { |
1609 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_ring)" |
1358 fix u v :: 'a |
|
1359 have bh: "\<lbrakk>u = a; v = b\<rbrakk> \<Longrightarrow> u * v = ?y" |
|
1360 apply (subst prts[of u], subst prts[of v]) |
|
1361 apply (simp add: left_distrib right_distrib add_ac) |
|
1362 done |
|
1363 } |
|
1364 note b = this[OF refl[of a] refl[of b]] |
|
1365 note addm = add_mono[of "0::'a" _ "0::'a", simplified] |
|
1366 note addm2 = add_mono[of _ "0::'a" _ "0::'a", simplified] |
|
1367 have xy: "- ?x <= ?y" |
|
1368 apply (simp add: compare_rls) |
|
1369 apply (rule add_le_imp_le_left[of "-(pprt a * nprt b + nprt a * pprt b)"]) |
|
1370 apply (simp add: add_ac) |
|
1371 proof - |
|
1372 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 + |
|
1373 (- (nprt a * pprt b) + - (pprt a * nprt b)))))))" |
|
1374 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)) |
|
1375 + pprt a * pprt b + pprt a * pprt b" |
|
1376 have a:"?r = ?rr" by (simp only: add_ac) |
|
1377 have "0 <= ?rr" |
|
1378 apply (simp) |
|
1379 apply (rule addm)+ |
|
1380 apply (simp_all add: mult_neg_le mult_pos_le) |
|
1381 done |
|
1382 with a show "0 <= ?r" by simp |
|
1383 qed |
|
1384 have yx: "?y <= ?x" |
|
1385 apply (simp add: add_ac) |
|
1386 apply (simp add: compare_rls) |
|
1387 apply (rule add_le_imp_le_right[of _ "-(pprt a * pprt b)"]) |
|
1388 apply (simp add: add_ac) |
|
1389 apply (rule addm2, (simp add: mult_pos_neg_le mult_pos_neg2_le)+)+ |
|
1390 done |
|
1391 have i1: "a*b <= abs a * abs b" by (simp only: a b yx) |
|
1392 have i2: "- (abs a * abs b) <= a*b" by (simp only: a b xy) |
|
1393 show ?thesis |
|
1394 apply (rule abs_leI) |
|
1395 apply (simp add: i1) |
|
1396 apply (simp add: i2[simplified minus_le_iff]) |
|
1397 done |
|
1398 qed |
|
1399 |
|
1400 lemma abs_eq_mult: |
|
1401 assumes "(0 \<le> a \<or> a \<le> 0) \<and> (0 \<le> b \<or> b \<le> 0)" |
|
1402 shows "abs (a*b) = abs a * abs (b::'a::lordered_ring)" |
|
1403 proof - |
|
1404 have s: "(0 <= a*b) | (a*b <= 0)" |
|
1405 apply (auto) |
|
1406 apply (rule_tac split_mult_pos_le) |
|
1407 apply (rule_tac contrapos_np[of "a*b <= 0"]) |
|
1408 apply (simp) |
|
1409 apply (rule_tac split_mult_neg_le) |
|
1410 apply (insert prems) |
|
1411 apply (blast) |
|
1412 done |
|
1413 have mulprts: "a * b = (pprt a + nprt a) * (pprt b + nprt b)" |
|
1414 by (simp add: prts[symmetric]) |
|
1415 show ?thesis |
|
1416 proof cases |
|
1417 assume "0 <= a * b" |
|
1418 then show ?thesis |
|
1419 apply (simp_all add: mulprts abs_prts) |
|
1420 apply (insert prems) |
|
1421 apply (auto simp add: ring_eq_simps iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt] |
|
1422 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]) |
|
1423 done |
|
1424 next |
|
1425 assume "~(0 <= a*b)" |
|
1426 with s have "a*b <= 0" by simp |
|
1427 then show ?thesis |
|
1428 apply (simp_all add: mulprts abs_prts) |
|
1429 apply (insert prems) |
|
1430 apply (auto simp add: ring_eq_simps iff2imp[OF zero_le_iff_zero_nprt] iff2imp[OF le_zero_iff_zero_pprt] |
|
1431 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]) |
|
1432 done |
|
1433 qed |
|
1434 qed |
|
1435 |
|
1436 lemma abs_mult: "abs (a * b) = abs a * abs (b::'a::ordered_idom)" |
|
1437 by (simp add: abs_eq_mult linorder_linear) |
|
1438 |
|
1439 lemma abs_mult_self: "abs a * abs a = a * (a::'a::ordered_idom)" |
1610 by (simp add: abs_if) |
1440 by (simp add: abs_if) |
1611 |
|
1612 lemma abs_eq_0 [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))" |
|
1613 by (simp add: abs_if) |
|
1614 |
|
1615 lemma zero_less_abs_iff [simp]: "(0 < abs a) = (a \<noteq> (0::'a::ordered_ring))" |
|
1616 by (simp add: abs_if linorder_neq_iff) |
|
1617 |
|
1618 lemma abs_not_less_zero [simp]: "~ abs a < (0::'a::ordered_ring)" |
|
1619 apply (simp add: abs_if) |
|
1620 by (simp add: abs_if order_less_not_sym [of a 0]) |
|
1621 |
|
1622 lemma abs_le_zero_iff [simp]: "(abs a \<le> (0::'a::ordered_ring)) = (a = 0)" |
|
1623 by (simp add: order_le_less) |
|
1624 |
|
1625 lemma abs_minus_cancel [simp]: "abs (-a) = abs(a::'a::ordered_ring)" |
|
1626 apply (auto simp add: abs_if linorder_not_less order_less_not_sym [of 0 a]) |
|
1627 apply (drule order_antisym, assumption, simp) |
|
1628 done |
|
1629 |
|
1630 lemma abs_ge_zero [simp]: "(0::'a::ordered_ring) \<le> abs a" |
|
1631 apply (simp add: abs_if order_less_imp_le) |
|
1632 apply (simp add: linorder_not_less) |
|
1633 done |
|
1634 |
|
1635 lemma abs_idempotent [simp]: "abs (abs a) = abs (a::'a::ordered_ring)" |
|
1636 by (force elim: order_less_asym simp add: abs_if) |
|
1637 |
|
1638 lemma abs_zero_iff [simp]: "(abs a = 0) = (a = (0::'a::ordered_ring))" |
|
1639 by (simp add: abs_if) |
|
1640 |
|
1641 lemma abs_ge_self: "a \<le> abs (a::'a::ordered_ring)" |
|
1642 apply (simp add: abs_if) |
|
1643 apply (simp add: order_less_imp_le order_trans [of _ 0]) |
|
1644 done |
|
1645 |
|
1646 lemma abs_ge_minus_self: "-a \<le> abs (a::'a::ordered_ring)" |
|
1647 by (insert abs_ge_self [of "-a"], simp) |
|
1648 |
1441 |
1649 lemma nonzero_abs_inverse: |
1442 lemma nonzero_abs_inverse: |
1650 "a \<noteq> 0 ==> abs (inverse (a::'a::ordered_field)) = inverse (abs a)" |
1443 "a \<noteq> 0 ==> abs (inverse (a::'a::ordered_field)) = inverse (abs a)" |
1651 apply (auto simp add: linorder_neq_iff abs_if nonzero_inverse_minus_eq |
1444 apply (auto simp add: linorder_neq_iff abs_if nonzero_inverse_minus_eq |
1652 negative_imp_inverse_negative) |
1445 negative_imp_inverse_negative) |
1668 "abs (a / (b::'a::{ordered_field,division_by_zero})) = abs a / abs b" |
1461 "abs (a / (b::'a::{ordered_field,division_by_zero})) = abs a / abs b" |
1669 apply (case_tac "b=0", simp) |
1462 apply (case_tac "b=0", simp) |
1670 apply (simp add: nonzero_abs_divide) |
1463 apply (simp add: nonzero_abs_divide) |
1671 done |
1464 done |
1672 |
1465 |
1673 lemma abs_leI: "[|a \<le> b; -a \<le> b|] ==> abs a \<le> (b::'a::ordered_ring)" |
|
1674 by (simp add: abs_if) |
|
1675 |
|
1676 lemma le_minus_self_iff: "(a \<le> -a) = (a \<le> (0::'a::ordered_ring))" |
|
1677 proof |
|
1678 assume ale: "a \<le> -a" |
|
1679 show "a\<le>0" |
|
1680 apply (rule classical) |
|
1681 apply (simp add: linorder_not_le) |
|
1682 apply (blast intro: ale order_trans order_less_imp_le |
|
1683 neg_0_le_iff_le [THEN iffD1]) |
|
1684 done |
|
1685 next |
|
1686 assume "a\<le>0" |
|
1687 hence "0 \<le> -a" by (simp only: neg_0_le_iff_le) |
|
1688 thus "a \<le> -a" by (blast intro: prems order_trans) |
|
1689 qed |
|
1690 |
|
1691 lemma minus_le_self_iff: "(-a \<le> a) = (0 \<le> (a::'a::ordered_ring))" |
|
1692 by (insert le_minus_self_iff [of "-a"], simp) |
|
1693 |
|
1694 lemma eq_minus_self_iff: "(a = -a) = (a = (0::'a::ordered_ring))" |
|
1695 by (force simp add: order_eq_iff le_minus_self_iff minus_le_self_iff) |
|
1696 |
|
1697 lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::ordered_ring))" |
|
1698 by (simp add: order_less_le le_minus_self_iff eq_minus_self_iff) |
|
1699 |
|
1700 lemma abs_le_D1: "abs a \<le> b ==> a \<le> (b::'a::ordered_ring)" |
|
1701 apply (simp add: abs_if split: split_if_asm) |
|
1702 apply (rule order_trans [of _ "-a"]) |
|
1703 apply (simp add: less_minus_self_iff order_less_imp_le, assumption) |
|
1704 done |
|
1705 |
|
1706 lemma abs_le_D2: "abs a \<le> b ==> -a \<le> (b::'a::ordered_ring)" |
|
1707 by (insert abs_le_D1 [of "-a"], simp) |
|
1708 |
|
1709 lemma abs_le_iff: "(abs a \<le> b) = (a \<le> b & -a \<le> (b::'a::ordered_ring))" |
|
1710 by (blast intro: abs_leI dest: abs_le_D1 abs_le_D2) |
|
1711 |
|
1712 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_ring))" |
|
1713 apply (simp add: order_less_le abs_le_iff) |
|
1714 apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff) |
|
1715 apply (simp add: le_minus_self_iff linorder_neq_iff) |
|
1716 done |
|
1717 (* |
|
1718 apply (simp add: order_less_le abs_le_iff) |
|
1719 apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff) |
|
1720 apply (simp add: linorder_not_less [symmetric]) |
|
1721 apply (simp add: le_minus_self_iff linorder_neq_iff) |
|
1722 apply (simp add: linorder_not_less [symmetric]) |
|
1723 done |
|
1724 *) |
|
1725 |
|
1726 lemma abs_triangle_ineq: "abs (a+b) \<le> abs a + abs (b::'a::ordered_ring)" |
|
1727 by (force simp add: abs_le_iff abs_ge_self abs_ge_minus_self add_mono) |
|
1728 |
|
1729 lemma abs_diff_triangle_ineq: |
|
1730 "\<bar>(a::'a::ordered_ring) + b - (c+d)\<bar> \<le> \<bar>a-c\<bar> + \<bar>b-d\<bar>" |
|
1731 proof - |
|
1732 have "\<bar>a + b - (c+d)\<bar> = \<bar>(a-c) + (b-d)\<bar>" by (simp add: diff_minus add_ac) |
|
1733 also have "... \<le> \<bar>a-c\<bar> + \<bar>b-d\<bar>" by (rule abs_triangle_ineq) |
|
1734 finally show ?thesis . |
|
1735 qed |
|
1736 |
|
1737 lemma abs_mult_less: |
1466 lemma abs_mult_less: |
1738 "[| abs a < c; abs b < d |] ==> abs a * abs b < c*(d::'a::ordered_ring)" |
1467 "[| abs a < c; abs b < d |] ==> abs a * abs b < c*(d::'a::ordered_idom)" |
1739 proof - |
1468 proof - |
1740 assume ac: "abs a < c" |
1469 assume ac: "abs a < c" |
1741 hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero) |
1470 hence cpos: "0<c" by (blast intro: order_le_less_trans abs_ge_zero) |
1742 assume "abs b < d" |
1471 assume "abs b < d" |
1743 thus ?thesis by (simp add: ac cpos mult_strict_mono) |
1472 thus ?thesis by (simp add: ac cpos mult_strict_mono) |
1744 qed |
1473 qed |
1745 |
1474 |
|
1475 lemma eq_minus_self_iff: "(a = -a) = (a = (0::'a::ordered_idom))" |
|
1476 by (force simp add: order_eq_iff le_minus_self_iff minus_le_self_iff) |
|
1477 |
|
1478 lemma less_minus_self_iff: "(a < -a) = (a < (0::'a::ordered_idom))" |
|
1479 by (simp add: order_less_le le_minus_self_iff eq_minus_self_iff) |
|
1480 |
|
1481 lemma abs_less_iff: "(abs a < b) = (a < b & -a < (b::'a::ordered_idom))" |
|
1482 apply (simp add: order_less_le abs_le_iff) |
|
1483 apply (auto simp add: abs_if minus_le_self_iff eq_minus_self_iff) |
|
1484 apply (simp add: le_minus_self_iff linorder_neq_iff) |
|
1485 done |
|
1486 |
1746 text{*Moving this up spoils many proofs using @{text mult_le_cancel_right}*} |
1487 text{*Moving this up spoils many proofs using @{text mult_le_cancel_right}*} |
1747 declare times_divide_eq_left [simp] |
1488 declare times_divide_eq_left [simp] |
1748 |
1489 |
1749 ML |
1490 ML {* |
1750 {* |
|
1751 val add_assoc = thm"add_assoc"; |
|
1752 val add_commute = thm"add_commute"; |
|
1753 val mult_assoc = thm"mult_assoc"; |
|
1754 val mult_commute = thm"mult_commute"; |
|
1755 val zero_neq_one = thm"zero_neq_one"; |
|
1756 val diff_minus = thm"diff_minus"; |
|
1757 val abs_if = thm"abs_if"; |
|
1758 val divide_inverse = thm"divide_inverse"; |
|
1759 val inverse_zero = thm"inverse_zero"; |
|
1760 val divide_zero = thm"divide_zero"; |
|
1761 |
|
1762 val add_0 = thm"add_0"; |
|
1763 val add_0_right = thm"add_0_right"; |
|
1764 val add_zero_left = thm"add_0"; |
|
1765 val add_zero_right = thm"add_0_right"; |
|
1766 |
|
1767 val add_left_commute = thm"add_left_commute"; |
|
1768 val left_minus = thm"left_minus"; |
|
1769 val right_minus = thm"right_minus"; |
|
1770 val right_minus_eq = thm"right_minus_eq"; |
|
1771 val add_left_cancel = thm"add_left_cancel"; |
|
1772 val add_right_cancel = thm"add_right_cancel"; |
|
1773 val minus_minus = thm"minus_minus"; |
|
1774 val equals_zero_I = thm"equals_zero_I"; |
|
1775 val minus_zero = thm"minus_zero"; |
|
1776 val diff_self = thm"diff_self"; |
|
1777 val diff_0 = thm"diff_0"; |
|
1778 val diff_0_right = thm"diff_0_right"; |
|
1779 val diff_minus_eq_add = thm"diff_minus_eq_add"; |
|
1780 val neg_equal_iff_equal = thm"neg_equal_iff_equal"; |
|
1781 val neg_equal_0_iff_equal = thm"neg_equal_0_iff_equal"; |
|
1782 val neg_0_equal_iff_equal = thm"neg_0_equal_iff_equal"; |
|
1783 val equation_minus_iff = thm"equation_minus_iff"; |
|
1784 val minus_equation_iff = thm"minus_equation_iff"; |
|
1785 val mult_1 = thm"mult_1"; |
|
1786 val mult_1_right = thm"mult_1_right"; |
|
1787 val mult_left_commute = thm"mult_left_commute"; |
|
1788 val mult_zero_left = thm"mult_zero_left"; |
|
1789 val mult_zero_right = thm"mult_zero_right"; |
|
1790 val left_distrib = thm "left_distrib"; |
1491 val left_distrib = thm "left_distrib"; |
1791 val right_distrib = thm"right_distrib"; |
1492 val right_distrib = thm "right_distrib"; |
1792 val combine_common_factor = thm"combine_common_factor"; |
1493 val mult_commute = thm "mult_commute"; |
1793 val minus_add_distrib = thm"minus_add_distrib"; |
1494 val distrib = thm "distrib"; |
1794 val minus_mult_left = thm"minus_mult_left"; |
1495 val zero_neq_one = thm "zero_neq_one"; |
1795 val minus_mult_right = thm"minus_mult_right"; |
1496 val no_zero_divisors = thm "no_zero_divisors"; |
1796 val minus_mult_minus = thm"minus_mult_minus"; |
|
1797 val minus_mult_commute = thm"minus_mult_commute"; |
|
1798 val right_diff_distrib = thm"right_diff_distrib"; |
|
1799 val left_diff_distrib = thm"left_diff_distrib"; |
|
1800 val minus_diff_eq = thm"minus_diff_eq"; |
|
1801 val add_left_mono = thm"add_left_mono"; |
|
1802 val add_right_mono = thm"add_right_mono"; |
|
1803 val add_mono = thm"add_mono"; |
|
1804 val add_strict_left_mono = thm"add_strict_left_mono"; |
|
1805 val add_strict_right_mono = thm"add_strict_right_mono"; |
|
1806 val add_strict_mono = thm"add_strict_mono"; |
|
1807 val add_less_le_mono = thm"add_less_le_mono"; |
|
1808 val add_le_less_mono = thm"add_le_less_mono"; |
|
1809 val add_less_imp_less_left = thm"add_less_imp_less_left"; |
|
1810 val add_less_imp_less_right = thm"add_less_imp_less_right"; |
|
1811 val add_less_cancel_left = thm"add_less_cancel_left"; |
|
1812 val add_less_cancel_right = thm"add_less_cancel_right"; |
|
1813 val add_le_cancel_left = thm"add_le_cancel_left"; |
|
1814 val add_le_cancel_right = thm"add_le_cancel_right"; |
|
1815 val add_le_imp_le_left = thm"add_le_imp_le_left"; |
|
1816 val add_le_imp_le_right = thm"add_le_imp_le_right"; |
|
1817 val le_imp_neg_le = thm"le_imp_neg_le"; |
|
1818 val neg_le_iff_le = thm"neg_le_iff_le"; |
|
1819 val neg_le_0_iff_le = thm"neg_le_0_iff_le"; |
|
1820 val neg_0_le_iff_le = thm"neg_0_le_iff_le"; |
|
1821 val neg_less_iff_less = thm"neg_less_iff_less"; |
|
1822 val neg_less_0_iff_less = thm"neg_less_0_iff_less"; |
|
1823 val neg_0_less_iff_less = thm"neg_0_less_iff_less"; |
|
1824 val less_minus_iff = thm"less_minus_iff"; |
|
1825 val minus_less_iff = thm"minus_less_iff"; |
|
1826 val le_minus_iff = thm"le_minus_iff"; |
|
1827 val minus_le_iff = thm"minus_le_iff"; |
|
1828 val add_diff_eq = thm"add_diff_eq"; |
|
1829 val diff_add_eq = thm"diff_add_eq"; |
|
1830 val diff_eq_eq = thm"diff_eq_eq"; |
|
1831 val eq_diff_eq = thm"eq_diff_eq"; |
|
1832 val diff_diff_eq = thm"diff_diff_eq"; |
|
1833 val diff_diff_eq2 = thm"diff_diff_eq2"; |
|
1834 val less_iff_diff_less_0 = thm"less_iff_diff_less_0"; |
|
1835 val diff_less_eq = thm"diff_less_eq"; |
|
1836 val less_diff_eq = thm"less_diff_eq"; |
|
1837 val diff_le_eq = thm"diff_le_eq"; |
|
1838 val le_diff_eq = thm"le_diff_eq"; |
|
1839 val eq_iff_diff_eq_0 = thm"eq_iff_diff_eq_0"; |
|
1840 val le_iff_diff_le_0 = thm"le_iff_diff_le_0"; |
|
1841 val eq_add_iff1 = thm"eq_add_iff1"; |
|
1842 val eq_add_iff2 = thm"eq_add_iff2"; |
|
1843 val less_add_iff1 = thm"less_add_iff1"; |
|
1844 val less_add_iff2 = thm"less_add_iff2"; |
|
1845 val le_add_iff1 = thm"le_add_iff1"; |
|
1846 val le_add_iff2 = thm"le_add_iff2"; |
|
1847 val mult_strict_left_mono = thm"mult_strict_left_mono"; |
|
1848 val mult_strict_right_mono = thm"mult_strict_right_mono"; |
|
1849 val mult_left_mono = thm"mult_left_mono"; |
|
1850 val mult_right_mono = thm"mult_right_mono"; |
|
1851 val mult_left_le_imp_le = thm"mult_left_le_imp_le"; |
|
1852 val mult_right_le_imp_le = thm"mult_right_le_imp_le"; |
|
1853 val mult_left_less_imp_less = thm"mult_left_less_imp_less"; |
|
1854 val mult_right_less_imp_less = thm"mult_right_less_imp_less"; |
|
1855 val mult_strict_left_mono_neg = thm"mult_strict_left_mono_neg"; |
|
1856 val mult_strict_right_mono_neg = thm"mult_strict_right_mono_neg"; |
|
1857 val mult_pos = thm"mult_pos"; |
|
1858 val mult_pos_neg = thm"mult_pos_neg"; |
|
1859 val mult_neg = thm"mult_neg"; |
|
1860 val zero_less_mult_pos = thm"zero_less_mult_pos"; |
|
1861 val zero_less_mult_iff = thm"zero_less_mult_iff"; |
|
1862 val mult_eq_0_iff = thm"mult_eq_0_iff"; |
|
1863 val zero_le_mult_iff = thm"zero_le_mult_iff"; |
|
1864 val mult_less_0_iff = thm"mult_less_0_iff"; |
|
1865 val mult_le_0_iff = thm"mult_le_0_iff"; |
|
1866 val zero_le_square = thm"zero_le_square"; |
|
1867 val zero_less_one = thm"zero_less_one"; |
|
1868 val zero_le_one = thm"zero_le_one"; |
|
1869 val not_one_less_zero = thm"not_one_less_zero"; |
|
1870 val not_one_le_zero = thm"not_one_le_zero"; |
|
1871 val mult_left_mono_neg = thm"mult_left_mono_neg"; |
|
1872 val mult_right_mono_neg = thm"mult_right_mono_neg"; |
|
1873 val mult_strict_mono = thm"mult_strict_mono"; |
|
1874 val mult_strict_mono' = thm"mult_strict_mono'"; |
|
1875 val mult_mono = thm"mult_mono"; |
|
1876 val mult_less_cancel_right = thm"mult_less_cancel_right"; |
|
1877 val mult_less_cancel_left = thm"mult_less_cancel_left"; |
|
1878 val mult_le_cancel_right = thm"mult_le_cancel_right"; |
|
1879 val mult_le_cancel_left = thm"mult_le_cancel_left"; |
|
1880 val mult_less_imp_less_left = thm"mult_less_imp_less_left"; |
|
1881 val mult_less_imp_less_right = thm"mult_less_imp_less_right"; |
|
1882 val mult_cancel_right = thm"mult_cancel_right"; |
|
1883 val mult_cancel_left = thm"mult_cancel_left"; |
|
1884 val left_inverse = thm "left_inverse"; |
1497 val left_inverse = thm "left_inverse"; |
1885 val right_inverse = thm"right_inverse"; |
1498 val divide_inverse = thm "divide_inverse"; |
1886 val right_inverse_eq = thm"right_inverse_eq"; |
1499 val mult_zero_left = thm "mult_zero_left"; |
1887 val nonzero_inverse_eq_divide = thm"nonzero_inverse_eq_divide"; |
1500 val mult_zero_right = thm "mult_zero_right"; |
1888 val divide_self = thm"divide_self"; |
1501 val field_mult_eq_0_iff = thm "field_mult_eq_0_iff"; |
1889 val inverse_divide = thm"inverse_divide"; |
1502 val inverse_zero = thm "inverse_zero"; |
1890 val divide_zero_left = thm"divide_zero_left"; |
1503 val ring_distrib = thms "ring_distrib"; |
1891 val inverse_eq_divide = thm"inverse_eq_divide"; |
1504 val combine_common_factor = thm "combine_common_factor"; |
1892 val add_divide_distrib = thm"add_divide_distrib"; |
1505 val minus_mult_left = thm "minus_mult_left"; |
1893 val field_mult_eq_0_iff = thm"field_mult_eq_0_iff"; |
1506 val minus_mult_right = thm "minus_mult_right"; |
1894 val field_mult_cancel_right = thm"field_mult_cancel_right"; |
1507 val minus_mult_minus = thm "minus_mult_minus"; |
1895 val field_mult_cancel_left = thm"field_mult_cancel_left"; |
1508 val minus_mult_commute = thm "minus_mult_commute"; |
1896 val nonzero_imp_inverse_nonzero = thm"nonzero_imp_inverse_nonzero"; |
1509 val right_diff_distrib = thm "right_diff_distrib"; |
1897 val inverse_zero_imp_zero = thm"inverse_zero_imp_zero"; |
1510 val left_diff_distrib = thm "left_diff_distrib"; |
1898 val inverse_nonzero_imp_nonzero = thm"inverse_nonzero_imp_nonzero"; |
1511 val mult_left_mono = thm "mult_left_mono"; |
1899 val inverse_nonzero_iff_nonzero = thm"inverse_nonzero_iff_nonzero"; |
1512 val mult_right_mono = thm "mult_right_mono"; |
1900 val nonzero_inverse_minus_eq = thm"nonzero_inverse_minus_eq"; |
1513 val mult_strict_left_mono = thm "mult_strict_left_mono"; |
1901 val inverse_minus_eq = thm"inverse_minus_eq"; |
1514 val mult_strict_right_mono = thm "mult_strict_right_mono"; |
1902 val nonzero_inverse_eq_imp_eq = thm"nonzero_inverse_eq_imp_eq"; |
1515 val mult_mono = thm "mult_mono"; |
1903 val inverse_eq_imp_eq = thm"inverse_eq_imp_eq"; |
1516 val mult_strict_mono = thm "mult_strict_mono"; |
1904 val inverse_eq_iff_eq = thm"inverse_eq_iff_eq"; |
1517 val abs_if = thm "abs_if"; |
1905 val nonzero_inverse_inverse_eq = thm"nonzero_inverse_inverse_eq"; |
1518 val zero_less_one = thm "zero_less_one"; |
1906 val inverse_inverse_eq = thm"inverse_inverse_eq"; |
1519 val eq_add_iff1 = thm "eq_add_iff1"; |
1907 val inverse_1 = thm"inverse_1"; |
1520 val eq_add_iff2 = thm "eq_add_iff2"; |
1908 val nonzero_inverse_mult_distrib = thm"nonzero_inverse_mult_distrib"; |
1521 val less_add_iff1 = thm "less_add_iff1"; |
1909 val inverse_mult_distrib = thm"inverse_mult_distrib"; |
1522 val less_add_iff2 = thm "less_add_iff2"; |
1910 val inverse_add = thm"inverse_add"; |
1523 val le_add_iff1 = thm "le_add_iff1"; |
1911 val nonzero_mult_divide_cancel_left = thm"nonzero_mult_divide_cancel_left"; |
1524 val le_add_iff2 = thm "le_add_iff2"; |
1912 val mult_divide_cancel_left = thm"mult_divide_cancel_left"; |
1525 val mult_left_le_imp_le = thm "mult_left_le_imp_le"; |
1913 val nonzero_mult_divide_cancel_right = thm"nonzero_mult_divide_cancel_right"; |
1526 val mult_right_le_imp_le = thm "mult_right_le_imp_le"; |
1914 val mult_divide_cancel_right = thm"mult_divide_cancel_right"; |
1527 val mult_left_less_imp_less = thm "mult_left_less_imp_less"; |
1915 val mult_divide_cancel_eq_if = thm"mult_divide_cancel_eq_if"; |
1528 val mult_right_less_imp_less = thm "mult_right_less_imp_less"; |
1916 val divide_1 = thm"divide_1"; |
1529 val mult_strict_left_mono_neg = thm "mult_strict_left_mono_neg"; |
1917 val times_divide_eq_right = thm"times_divide_eq_right"; |
1530 val mult_left_mono_neg = thm "mult_left_mono_neg"; |
1918 val times_divide_eq_left = thm"times_divide_eq_left"; |
1531 val mult_strict_right_mono_neg = thm "mult_strict_right_mono_neg"; |
1919 val divide_divide_eq_right = thm"divide_divide_eq_right"; |
1532 val mult_right_mono_neg = thm "mult_right_mono_neg"; |
1920 val divide_divide_eq_left = thm"divide_divide_eq_left"; |
1533 val mult_pos = thm "mult_pos"; |
1921 val nonzero_minus_divide_left = thm"nonzero_minus_divide_left"; |
1534 val mult_pos_le = thm "mult_pos_le"; |
1922 val nonzero_minus_divide_right = thm"nonzero_minus_divide_right"; |
1535 val mult_pos_neg = thm "mult_pos_neg"; |
1923 val nonzero_minus_divide_divide = thm"nonzero_minus_divide_divide"; |
1536 val mult_pos_neg_le = thm "mult_pos_neg_le"; |
1924 val minus_divide_left = thm"minus_divide_left"; |
1537 val mult_pos_neg2 = thm "mult_pos_neg2"; |
1925 val minus_divide_right = thm"minus_divide_right"; |
1538 val mult_pos_neg2_le = thm "mult_pos_neg2_le"; |
1926 val minus_divide_divide = thm"minus_divide_divide"; |
1539 val mult_neg = thm "mult_neg"; |
1927 val positive_imp_inverse_positive = thm"positive_imp_inverse_positive"; |
1540 val mult_neg_le = thm "mult_neg_le"; |
1928 val negative_imp_inverse_negative = thm"negative_imp_inverse_negative"; |
1541 val zero_less_mult_pos = thm "zero_less_mult_pos"; |
1929 val inverse_le_imp_le = thm"inverse_le_imp_le"; |
1542 val zero_less_mult_pos2 = thm "zero_less_mult_pos2"; |
1930 val inverse_positive_imp_positive = thm"inverse_positive_imp_positive"; |
1543 val zero_less_mult_iff = thm "zero_less_mult_iff"; |
1931 val inverse_positive_iff_positive = thm"inverse_positive_iff_positive"; |
1544 val mult_eq_0_iff = thm "mult_eq_0_iff"; |
1932 val inverse_negative_imp_negative = thm"inverse_negative_imp_negative"; |
1545 val zero_le_mult_iff = thm "zero_le_mult_iff"; |
1933 val inverse_negative_iff_negative = thm"inverse_negative_iff_negative"; |
1546 val mult_less_0_iff = thm "mult_less_0_iff"; |
1934 val inverse_nonnegative_iff_nonnegative = thm"inverse_nonnegative_iff_nonnegative"; |
1547 val mult_le_0_iff = thm "mult_le_0_iff"; |
1935 val inverse_nonpositive_iff_nonpositive = thm"inverse_nonpositive_iff_nonpositive"; |
1548 val split_mult_pos_le = thm "split_mult_pos_le"; |
1936 val less_imp_inverse_less = thm"less_imp_inverse_less"; |
1549 val split_mult_neg_le = thm "split_mult_neg_le"; |
1937 val inverse_less_imp_less = thm"inverse_less_imp_less"; |
1550 val zero_le_square = thm "zero_le_square"; |
1938 val inverse_less_iff_less = thm"inverse_less_iff_less"; |
1551 val zero_le_one = thm "zero_le_one"; |
1939 val le_imp_inverse_le = thm"le_imp_inverse_le"; |
1552 val not_one_le_zero = thm "not_one_le_zero"; |
1940 val inverse_le_iff_le = thm"inverse_le_iff_le"; |
1553 val not_one_less_zero = thm "not_one_less_zero"; |
1941 val inverse_le_imp_le_neg = thm"inverse_le_imp_le_neg"; |
1554 val mult_left_mono_neg = thm "mult_left_mono_neg"; |
1942 val less_imp_inverse_less_neg = thm"less_imp_inverse_less_neg"; |
1555 val mult_right_mono_neg = thm "mult_right_mono_neg"; |
1943 val inverse_less_imp_less_neg = thm"inverse_less_imp_less_neg"; |
1556 val mult_strict_mono = thm "mult_strict_mono"; |
1944 val inverse_less_iff_less_neg = thm"inverse_less_iff_less_neg"; |
1557 val mult_strict_mono' = thm "mult_strict_mono'"; |
1945 val le_imp_inverse_le_neg = thm"le_imp_inverse_le_neg"; |
1558 val mult_mono = thm "mult_mono"; |
1946 val inverse_le_iff_le_neg = thm"inverse_le_iff_le_neg"; |
1559 val less_1_mult = thm "less_1_mult"; |
1947 val zero_less_divide_iff = thm"zero_less_divide_iff"; |
1560 val mult_less_cancel_right = thm "mult_less_cancel_right"; |
1948 val divide_less_0_iff = thm"divide_less_0_iff"; |
1561 val mult_less_cancel_left = thm "mult_less_cancel_left"; |
1949 val zero_le_divide_iff = thm"zero_le_divide_iff"; |
1562 val mult_le_cancel_right = thm "mult_le_cancel_right"; |
1950 val divide_le_0_iff = thm"divide_le_0_iff"; |
1563 val mult_le_cancel_left = thm "mult_le_cancel_left"; |
1951 val divide_eq_0_iff = thm"divide_eq_0_iff"; |
1564 val mult_less_imp_less_left = thm "mult_less_imp_less_left"; |
1952 val pos_le_divide_eq = thm"pos_le_divide_eq"; |
1565 val mult_less_imp_less_right = thm "mult_less_imp_less_right"; |
1953 val neg_le_divide_eq = thm"neg_le_divide_eq"; |
1566 val mult_cancel_right = thm "mult_cancel_right"; |
1954 val le_divide_eq = thm"le_divide_eq"; |
1567 val mult_cancel_left = thm "mult_cancel_left"; |
1955 val pos_divide_le_eq = thm"pos_divide_le_eq"; |
1568 val ring_eq_simps = thms "ring_eq_simps"; |
1956 val neg_divide_le_eq = thm"neg_divide_le_eq"; |
1569 val right_inverse = thm "right_inverse"; |
1957 val divide_le_eq = thm"divide_le_eq"; |
1570 val right_inverse_eq = thm "right_inverse_eq"; |
1958 val pos_less_divide_eq = thm"pos_less_divide_eq"; |
1571 val nonzero_inverse_eq_divide = thm "nonzero_inverse_eq_divide"; |
1959 val neg_less_divide_eq = thm"neg_less_divide_eq"; |
1572 val divide_self = thm "divide_self"; |
1960 val less_divide_eq = thm"less_divide_eq"; |
1573 val divide_zero = thm "divide_zero"; |
1961 val pos_divide_less_eq = thm"pos_divide_less_eq"; |
1574 val divide_zero_left = thm "divide_zero_left"; |
1962 val neg_divide_less_eq = thm"neg_divide_less_eq"; |
1575 val inverse_eq_divide = thm "inverse_eq_divide"; |
1963 val divide_less_eq = thm"divide_less_eq"; |
1576 val add_divide_distrib = thm "add_divide_distrib"; |
1964 val nonzero_eq_divide_eq = thm"nonzero_eq_divide_eq"; |
1577 val field_mult_eq_0_iff = thm "field_mult_eq_0_iff"; |
1965 val eq_divide_eq = thm"eq_divide_eq"; |
1578 val field_mult_cancel_right_lemma = thm "field_mult_cancel_right_lemma"; |
1966 val nonzero_divide_eq_eq = thm"nonzero_divide_eq_eq"; |
1579 val field_mult_cancel_right = thm "field_mult_cancel_right"; |
1967 val divide_eq_eq = thm"divide_eq_eq"; |
1580 val field_mult_cancel_left = thm "field_mult_cancel_left"; |
1968 val divide_cancel_right = thm"divide_cancel_right"; |
1581 val nonzero_imp_inverse_nonzero = thm "nonzero_imp_inverse_nonzero"; |
1969 val divide_cancel_left = thm"divide_cancel_left"; |
1582 val inverse_zero_imp_zero = thm "inverse_zero_imp_zero"; |
1970 val divide_strict_right_mono = thm"divide_strict_right_mono"; |
1583 val inverse_nonzero_imp_nonzero = thm "inverse_nonzero_imp_nonzero"; |
1971 val divide_right_mono = thm"divide_right_mono"; |
1584 val inverse_nonzero_iff_nonzero = thm "inverse_nonzero_iff_nonzero"; |
1972 val divide_strict_left_mono = thm"divide_strict_left_mono"; |
1585 val nonzero_inverse_minus_eq = thm "nonzero_inverse_minus_eq"; |
1973 val divide_left_mono = thm"divide_left_mono"; |
1586 val inverse_minus_eq = thm "inverse_minus_eq"; |
1974 val divide_strict_left_mono_neg = thm"divide_strict_left_mono_neg"; |
1587 val nonzero_inverse_eq_imp_eq = thm "nonzero_inverse_eq_imp_eq"; |
1975 val divide_strict_right_mono_neg = thm"divide_strict_right_mono_neg"; |
1588 val inverse_eq_imp_eq = thm "inverse_eq_imp_eq"; |
1976 val zero_less_two = thm"zero_less_two"; |
1589 val inverse_eq_iff_eq = thm "inverse_eq_iff_eq"; |
1977 val less_half_sum = thm"less_half_sum"; |
1590 val nonzero_inverse_inverse_eq = thm "nonzero_inverse_inverse_eq"; |
1978 val gt_half_sum = thm"gt_half_sum"; |
1591 val inverse_inverse_eq = thm "inverse_inverse_eq"; |
1979 val dense = thm"dense"; |
1592 val inverse_1 = thm "inverse_1"; |
1980 val abs_zero = thm"abs_zero"; |
1593 val nonzero_inverse_mult_distrib = thm "nonzero_inverse_mult_distrib"; |
1981 val abs_one = thm"abs_one"; |
1594 val inverse_mult_distrib = thm "inverse_mult_distrib"; |
1982 val abs_mult = thm"abs_mult"; |
1595 val inverse_add = thm "inverse_add"; |
1983 val abs_mult_self = thm"abs_mult_self"; |
1596 val inverse_divide = thm "inverse_divide"; |
1984 val abs_eq_0 = thm"abs_eq_0"; |
1597 val nonzero_mult_divide_cancel_left = thm "nonzero_mult_divide_cancel_left"; |
1985 val zero_less_abs_iff = thm"zero_less_abs_iff"; |
1598 val mult_divide_cancel_left = thm "mult_divide_cancel_left"; |
1986 val abs_not_less_zero = thm"abs_not_less_zero"; |
1599 val nonzero_mult_divide_cancel_right = thm "nonzero_mult_divide_cancel_right"; |
1987 val abs_le_zero_iff = thm"abs_le_zero_iff"; |
1600 val mult_divide_cancel_right = thm "mult_divide_cancel_right"; |
1988 val abs_minus_cancel = thm"abs_minus_cancel"; |
1601 val mult_divide_cancel_eq_if = thm "mult_divide_cancel_eq_if"; |
1989 val abs_ge_zero = thm"abs_ge_zero"; |
1602 val divide_1 = thm "divide_1"; |
1990 val abs_idempotent = thm"abs_idempotent"; |
1603 val times_divide_eq_right = thm "times_divide_eq_right"; |
1991 val abs_zero_iff = thm"abs_zero_iff"; |
1604 val times_divide_eq_left = thm "times_divide_eq_left"; |
1992 val abs_ge_self = thm"abs_ge_self"; |
1605 val divide_divide_eq_right = thm "divide_divide_eq_right"; |
1993 val abs_ge_minus_self = thm"abs_ge_minus_self"; |
1606 val divide_divide_eq_left = thm "divide_divide_eq_left"; |
1994 val nonzero_abs_inverse = thm"nonzero_abs_inverse"; |
1607 val nonzero_minus_divide_left = thm "nonzero_minus_divide_left"; |
1995 val abs_inverse = thm"abs_inverse"; |
1608 val nonzero_minus_divide_right = thm "nonzero_minus_divide_right"; |
1996 val nonzero_abs_divide = thm"nonzero_abs_divide"; |
1609 val nonzero_minus_divide_divide = thm "nonzero_minus_divide_divide"; |
1997 val abs_divide = thm"abs_divide"; |
1610 val minus_divide_left = thm "minus_divide_left"; |
1998 val abs_leI = thm"abs_leI"; |
1611 val minus_divide_right = thm "minus_divide_right"; |
1999 val le_minus_self_iff = thm"le_minus_self_iff"; |
1612 val minus_divide_divide = thm "minus_divide_divide"; |
2000 val minus_le_self_iff = thm"minus_le_self_iff"; |
1613 val diff_divide_distrib = thm "diff_divide_distrib"; |
2001 val eq_minus_self_iff = thm"eq_minus_self_iff"; |
1614 val positive_imp_inverse_positive = thm "positive_imp_inverse_positive"; |
2002 val less_minus_self_iff = thm"less_minus_self_iff"; |
1615 val negative_imp_inverse_negative = thm "negative_imp_inverse_negative"; |
2003 val abs_le_D1 = thm"abs_le_D1"; |
1616 val inverse_le_imp_le = thm "inverse_le_imp_le"; |
2004 val abs_le_D2 = thm"abs_le_D2"; |
1617 val inverse_positive_imp_positive = thm "inverse_positive_imp_positive"; |
2005 val abs_le_iff = thm"abs_le_iff"; |
1618 val inverse_positive_iff_positive = thm "inverse_positive_iff_positive"; |
2006 val abs_less_iff = thm"abs_less_iff"; |
1619 val inverse_negative_imp_negative = thm "inverse_negative_imp_negative"; |
2007 val abs_triangle_ineq = thm"abs_triangle_ineq"; |
1620 val inverse_negative_iff_negative = thm "inverse_negative_iff_negative"; |
2008 val abs_mult_less = thm"abs_mult_less"; |
1621 val inverse_nonnegative_iff_nonnegative = thm "inverse_nonnegative_iff_nonnegative"; |
2009 |
1622 val inverse_nonpositive_iff_nonpositive = thm "inverse_nonpositive_iff_nonpositive"; |
2010 val compare_rls = thms"compare_rls"; |
1623 val less_imp_inverse_less = thm "less_imp_inverse_less"; |
|
1624 val inverse_less_imp_less = thm "inverse_less_imp_less"; |
|
1625 val inverse_less_iff_less = thm "inverse_less_iff_less"; |
|
1626 val le_imp_inverse_le = thm "le_imp_inverse_le"; |
|
1627 val inverse_le_iff_le = thm "inverse_le_iff_le"; |
|
1628 val inverse_le_imp_le_neg = thm "inverse_le_imp_le_neg"; |
|
1629 val less_imp_inverse_less_neg = thm "less_imp_inverse_less_neg"; |
|
1630 val inverse_less_imp_less_neg = thm "inverse_less_imp_less_neg"; |
|
1631 val inverse_less_iff_less_neg = thm "inverse_less_iff_less_neg"; |
|
1632 val le_imp_inverse_le_neg = thm "le_imp_inverse_le_neg"; |
|
1633 val inverse_le_iff_le_neg = thm "inverse_le_iff_le_neg"; |
|
1634 val one_less_inverse_iff = thm "one_less_inverse_iff"; |
|
1635 val inverse_eq_1_iff = thm "inverse_eq_1_iff"; |
|
1636 val one_le_inverse_iff = thm "one_le_inverse_iff"; |
|
1637 val inverse_less_1_iff = thm "inverse_less_1_iff"; |
|
1638 val inverse_le_1_iff = thm "inverse_le_1_iff"; |
|
1639 val zero_less_divide_iff = thm "zero_less_divide_iff"; |
|
1640 val divide_less_0_iff = thm "divide_less_0_iff"; |
|
1641 val zero_le_divide_iff = thm "zero_le_divide_iff"; |
|
1642 val divide_le_0_iff = thm "divide_le_0_iff"; |
|
1643 val divide_eq_0_iff = thm "divide_eq_0_iff"; |
|
1644 val pos_le_divide_eq = thm "pos_le_divide_eq"; |
|
1645 val neg_le_divide_eq = thm "neg_le_divide_eq"; |
|
1646 val le_divide_eq = thm "le_divide_eq"; |
|
1647 val pos_divide_le_eq = thm "pos_divide_le_eq"; |
|
1648 val neg_divide_le_eq = thm "neg_divide_le_eq"; |
|
1649 val divide_le_eq = thm "divide_le_eq"; |
|
1650 val pos_less_divide_eq = thm "pos_less_divide_eq"; |
|
1651 val neg_less_divide_eq = thm "neg_less_divide_eq"; |
|
1652 val less_divide_eq = thm "less_divide_eq"; |
|
1653 val pos_divide_less_eq = thm "pos_divide_less_eq"; |
|
1654 val neg_divide_less_eq = thm "neg_divide_less_eq"; |
|
1655 val divide_less_eq = thm "divide_less_eq"; |
|
1656 val nonzero_eq_divide_eq = thm "nonzero_eq_divide_eq"; |
|
1657 val eq_divide_eq = thm "eq_divide_eq"; |
|
1658 val nonzero_divide_eq_eq = thm "nonzero_divide_eq_eq"; |
|
1659 val divide_eq_eq = thm "divide_eq_eq"; |
|
1660 val divide_cancel_right = thm "divide_cancel_right"; |
|
1661 val divide_cancel_left = thm "divide_cancel_left"; |
|
1662 val divide_eq_1_iff = thm "divide_eq_1_iff"; |
|
1663 val one_eq_divide_iff = thm "one_eq_divide_iff"; |
|
1664 val zero_eq_1_divide_iff = thm "zero_eq_1_divide_iff"; |
|
1665 val one_divide_eq_0_iff = thm "one_divide_eq_0_iff"; |
|
1666 val divide_strict_right_mono = thm "divide_strict_right_mono"; |
|
1667 val divide_right_mono = thm "divide_right_mono"; |
|
1668 val divide_strict_left_mono = thm "divide_strict_left_mono"; |
|
1669 val divide_left_mono = thm "divide_left_mono"; |
|
1670 val divide_strict_left_mono_neg = thm "divide_strict_left_mono_neg"; |
|
1671 val divide_strict_right_mono_neg = thm "divide_strict_right_mono_neg"; |
|
1672 val less_add_one = thm "less_add_one"; |
|
1673 val zero_less_two = thm "zero_less_two"; |
|
1674 val less_half_sum = thm "less_half_sum"; |
|
1675 val gt_half_sum = thm "gt_half_sum"; |
|
1676 val dense = thm "dense"; |
|
1677 val abs_one = thm "abs_one"; |
|
1678 val abs_le_mult = thm "abs_le_mult"; |
|
1679 val abs_eq_mult = thm "abs_eq_mult"; |
|
1680 val abs_mult = thm "abs_mult"; |
|
1681 val abs_mult_self = thm "abs_mult_self"; |
|
1682 val nonzero_abs_inverse = thm "nonzero_abs_inverse"; |
|
1683 val abs_inverse = thm "abs_inverse"; |
|
1684 val nonzero_abs_divide = thm "nonzero_abs_divide"; |
|
1685 val abs_divide = thm "abs_divide"; |
|
1686 val abs_mult_less = thm "abs_mult_less"; |
|
1687 val eq_minus_self_iff = thm "eq_minus_self_iff"; |
|
1688 val less_minus_self_iff = thm "less_minus_self_iff"; |
|
1689 val abs_less_iff = thm "abs_less_iff"; |
2011 *} |
1690 *} |
2012 |
1691 |
2013 |
|
2014 end |
1692 end |