| author | paulson |
| Wed, 10 Dec 2003 15:59:34 +0100 | |
| changeset 14288 | d149e3cbdb39 |
| parent 14275 | 031a5a051bb4 |
| child 14290 | 84fda1b39947 |
| permissions | -rw-r--r-- |
| 10722 | 1 |
theory RealArith = RealArith0 |
|
14275
031a5a051bb4
Converting more of the "real" development to Isar scripts
paulson
parents:
14270
diff
changeset
|
2 |
files ("real_arith.ML"):
|
|
031a5a051bb4
Converting more of the "real" development to Isar scripts
paulson
parents:
14270
diff
changeset
|
3 |
|
| 14288 | 4 |
lemma real_divide_1: "(x::real)/1 = x" |
5 |
by (simp add: real_divide_def) |
|
6 |
||
|
14275
031a5a051bb4
Converting more of the "real" development to Isar scripts
paulson
parents:
14270
diff
changeset
|
7 |
use "real_arith.ML" |
|
9436
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents:
diff
changeset
|
8 |
|
|
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents:
diff
changeset
|
9 |
setup real_arith_setup |
|
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents:
diff
changeset
|
10 |
|
| 14288 | 11 |
subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
|
12 |
||
13 |
text{*Needed in this non-standard form by Hyperreal/Transcendental*}
|
|
14 |
lemma real_0_le_divide_iff: |
|
15 |
"((0::real) <= x/y) = ((x <= 0 | 0 <= y) & (0 <= x | y <= 0))" |
|
16 |
by (simp add: real_divide_def zero_le_mult_iff, auto) |
|
17 |
||
18 |
lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)" |
|
19 |
by arith |
|
20 |
||
21 |
lemma real_add_eq_0_iff [iff]: "(x+y = (0::real)) = (y = -x)" |
|
22 |
by auto |
|
23 |
||
24 |
lemma real_add_less_0_iff [iff]: "(x+y < (0::real)) = (y < -x)" |
|
25 |
by auto |
|
26 |
||
27 |
lemma real_0_less_add_iff [iff]: "((0::real) < x+y) = (-x < y)" |
|
28 |
by auto |
|
29 |
||
30 |
lemma real_add_le_0_iff [iff]: "(x+y \<le> (0::real)) = (y \<le> -x)" |
|
31 |
by auto |
|
32 |
||
33 |
lemma real_0_le_add_iff [iff]: "((0::real) \<le> x+y) = (-x \<le> y)" |
|
34 |
by auto |
|
35 |
||
36 |
||
37 |
(** Simprules combining x-y and 0; see also real_less_iff_diff_less_0, etc., |
|
38 |
in RealBin |
|
39 |
**) |
|
40 |
||
41 |
lemma real_0_less_diff_iff [iff]: "((0::real) < x-y) = (y < x)" |
|
42 |
by auto |
|
43 |
||
44 |
lemma real_0_le_diff_iff [iff]: "((0::real) \<le> x-y) = (y \<le> x)" |
|
45 |
by auto |
|
46 |
||
47 |
(* |
|
48 |
FIXME: we should have this, as for type int, but many proofs would break. |
|
49 |
It replaces x+-y by x-y. |
|
50 |
Addsimps [symmetric real_diff_def] |
|
51 |
*) |
|
52 |
||
53 |
(** Division by 1, -1 **) |
|
54 |
||
55 |
lemma real_divide_minus1 [simp]: "x/-1 = -(x::real)" |
|
56 |
by simp |
|
57 |
||
58 |
lemma real_minus1_divide [simp]: "-1/(x::real) = - (1/x)" |
|
59 |
by (simp add: real_divide_def real_minus_inverse) |
|
60 |
||
61 |
lemma real_lbound_gt_zero: |
|
62 |
"[| (0::real) < d1; 0 < d2 |] ==> \<exists>e. 0 < e & e < d1 & e < d2" |
|
63 |
apply (rule_tac x = " (min d1 d2) /2" in exI) |
|
64 |
apply (simp add: min_def) |
|
65 |
done |
|
66 |
||
67 |
(*** Density of the Reals ***) |
|
68 |
||
69 |
lemma real_less_half_sum: "x < y ==> x < (x+y) / (2::real)" |
|
70 |
by auto |
|
71 |
||
72 |
lemma real_gt_half_sum: "x < y ==> (x+y)/(2::real) < y" |
|
73 |
by auto |
|
74 |
||
75 |
lemma real_dense: "x < y ==> \<exists>r::real. x < r & r < y" |
|
76 |
by (blast intro!: real_less_half_sum real_gt_half_sum) |
|
77 |
||
| 14269 | 78 |
subsection{*Absolute Value Function for the Reals*}
|
79 |
||
80 |
(** abs (absolute value) **) |
|
81 |
||
82 |
lemma abs_nat_number_of: |
|
83 |
"abs (number_of v :: real) = |
|
84 |
(if neg (number_of v) then number_of (bin_minus v) |
|
85 |
else number_of v)" |
|
86 |
apply (simp add: real_abs_def bin_arith_simps minus_real_number_of le_real_number_of_eq_not_less less_real_number_of real_of_int_le_iff) |
|
87 |
done |
|
88 |
||
89 |
declare abs_nat_number_of [simp] |
|
90 |
||
91 |
lemma abs_split [arith_split]: |
|
92 |
"P(abs (x::real)) = ((0 <= x --> P x) & (x < 0 --> P(-x)))" |
|
93 |
apply (unfold real_abs_def, auto) |
|
94 |
done |
|
95 |
||
96 |
||
97 |
(*---------------------------------------------------------------------------- |
|
98 |
Properties of the absolute value function over the reals |
|
99 |
(adapted version of previously proved theorems about abs) |
|
100 |
----------------------------------------------------------------------------*) |
|
101 |
||
102 |
lemma abs_iff: "abs (r::real) = (if 0<=r then r else -r)" |
|
103 |
apply (unfold real_abs_def, auto) |
|
104 |
done |
|
105 |
||
106 |
lemma abs_zero: "abs 0 = (0::real)" |
|
107 |
by (unfold real_abs_def, auto) |
|
108 |
declare abs_zero [simp] |
|
109 |
||
110 |
lemma abs_one: "abs (1::real) = 1" |
|
111 |
by (unfold real_abs_def, simp) |
|
112 |
declare abs_one [simp] |
|
113 |
||
114 |
lemma abs_eqI1: "(0::real)<=x ==> abs x = x" |
|
115 |
by (unfold real_abs_def, simp) |
|
116 |
||
117 |
lemma abs_eqI2: "(0::real) < x ==> abs x = x" |
|
118 |
by (unfold real_abs_def, simp) |
|
119 |
||
120 |
lemma abs_minus_eqI2: "x < (0::real) ==> abs x = -x" |
|
121 |
by (unfold real_abs_def real_le_def, simp) |
|
122 |
||
123 |
lemma abs_minus_eqI1: "x<=(0::real) ==> abs x = -x" |
|
124 |
by (unfold real_abs_def, simp) |
|
125 |
||
126 |
lemma abs_ge_zero: "(0::real)<= abs x" |
|
127 |
by (unfold real_abs_def, simp) |
|
128 |
declare abs_ge_zero [simp] |
|
129 |
||
130 |
lemma abs_idempotent: "abs(abs x)=abs (x::real)" |
|
131 |
by (unfold real_abs_def, simp) |
|
132 |
declare abs_idempotent [simp] |
|
133 |
||
134 |
lemma abs_zero_iff: "(abs x = 0) = (x=(0::real))" |
|
135 |
by (unfold real_abs_def, simp) |
|
136 |
declare abs_zero_iff [iff] |
|
137 |
||
138 |
lemma abs_ge_self: "x<=abs (x::real)" |
|
139 |
by (unfold real_abs_def, simp) |
|
140 |
||
141 |
lemma abs_ge_minus_self: "-x<=abs (x::real)" |
|
142 |
by (unfold real_abs_def, simp) |
|
143 |
||
144 |
lemma abs_mult: "abs (x * y) = abs x * abs (y::real)" |
|
145 |
apply (unfold real_abs_def) |
|
146 |
apply (auto dest!: order_antisym simp add: real_0_le_mult_iff) |
|
147 |
done |
|
148 |
||
149 |
lemma abs_inverse: "abs(inverse(x::real)) = inverse(abs(x))" |
|
150 |
apply (unfold real_abs_def) |
|
151 |
apply (case_tac "x=0") |
|
152 |
apply (auto simp add: real_minus_inverse real_le_less INVERSE_ZERO real_inverse_gt_0) |
|
153 |
done |
|
154 |
||
155 |
lemma abs_mult_inverse: "abs (x * inverse y) = (abs x) * inverse (abs (y::real))" |
|
156 |
by (simp add: abs_mult abs_inverse) |
|
157 |
||
158 |
lemma abs_triangle_ineq: "abs(x+y) <= abs x + abs (y::real)" |
|
159 |
by (unfold real_abs_def, simp) |
|
160 |
||
161 |
(*Unused, but perhaps interesting as an example*) |
|
162 |
lemma abs_triangle_ineq_four: "abs(w + x + y + z) <= abs(w) + abs(x) + abs(y) + abs(z::real)" |
|
163 |
by (simp add: abs_triangle_ineq [THEN order_trans]) |
|
164 |
||
165 |
lemma abs_minus_cancel: "abs(-x)=abs(x::real)" |
|
166 |
by (unfold real_abs_def, simp) |
|
167 |
declare abs_minus_cancel [simp] |
|
168 |
||
169 |
lemma abs_minus_add_cancel: "abs(x + (-y)) = abs (y + (-(x::real)))" |
|
170 |
by (unfold real_abs_def, simp) |
|
171 |
||
172 |
lemma abs_triangle_minus_ineq: "abs(x + (-y)) <= abs x + abs (y::real)" |
|
173 |
by (unfold real_abs_def, simp) |
|
174 |
||
175 |
lemma abs_add_less [rule_format (no_asm)]: "abs x < r --> abs y < s --> abs(x+y) < r+(s::real)" |
|
176 |
by (unfold real_abs_def, simp) |
|
177 |
||
178 |
lemma abs_add_minus_less: "abs x < r --> abs y < s --> abs(x+ (-y)) < r+(s::real)" |
|
179 |
by (unfold real_abs_def, simp) |
|
180 |
||
181 |
(* lemmas manipulating terms *) |
|
182 |
lemma real_mult_0_less: "((0::real)*x < r)=(0 < r)" |
|
183 |
by simp |
|
184 |
||
185 |
lemma real_mult_less_trans: "[| (0::real) < y; x < r; y*r < t*s |] ==> y*x < t*s" |
|
186 |
by (blast intro!: real_mult_less_mono2 intro: order_less_trans) |
|
187 |
||
188 |
(*USED ONLY IN NEXT THM*) |
|
189 |
lemma real_mult_le_less_trans: |
|
190 |
"[| (0::real)<=y; x < r; y*r < t*s; 0 < t*s|] ==> y*x < t*s" |
|
191 |
apply (drule order_le_imp_less_or_eq) |
|
192 |
apply (fast elim: real_mult_0_less [THEN iffD2] real_mult_less_trans) |
|
193 |
done |
|
194 |
||
195 |
lemma abs_mult_less: "[| abs x < r; abs y < s |] ==> abs(x*y) < r*(s::real)" |
|
196 |
apply (simp add: abs_mult) |
|
197 |
apply (rule real_mult_le_less_trans) |
|
198 |
apply (rule abs_ge_zero, assumption) |
|
199 |
apply (rule_tac [2] real_mult_order) |
|
200 |
apply (auto intro!: real_mult_less_mono1 abs_ge_zero intro: order_le_less_trans) |
|
201 |
done |
|
202 |
||
203 |
lemma abs_mult_less2: "[| abs x < r; abs y < s |] ==> abs(x)*abs(y) < r*(s::real)" |
|
204 |
by (auto intro: abs_mult_less simp add: abs_mult [symmetric]) |
|
205 |
||
206 |
lemma abs_less_gt_zero: "abs(x) < r ==> (0::real) < r" |
|
207 |
by (blast intro!: order_le_less_trans abs_ge_zero) |
|
208 |
||
209 |
lemma abs_minus_one: "abs (-1) = (1::real)" |
|
210 |
by (unfold real_abs_def, simp) |
|
211 |
declare abs_minus_one [simp] |
|
212 |
||
213 |
lemma abs_disj: "abs x =x | abs x = -(x::real)" |
|
214 |
by (unfold real_abs_def, auto) |
|
215 |
||
216 |
lemma abs_interval_iff: "(abs x < r) = (-r < x & x < (r::real))" |
|
217 |
by (unfold real_abs_def, auto) |
|
218 |
||
219 |
lemma abs_le_interval_iff: "(abs x <= r) = (-r<=x & x<=(r::real))" |
|
220 |
by (unfold real_abs_def, auto) |
|
221 |
||
222 |
lemma abs_add_pos_gt_zero: "(0::real) < k ==> 0 < k + abs(x)" |
|
223 |
by (unfold real_abs_def, auto) |
|
224 |
||
225 |
lemma abs_add_one_gt_zero: "(0::real) < 1 + abs(x)" |
|
226 |
by (unfold real_abs_def, auto) |
|
227 |
declare abs_add_one_gt_zero [simp] |
|
228 |
||
229 |
lemma abs_not_less_zero: "~ abs x < (0::real)" |
|
230 |
by (unfold real_abs_def, auto) |
|
231 |
declare abs_not_less_zero [simp] |
|
232 |
||
233 |
lemma abs_circle: "abs h < abs y - abs x ==> abs (x + h) < abs (y::real)" |
|
234 |
by (auto intro: abs_triangle_ineq [THEN order_le_less_trans]) |
|
235 |
||
236 |
lemma abs_le_zero_iff: "(abs x <= (0::real)) = (x = 0)" |
|
237 |
by (unfold real_abs_def, auto) |
|
238 |
declare abs_le_zero_iff [simp] |
|
239 |
||
240 |
lemma real_0_less_abs_iff: "((0::real) < abs x) = (x ~= 0)" |
|
241 |
by (simp add: real_abs_def, arith) |
|
242 |
declare real_0_less_abs_iff [simp] |
|
243 |
||
244 |
lemma abs_real_of_nat_cancel: "abs (real x) = real (x::nat)" |
|
245 |
by (auto intro: abs_eqI1 simp add: real_of_nat_ge_zero) |
|
246 |
declare abs_real_of_nat_cancel [simp] |
|
247 |
||
248 |
lemma abs_add_one_not_less_self: "~ abs(x) + (1::real) < x" |
|
249 |
apply (rule real_leD) |
|
250 |
apply (auto intro: abs_ge_self [THEN order_trans]) |
|
251 |
done |
|
252 |
declare abs_add_one_not_less_self [simp] |
|
253 |
||
254 |
(* used in vector theory *) |
|
255 |
lemma abs_triangle_ineq_three: "abs(w + x + (y::real)) <= abs(w) + abs(x) + abs(y)" |
|
| 14270 | 256 |
by (auto intro!: abs_triangle_ineq [THEN order_trans] real_add_left_mono |
257 |
simp add: real_add_assoc) |
|
| 14269 | 258 |
|
259 |
lemma abs_diff_less_imp_gt_zero: "abs(x - y) < y ==> (0::real) < y" |
|
260 |
apply (unfold real_abs_def) |
|
261 |
apply (case_tac "0 <= x - y", auto) |
|
262 |
done |
|
263 |
||
264 |
lemma abs_diff_less_imp_gt_zero2: "abs(x - y) < x ==> (0::real) < x" |
|
265 |
apply (unfold real_abs_def) |
|
266 |
apply (case_tac "0 <= x - y", auto) |
|
267 |
done |
|
268 |
||
269 |
lemma abs_diff_less_imp_gt_zero3: "abs(x - y) < y ==> (0::real) < x" |
|
270 |
by (auto simp add: abs_interval_iff) |
|
271 |
||
272 |
lemma abs_diff_less_imp_gt_zero4: "abs(x - y) < -y ==> x < (0::real)" |
|
273 |
by (auto simp add: abs_interval_iff) |
|
274 |
||
275 |
lemma abs_triangle_ineq_minus_cancel: |
|
276 |
"abs(x) <= abs(x + (-y)) + abs((y::real))" |
|
277 |
apply (unfold real_abs_def, auto) |
|
278 |
done |
|
279 |
||
280 |
lemma abs_sum_triangle_ineq: "abs ((x::real) + y + (-l + -m)) <= abs(x + -l) + abs(y + -m)" |
|
281 |
apply (simp add: real_add_assoc) |
|
282 |
apply (rule_tac x1 = y in real_add_left_commute [THEN ssubst]) |
|
283 |
apply (rule real_add_assoc [THEN subst]) |
|
284 |
apply (rule abs_triangle_ineq) |
|
285 |
done |
|
286 |
||
| 14288 | 287 |
|
| 14269 | 288 |
ML |
289 |
{*
|
|
| 14288 | 290 |
val real_0_le_divide_iff = thm"real_0_le_divide_iff"; |
291 |
val real_add_minus_iff = thm"real_add_minus_iff"; |
|
292 |
val real_add_eq_0_iff = thm"real_add_eq_0_iff"; |
|
293 |
val real_add_less_0_iff = thm"real_add_less_0_iff"; |
|
294 |
val real_0_less_add_iff = thm"real_0_less_add_iff"; |
|
295 |
val real_add_le_0_iff = thm"real_add_le_0_iff"; |
|
296 |
val real_0_le_add_iff = thm"real_0_le_add_iff"; |
|
297 |
val real_0_less_diff_iff = thm"real_0_less_diff_iff"; |
|
298 |
val real_0_le_diff_iff = thm"real_0_le_diff_iff"; |
|
299 |
val real_divide_minus1 = thm"real_divide_minus1"; |
|
300 |
val real_minus1_divide = thm"real_minus1_divide"; |
|
301 |
val real_lbound_gt_zero = thm"real_lbound_gt_zero"; |
|
302 |
val real_less_half_sum = thm"real_less_half_sum"; |
|
303 |
val real_gt_half_sum = thm"real_gt_half_sum"; |
|
304 |
val real_dense = thm"real_dense"; |
|
305 |
||
| 14269 | 306 |
val abs_nat_number_of = thm"abs_nat_number_of"; |
307 |
val abs_split = thm"abs_split"; |
|
308 |
val abs_iff = thm"abs_iff"; |
|
309 |
val abs_zero = thm"abs_zero"; |
|
310 |
val abs_one = thm"abs_one"; |
|
311 |
val abs_eqI1 = thm"abs_eqI1"; |
|
312 |
val abs_eqI2 = thm"abs_eqI2"; |
|
313 |
val abs_minus_eqI2 = thm"abs_minus_eqI2"; |
|
314 |
val abs_minus_eqI1 = thm"abs_minus_eqI1"; |
|
315 |
val abs_ge_zero = thm"abs_ge_zero"; |
|
316 |
val abs_idempotent = thm"abs_idempotent"; |
|
317 |
val abs_zero_iff = thm"abs_zero_iff"; |
|
318 |
val abs_ge_self = thm"abs_ge_self"; |
|
319 |
val abs_ge_minus_self = thm"abs_ge_minus_self"; |
|
320 |
val abs_mult = thm"abs_mult"; |
|
321 |
val abs_inverse = thm"abs_inverse"; |
|
322 |
val abs_mult_inverse = thm"abs_mult_inverse"; |
|
323 |
val abs_triangle_ineq = thm"abs_triangle_ineq"; |
|
324 |
val abs_triangle_ineq_four = thm"abs_triangle_ineq_four"; |
|
325 |
val abs_minus_cancel = thm"abs_minus_cancel"; |
|
326 |
val abs_minus_add_cancel = thm"abs_minus_add_cancel"; |
|
327 |
val abs_triangle_minus_ineq = thm"abs_triangle_minus_ineq"; |
|
328 |
val abs_add_less = thm"abs_add_less"; |
|
329 |
val abs_add_minus_less = thm"abs_add_minus_less"; |
|
330 |
val real_mult_0_less = thm"real_mult_0_less"; |
|
331 |
val real_mult_less_trans = thm"real_mult_less_trans"; |
|
332 |
val real_mult_le_less_trans = thm"real_mult_le_less_trans"; |
|
333 |
val abs_mult_less = thm"abs_mult_less"; |
|
334 |
val abs_mult_less2 = thm"abs_mult_less2"; |
|
335 |
val abs_less_gt_zero = thm"abs_less_gt_zero"; |
|
336 |
val abs_minus_one = thm"abs_minus_one"; |
|
337 |
val abs_disj = thm"abs_disj"; |
|
338 |
val abs_interval_iff = thm"abs_interval_iff"; |
|
339 |
val abs_le_interval_iff = thm"abs_le_interval_iff"; |
|
340 |
val abs_add_pos_gt_zero = thm"abs_add_pos_gt_zero"; |
|
341 |
val abs_add_one_gt_zero = thm"abs_add_one_gt_zero"; |
|
342 |
val abs_not_less_zero = thm"abs_not_less_zero"; |
|
343 |
val abs_circle = thm"abs_circle"; |
|
344 |
val abs_le_zero_iff = thm"abs_le_zero_iff"; |
|
345 |
val real_0_less_abs_iff = thm"real_0_less_abs_iff"; |
|
346 |
val abs_real_of_nat_cancel = thm"abs_real_of_nat_cancel"; |
|
347 |
val abs_add_one_not_less_self = thm"abs_add_one_not_less_self"; |
|
348 |
val abs_triangle_ineq_three = thm"abs_triangle_ineq_three"; |
|
349 |
val abs_diff_less_imp_gt_zero = thm"abs_diff_less_imp_gt_zero"; |
|
350 |
val abs_diff_less_imp_gt_zero2 = thm"abs_diff_less_imp_gt_zero2"; |
|
351 |
val abs_diff_less_imp_gt_zero3 = thm"abs_diff_less_imp_gt_zero3"; |
|
352 |
val abs_diff_less_imp_gt_zero4 = thm"abs_diff_less_imp_gt_zero4"; |
|
353 |
val abs_triangle_ineq_minus_cancel = thm"abs_triangle_ineq_minus_cancel"; |
|
354 |
val abs_sum_triangle_ineq = thm"abs_sum_triangle_ineq"; |
|
355 |
*} |
|
356 |
||
|
9436
62bb04ab4b01
rearranged setup of arithmetic procedures, avoiding global reference values;
wenzelm
parents:
diff
changeset
|
357 |
end |