move Lubs from HOL to HOL-Library (replaced by conditionally complete lattices)
1 (* Title: HOL/NSA/NSA.thy
2 Author: Jacques D. Fleuriot, University of Cambridge
3 Author: Lawrence C Paulson, University of Cambridge
6 header{*Infinite Numbers, Infinitesimals, Infinitely Close Relation*}
9 imports HyperDef "~~/src/HOL/Library/Lubs_Glbs"
13 hnorm :: "'a::real_normed_vector star \<Rightarrow> real star" where
14 [transfer_unfold]: "hnorm = *f* norm"
17 Infinitesimal :: "('a::real_normed_vector) star set" where
18 "Infinitesimal = {x. \<forall>r \<in> Reals. 0 < r --> hnorm x < r}"
21 HFinite :: "('a::real_normed_vector) star set" where
22 "HFinite = {x. \<exists>r \<in> Reals. hnorm x < r}"
25 HInfinite :: "('a::real_normed_vector) star set" where
26 "HInfinite = {x. \<forall>r \<in> Reals. r < hnorm x}"
29 approx :: "['a::real_normed_vector star, 'a star] => bool" (infixl "@=" 50) where
30 --{*the `infinitely close' relation*}
31 "(x @= y) = ((x - y) \<in> Infinitesimal)"
34 st :: "hypreal => hypreal" where
35 --{*the standard part of a hyperreal*}
36 "st = (%x. @r. x \<in> HFinite & r \<in> Reals & r @= x)"
39 monad :: "'a::real_normed_vector star => 'a star set" where
40 "monad x = {y. x @= y}"
43 galaxy :: "'a::real_normed_vector star => 'a star set" where
44 "galaxy x = {y. (x + -y) \<in> HFinite}"
47 approx (infixl "\<approx>" 50)
49 notation (HTML output)
50 approx (infixl "\<approx>" 50)
52 lemma SReal_def: "Reals == {x. \<exists>r. x = hypreal_of_real r}"
53 by (simp add: Reals_def image_def)
55 subsection {* Nonstandard Extension of the Norm Function *}
58 scaleHR :: "real star \<Rightarrow> 'a star \<Rightarrow> 'a::real_normed_vector star" where
59 [transfer_unfold]: "scaleHR = starfun2 scaleR"
61 lemma Standard_hnorm [simp]: "x \<in> Standard \<Longrightarrow> hnorm x \<in> Standard"
62 by (simp add: hnorm_def)
64 lemma star_of_norm [simp]: "star_of (norm x) = hnorm (star_of x)"
65 by transfer (rule refl)
67 lemma hnorm_ge_zero [simp]:
68 "\<And>x::'a::real_normed_vector star. 0 \<le> hnorm x"
69 by transfer (rule norm_ge_zero)
71 lemma hnorm_eq_zero [simp]:
72 "\<And>x::'a::real_normed_vector star. (hnorm x = 0) = (x = 0)"
73 by transfer (rule norm_eq_zero)
75 lemma hnorm_triangle_ineq:
76 "\<And>x y::'a::real_normed_vector star. hnorm (x + y) \<le> hnorm x + hnorm y"
77 by transfer (rule norm_triangle_ineq)
79 lemma hnorm_triangle_ineq3:
80 "\<And>x y::'a::real_normed_vector star. \<bar>hnorm x - hnorm y\<bar> \<le> hnorm (x - y)"
81 by transfer (rule norm_triangle_ineq3)
84 "\<And>x::'a::real_normed_vector star.
85 hnorm (a *\<^sub>R x) = \<bar>star_of a\<bar> * hnorm x"
86 by transfer (rule norm_scaleR)
89 "\<And>a (x::'a::real_normed_vector star).
90 hnorm (scaleHR a x) = \<bar>a\<bar> * hnorm x"
91 by transfer (rule norm_scaleR)
93 lemma hnorm_mult_ineq:
94 "\<And>x y::'a::real_normed_algebra star. hnorm (x * y) \<le> hnorm x * hnorm y"
95 by transfer (rule norm_mult_ineq)
98 "\<And>x y::'a::real_normed_div_algebra star. hnorm (x * y) = hnorm x * hnorm y"
99 by transfer (rule norm_mult)
101 lemma hnorm_hyperpow:
102 "\<And>(x::'a::{real_normed_div_algebra} star) n.
103 hnorm (x pow n) = hnorm x pow n"
104 by transfer (rule norm_power)
106 lemma hnorm_one [simp]:
107 "hnorm (1\<Colon>'a::real_normed_div_algebra star) = 1"
108 by transfer (rule norm_one)
110 lemma hnorm_zero [simp]:
111 "hnorm (0\<Colon>'a::real_normed_vector star) = 0"
112 by transfer (rule norm_zero)
114 lemma zero_less_hnorm_iff [simp]:
115 "\<And>x::'a::real_normed_vector star. (0 < hnorm x) = (x \<noteq> 0)"
116 by transfer (rule zero_less_norm_iff)
118 lemma hnorm_minus_cancel [simp]:
119 "\<And>x::'a::real_normed_vector star. hnorm (- x) = hnorm x"
120 by transfer (rule norm_minus_cancel)
122 lemma hnorm_minus_commute:
123 "\<And>a b::'a::real_normed_vector star. hnorm (a - b) = hnorm (b - a)"
124 by transfer (rule norm_minus_commute)
126 lemma hnorm_triangle_ineq2:
127 "\<And>a b::'a::real_normed_vector star. hnorm a - hnorm b \<le> hnorm (a - b)"
128 by transfer (rule norm_triangle_ineq2)
130 lemma hnorm_triangle_ineq4:
131 "\<And>a b::'a::real_normed_vector star. hnorm (a - b) \<le> hnorm a + hnorm b"
132 by transfer (rule norm_triangle_ineq4)
134 lemma abs_hnorm_cancel [simp]:
135 "\<And>a::'a::real_normed_vector star. \<bar>hnorm a\<bar> = hnorm a"
136 by transfer (rule abs_norm_cancel)
138 lemma hnorm_of_hypreal [simp]:
139 "\<And>r. hnorm (of_hypreal r::'a::real_normed_algebra_1 star) = \<bar>r\<bar>"
140 by transfer (rule norm_of_real)
142 lemma nonzero_hnorm_inverse:
143 "\<And>a::'a::real_normed_div_algebra star.
144 a \<noteq> 0 \<Longrightarrow> hnorm (inverse a) = inverse (hnorm a)"
145 by transfer (rule nonzero_norm_inverse)
148 "\<And>a::'a::{real_normed_div_algebra, division_ring_inverse_zero} star.
149 hnorm (inverse a) = inverse (hnorm a)"
150 by transfer (rule norm_inverse)
153 "\<And>a b::'a::{real_normed_field, field_inverse_zero} star.
154 hnorm (a / b) = hnorm a / hnorm b"
155 by transfer (rule norm_divide)
157 lemma hypreal_hnorm_def [simp]:
158 "\<And>r::hypreal. hnorm r = \<bar>r\<bar>"
159 by transfer (rule real_norm_def)
161 lemma hnorm_add_less:
162 "\<And>(x::'a::real_normed_vector star) y r s.
163 \<lbrakk>hnorm x < r; hnorm y < s\<rbrakk> \<Longrightarrow> hnorm (x + y) < r + s"
164 by transfer (rule norm_add_less)
166 lemma hnorm_mult_less:
167 "\<And>(x::'a::real_normed_algebra star) y r s.
168 \<lbrakk>hnorm x < r; hnorm y < s\<rbrakk> \<Longrightarrow> hnorm (x * y) < r * s"
169 by transfer (rule norm_mult_less)
171 lemma hnorm_scaleHR_less:
172 "\<lbrakk>\<bar>x\<bar> < r; hnorm y < s\<rbrakk> \<Longrightarrow> hnorm (scaleHR x y) < r * s"
173 apply (simp only: hnorm_scaleHR)
174 apply (simp add: mult_strict_mono')
177 subsection{*Closure Laws for the Standard Reals*}
179 lemma Reals_minus_iff [simp]: "(-x \<in> Reals) = (x \<in> Reals)"
181 apply (drule Reals_minus, auto)
184 lemma Reals_add_cancel: "\<lbrakk>x + y \<in> Reals; y \<in> Reals\<rbrakk> \<Longrightarrow> x \<in> Reals"
185 by (drule (1) Reals_diff, simp)
187 lemma SReal_hrabs: "(x::hypreal) \<in> Reals ==> abs x \<in> Reals"
188 by (simp add: Reals_eq_Standard)
190 lemma SReal_hypreal_of_real [simp]: "hypreal_of_real x \<in> Reals"
191 by (simp add: Reals_eq_Standard)
193 lemma SReal_divide_numeral: "r \<in> Reals ==> r/(numeral w::hypreal) \<in> Reals"
196 text{*epsilon is not in Reals because it is an infinitesimal*}
197 lemma SReal_epsilon_not_mem: "epsilon \<notin> Reals"
198 apply (simp add: SReal_def)
199 apply (auto simp add: hypreal_of_real_not_eq_epsilon [THEN not_sym])
202 lemma SReal_omega_not_mem: "omega \<notin> Reals"
203 apply (simp add: SReal_def)
204 apply (auto simp add: hypreal_of_real_not_eq_omega [THEN not_sym])
207 lemma SReal_UNIV_real: "{x. hypreal_of_real x \<in> Reals} = (UNIV::real set)"
210 lemma SReal_iff: "(x \<in> Reals) = (\<exists>y. x = hypreal_of_real y)"
211 by (simp add: SReal_def)
213 lemma hypreal_of_real_image: "hypreal_of_real `(UNIV::real set) = Reals"
214 by (simp add: Reals_eq_Standard Standard_def)
216 lemma inv_hypreal_of_real_image: "inv hypreal_of_real ` Reals = UNIV"
217 apply (auto simp add: SReal_def)
218 apply (rule inj_star_of [THEN inv_f_f, THEN subst], blast)
221 lemma SReal_hypreal_of_real_image:
222 "[| \<exists>x. x: P; P \<subseteq> Reals |] ==> \<exists>Q. P = hypreal_of_real ` Q"
223 by (simp add: SReal_def image_def, blast)
226 "[| (x::hypreal) \<in> Reals; y \<in> Reals; x<y |] ==> \<exists>r \<in> Reals. x<r & r<y"
227 apply (auto simp add: SReal_def)
228 apply (drule dense, auto)
231 text{*Completeness of Reals, but both lemmas are unused.*}
233 lemma SReal_sup_lemma:
234 "P \<subseteq> Reals ==> ((\<exists>x \<in> P. y < x) =
235 (\<exists>X. hypreal_of_real X \<in> P & y < hypreal_of_real X))"
236 by (blast dest!: SReal_iff [THEN iffD1])
238 lemma SReal_sup_lemma2:
239 "[| P \<subseteq> Reals; \<exists>x. x \<in> P; \<exists>y \<in> Reals. \<forall>x \<in> P. x < y |]
240 ==> (\<exists>X. X \<in> {w. hypreal_of_real w \<in> P}) &
241 (\<exists>Y. \<forall>X \<in> {w. hypreal_of_real w \<in> P}. X < Y)"
243 apply (fast dest!: SReal_iff [THEN iffD1])
244 apply (auto, frule subsetD, assumption)
245 apply (drule SReal_iff [THEN iffD1])
246 apply (auto, rule_tac x = ya in exI, auto)
250 subsection{* Set of Finite Elements is a Subring of the Extended Reals*}
252 lemma HFinite_add: "[|x \<in> HFinite; y \<in> HFinite|] ==> (x+y) \<in> HFinite"
253 apply (simp add: HFinite_def)
254 apply (blast intro!: Reals_add hnorm_add_less)
258 fixes x y :: "'a::real_normed_algebra star"
259 shows "[|x \<in> HFinite; y \<in> HFinite|] ==> x*y \<in> HFinite"
260 apply (simp add: HFinite_def)
261 apply (blast intro!: Reals_mult hnorm_mult_less)
264 lemma HFinite_scaleHR:
265 "[|x \<in> HFinite; y \<in> HFinite|] ==> scaleHR x y \<in> HFinite"
266 apply (simp add: HFinite_def)
267 apply (blast intro!: Reals_mult hnorm_scaleHR_less)
270 lemma HFinite_minus_iff: "(-x \<in> HFinite) = (x \<in> HFinite)"
271 by (simp add: HFinite_def)
273 lemma HFinite_star_of [simp]: "star_of x \<in> HFinite"
274 apply (simp add: HFinite_def)
275 apply (rule_tac x="star_of (norm x) + 1" in bexI)
276 apply (transfer, simp)
277 apply (blast intro: Reals_add SReal_hypreal_of_real Reals_1)
280 lemma SReal_subset_HFinite: "(Reals::hypreal set) \<subseteq> HFinite"
281 by (auto simp add: SReal_def)
283 lemma HFiniteD: "x \<in> HFinite ==> \<exists>t \<in> Reals. hnorm x < t"
284 by (simp add: HFinite_def)
286 lemma HFinite_hrabs_iff [iff]: "(abs (x::hypreal) \<in> HFinite) = (x \<in> HFinite)"
287 by (simp add: HFinite_def)
289 lemma HFinite_hnorm_iff [iff]:
290 "(hnorm (x::hypreal) \<in> HFinite) = (x \<in> HFinite)"
291 by (simp add: HFinite_def)
293 lemma HFinite_numeral [simp]: "numeral w \<in> HFinite"
294 unfolding star_numeral_def by (rule HFinite_star_of)
296 (** As always with numerals, 0 and 1 are special cases **)
298 lemma HFinite_0 [simp]: "0 \<in> HFinite"
299 unfolding star_zero_def by (rule HFinite_star_of)
301 lemma HFinite_1 [simp]: "1 \<in> HFinite"
302 unfolding star_one_def by (rule HFinite_star_of)
304 lemma hrealpow_HFinite:
305 fixes x :: "'a::{real_normed_algebra,monoid_mult} star"
306 shows "x \<in> HFinite ==> x ^ n \<in> HFinite"
308 apply (auto simp add: power_Suc intro: HFinite_mult)
311 lemma HFinite_bounded:
312 "[|(x::hypreal) \<in> HFinite; y \<le> x; 0 \<le> y |] ==> y \<in> HFinite"
313 apply (cases "x \<le> 0")
314 apply (drule_tac y = x in order_trans)
315 apply (drule_tac [2] order_antisym)
316 apply (auto simp add: linorder_not_le)
317 apply (auto intro: order_le_less_trans simp add: abs_if HFinite_def)
321 subsection{* Set of Infinitesimals is a Subring of the Hyperreals*}
323 lemma InfinitesimalI:
324 "(\<And>r. \<lbrakk>r \<in> \<real>; 0 < r\<rbrakk> \<Longrightarrow> hnorm x < r) \<Longrightarrow> x \<in> Infinitesimal"
325 by (simp add: Infinitesimal_def)
327 lemma InfinitesimalD:
328 "x \<in> Infinitesimal ==> \<forall>r \<in> Reals. 0 < r --> hnorm x < r"
329 by (simp add: Infinitesimal_def)
331 lemma InfinitesimalI2:
332 "(\<And>r. 0 < r \<Longrightarrow> hnorm x < star_of r) \<Longrightarrow> x \<in> Infinitesimal"
333 by (auto simp add: Infinitesimal_def SReal_def)
335 lemma InfinitesimalD2:
336 "\<lbrakk>x \<in> Infinitesimal; 0 < r\<rbrakk> \<Longrightarrow> hnorm x < star_of r"
337 by (auto simp add: Infinitesimal_def SReal_def)
339 lemma Infinitesimal_zero [iff]: "0 \<in> Infinitesimal"
340 by (simp add: Infinitesimal_def)
342 lemma hypreal_sum_of_halves: "x/(2::hypreal) + x/(2::hypreal) = x"
345 lemma Infinitesimal_add:
346 "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> (x+y) \<in> Infinitesimal"
347 apply (rule InfinitesimalI)
348 apply (rule hypreal_sum_of_halves [THEN subst])
349 apply (drule half_gt_zero)
350 apply (blast intro: hnorm_add_less SReal_divide_numeral dest: InfinitesimalD)
353 lemma Infinitesimal_minus_iff [simp]: "(-x:Infinitesimal) = (x:Infinitesimal)"
354 by (simp add: Infinitesimal_def)
356 lemma Infinitesimal_hnorm_iff:
357 "(hnorm x \<in> Infinitesimal) = (x \<in> Infinitesimal)"
358 by (simp add: Infinitesimal_def)
360 lemma Infinitesimal_hrabs_iff [iff]:
361 "(abs (x::hypreal) \<in> Infinitesimal) = (x \<in> Infinitesimal)"
362 by (simp add: abs_if)
364 lemma Infinitesimal_of_hypreal_iff [simp]:
365 "((of_hypreal x::'a::real_normed_algebra_1 star) \<in> Infinitesimal) =
366 (x \<in> Infinitesimal)"
367 by (subst Infinitesimal_hnorm_iff [symmetric], simp)
369 lemma Infinitesimal_diff:
370 "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> x-y \<in> Infinitesimal"
371 using Infinitesimal_add [of x "- y"] by simp
373 lemma Infinitesimal_mult:
374 fixes x y :: "'a::real_normed_algebra star"
375 shows "[|x \<in> Infinitesimal; y \<in> Infinitesimal|] ==> (x * y) \<in> Infinitesimal"
376 apply (rule InfinitesimalI)
377 apply (subgoal_tac "hnorm (x * y) < 1 * r", simp only: mult_1)
378 apply (rule hnorm_mult_less)
379 apply (simp_all add: InfinitesimalD)
382 lemma Infinitesimal_HFinite_mult:
383 fixes x y :: "'a::real_normed_algebra star"
384 shows "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (x * y) \<in> Infinitesimal"
385 apply (rule InfinitesimalI)
386 apply (drule HFiniteD, clarify)
387 apply (subgoal_tac "0 < t")
388 apply (subgoal_tac "hnorm (x * y) < (r / t) * t", simp)
389 apply (subgoal_tac "0 < r / t")
390 apply (rule hnorm_mult_less)
391 apply (simp add: InfinitesimalD Reals_divide)
393 apply (simp only: divide_pos_pos)
394 apply (erule order_le_less_trans [OF hnorm_ge_zero])
397 lemma Infinitesimal_HFinite_scaleHR:
398 "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> scaleHR x y \<in> Infinitesimal"
399 apply (rule InfinitesimalI)
400 apply (drule HFiniteD, clarify)
401 apply (drule InfinitesimalD)
402 apply (simp add: hnorm_scaleHR)
403 apply (subgoal_tac "0 < t")
404 apply (subgoal_tac "\<bar>x\<bar> * hnorm y < (r / t) * t", simp)
405 apply (subgoal_tac "0 < r / t")
406 apply (rule mult_strict_mono', simp_all)
407 apply (simp only: divide_pos_pos)
408 apply (erule order_le_less_trans [OF hnorm_ge_zero])
411 lemma Infinitesimal_HFinite_mult2:
412 fixes x y :: "'a::real_normed_algebra star"
413 shows "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (y * x) \<in> Infinitesimal"
414 apply (rule InfinitesimalI)
415 apply (drule HFiniteD, clarify)
416 apply (subgoal_tac "0 < t")
417 apply (subgoal_tac "hnorm (y * x) < t * (r / t)", simp)
418 apply (subgoal_tac "0 < r / t")
419 apply (rule hnorm_mult_less)
421 apply (simp add: InfinitesimalD Reals_divide)
422 apply (simp only: divide_pos_pos)
423 apply (erule order_le_less_trans [OF hnorm_ge_zero])
426 lemma Infinitesimal_scaleR2:
427 "x \<in> Infinitesimal ==> a *\<^sub>R x \<in> Infinitesimal"
428 apply (case_tac "a = 0", simp)
429 apply (rule InfinitesimalI)
430 apply (drule InfinitesimalD)
431 apply (drule_tac x="r / \<bar>star_of a\<bar>" in bspec)
432 apply (simp add: Reals_eq_Standard)
433 apply (simp add: divide_pos_pos)
434 apply (simp add: hnorm_scaleR pos_less_divide_eq mult_commute)
437 lemma Compl_HFinite: "- HFinite = HInfinite"
438 apply (auto simp add: HInfinite_def HFinite_def linorder_not_less)
439 apply (rule_tac y="r + 1" in order_less_le_trans, simp)
443 lemma HInfinite_inverse_Infinitesimal:
444 fixes x :: "'a::real_normed_div_algebra star"
445 shows "x \<in> HInfinite ==> inverse x \<in> Infinitesimal"
446 apply (rule InfinitesimalI)
447 apply (subgoal_tac "x \<noteq> 0")
448 apply (rule inverse_less_imp_less)
449 apply (simp add: nonzero_hnorm_inverse)
450 apply (simp add: HInfinite_def Reals_inverse)
452 apply (clarify, simp add: Compl_HFinite [symmetric])
455 lemma HInfiniteI: "(\<And>r. r \<in> \<real> \<Longrightarrow> r < hnorm x) \<Longrightarrow> x \<in> HInfinite"
456 by (simp add: HInfinite_def)
458 lemma HInfiniteD: "\<lbrakk>x \<in> HInfinite; r \<in> \<real>\<rbrakk> \<Longrightarrow> r < hnorm x"
459 by (simp add: HInfinite_def)
461 lemma HInfinite_mult:
462 fixes x y :: "'a::real_normed_div_algebra star"
463 shows "[|x \<in> HInfinite; y \<in> HInfinite|] ==> (x*y) \<in> HInfinite"
464 apply (rule HInfiniteI, simp only: hnorm_mult)
465 apply (subgoal_tac "r * 1 < hnorm x * hnorm y", simp only: mult_1)
466 apply (case_tac "x = 0", simp add: HInfinite_def)
467 apply (rule mult_strict_mono)
468 apply (simp_all add: HInfiniteD)
471 lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) \<le> y|] ==> r < x+y"
472 by (auto dest: add_less_le_mono)
474 lemma HInfinite_add_ge_zero:
475 "[|(x::hypreal) \<in> HInfinite; 0 \<le> y; 0 \<le> x|] ==> (x + y): HInfinite"
476 by (auto intro!: hypreal_add_zero_less_le_mono
477 simp add: abs_if add_commute add_nonneg_nonneg HInfinite_def)
479 lemma HInfinite_add_ge_zero2:
480 "[|(x::hypreal) \<in> HInfinite; 0 \<le> y; 0 \<le> x|] ==> (y + x): HInfinite"
481 by (auto intro!: HInfinite_add_ge_zero simp add: add_commute)
483 lemma HInfinite_add_gt_zero:
484 "[|(x::hypreal) \<in> HInfinite; 0 < y; 0 < x|] ==> (x + y): HInfinite"
485 by (blast intro: HInfinite_add_ge_zero order_less_imp_le)
487 lemma HInfinite_minus_iff: "(-x \<in> HInfinite) = (x \<in> HInfinite)"
488 by (simp add: HInfinite_def)
490 lemma HInfinite_add_le_zero:
491 "[|(x::hypreal) \<in> HInfinite; y \<le> 0; x \<le> 0|] ==> (x + y): HInfinite"
492 apply (drule HInfinite_minus_iff [THEN iffD2])
493 apply (rule HInfinite_minus_iff [THEN iffD1])
494 apply (simp only: minus_add add.commute)
495 apply (rule HInfinite_add_ge_zero)
499 lemma HInfinite_add_lt_zero:
500 "[|(x::hypreal) \<in> HInfinite; y < 0; x < 0|] ==> (x + y): HInfinite"
501 by (blast intro: HInfinite_add_le_zero order_less_imp_le)
503 lemma HFinite_sum_squares:
504 fixes a b c :: "'a::real_normed_algebra star"
505 shows "[|a: HFinite; b: HFinite; c: HFinite|]
506 ==> a*a + b*b + c*c \<in> HFinite"
507 by (auto intro: HFinite_mult HFinite_add)
509 lemma not_Infinitesimal_not_zero: "x \<notin> Infinitesimal ==> x \<noteq> 0"
512 lemma not_Infinitesimal_not_zero2: "x \<in> HFinite - Infinitesimal ==> x \<noteq> 0"
515 lemma HFinite_diff_Infinitesimal_hrabs:
516 "(x::hypreal) \<in> HFinite - Infinitesimal ==> abs x \<in> HFinite - Infinitesimal"
519 lemma hnorm_le_Infinitesimal:
520 "\<lbrakk>e \<in> Infinitesimal; hnorm x \<le> e\<rbrakk> \<Longrightarrow> x \<in> Infinitesimal"
521 by (auto simp add: Infinitesimal_def abs_less_iff)
523 lemma hnorm_less_Infinitesimal:
524 "\<lbrakk>e \<in> Infinitesimal; hnorm x < e\<rbrakk> \<Longrightarrow> x \<in> Infinitesimal"
525 by (erule hnorm_le_Infinitesimal, erule order_less_imp_le)
527 lemma hrabs_le_Infinitesimal:
528 "[| e \<in> Infinitesimal; abs (x::hypreal) \<le> e |] ==> x \<in> Infinitesimal"
529 by (erule hnorm_le_Infinitesimal, simp)
531 lemma hrabs_less_Infinitesimal:
532 "[| e \<in> Infinitesimal; abs (x::hypreal) < e |] ==> x \<in> Infinitesimal"
533 by (erule hnorm_less_Infinitesimal, simp)
535 lemma Infinitesimal_interval:
536 "[| e \<in> Infinitesimal; e' \<in> Infinitesimal; e' < x ; x < e |]
537 ==> (x::hypreal) \<in> Infinitesimal"
538 by (auto simp add: Infinitesimal_def abs_less_iff)
540 lemma Infinitesimal_interval2:
541 "[| e \<in> Infinitesimal; e' \<in> Infinitesimal;
542 e' \<le> x ; x \<le> e |] ==> (x::hypreal) \<in> Infinitesimal"
543 by (auto intro: Infinitesimal_interval simp add: order_le_less)
546 lemma lemma_Infinitesimal_hyperpow:
547 "[| (x::hypreal) \<in> Infinitesimal; 0 < N |] ==> abs (x pow N) \<le> abs x"
548 apply (unfold Infinitesimal_def)
549 apply (auto intro!: hyperpow_Suc_le_self2
550 simp add: hyperpow_hrabs [symmetric] hypnat_gt_zero_iff2 abs_ge_zero)
553 lemma Infinitesimal_hyperpow:
554 "[| (x::hypreal) \<in> Infinitesimal; 0 < N |] ==> x pow N \<in> Infinitesimal"
555 apply (rule hrabs_le_Infinitesimal)
556 apply (rule_tac [2] lemma_Infinitesimal_hyperpow, auto)
559 lemma hrealpow_hyperpow_Infinitesimal_iff:
560 "(x ^ n \<in> Infinitesimal) = (x pow (hypnat_of_nat n) \<in> Infinitesimal)"
561 by (simp only: hyperpow_hypnat_of_nat)
563 lemma Infinitesimal_hrealpow:
564 "[| (x::hypreal) \<in> Infinitesimal; 0 < n |] ==> x ^ n \<in> Infinitesimal"
565 by (simp add: hrealpow_hyperpow_Infinitesimal_iff Infinitesimal_hyperpow)
567 lemma not_Infinitesimal_mult:
568 fixes x y :: "'a::real_normed_div_algebra star"
569 shows "[| x \<notin> Infinitesimal; y \<notin> Infinitesimal|] ==> (x*y) \<notin>Infinitesimal"
570 apply (unfold Infinitesimal_def, clarify, rename_tac r s)
571 apply (simp only: linorder_not_less hnorm_mult)
572 apply (drule_tac x = "r * s" in bspec)
573 apply (fast intro: Reals_mult)
574 apply (drule mp, blast intro: mult_pos_pos)
575 apply (drule_tac c = s and d = "hnorm y" and a = r and b = "hnorm x" in mult_mono)
576 apply (simp_all (no_asm_simp))
579 lemma Infinitesimal_mult_disj:
580 fixes x y :: "'a::real_normed_div_algebra star"
581 shows "x*y \<in> Infinitesimal ==> x \<in> Infinitesimal | y \<in> Infinitesimal"
583 apply (drule de_Morgan_disj [THEN iffD1])
584 apply (fast dest: not_Infinitesimal_mult)
587 lemma HFinite_Infinitesimal_not_zero: "x \<in> HFinite-Infinitesimal ==> x \<noteq> 0"
590 lemma HFinite_Infinitesimal_diff_mult:
591 fixes x y :: "'a::real_normed_div_algebra star"
592 shows "[| x \<in> HFinite - Infinitesimal;
593 y \<in> HFinite - Infinitesimal
594 |] ==> (x*y) \<in> HFinite - Infinitesimal"
596 apply (blast dest: HFinite_mult not_Infinitesimal_mult)
599 lemma Infinitesimal_subset_HFinite:
600 "Infinitesimal \<subseteq> HFinite"
601 apply (simp add: Infinitesimal_def HFinite_def, auto)
602 apply (rule_tac x = 1 in bexI, auto)
605 lemma Infinitesimal_star_of_mult:
606 fixes x :: "'a::real_normed_algebra star"
607 shows "x \<in> Infinitesimal ==> x * star_of r \<in> Infinitesimal"
608 by (erule HFinite_star_of [THEN [2] Infinitesimal_HFinite_mult])
610 lemma Infinitesimal_star_of_mult2:
611 fixes x :: "'a::real_normed_algebra star"
612 shows "x \<in> Infinitesimal ==> star_of r * x \<in> Infinitesimal"
613 by (erule HFinite_star_of [THEN [2] Infinitesimal_HFinite_mult2])
616 subsection{*The Infinitely Close Relation*}
618 lemma mem_infmal_iff: "(x \<in> Infinitesimal) = (x @= 0)"
619 by (simp add: Infinitesimal_def approx_def)
621 lemma approx_minus_iff: " (x @= y) = (x - y @= 0)"
622 by (simp add: approx_def)
624 lemma approx_minus_iff2: " (x @= y) = (-y + x @= 0)"
625 by (simp add: approx_def add_commute)
627 lemma approx_refl [iff]: "x @= x"
628 by (simp add: approx_def Infinitesimal_def)
630 lemma hypreal_minus_distrib1: "-(y + -(x::'a::ab_group_add)) = x + -y"
631 by (simp add: add_commute)
633 lemma approx_sym: "x @= y ==> y @= x"
634 apply (simp add: approx_def)
635 apply (drule Infinitesimal_minus_iff [THEN iffD2])
639 lemma approx_trans: "[| x @= y; y @= z |] ==> x @= z"
640 apply (simp add: approx_def)
641 apply (drule (1) Infinitesimal_add)
645 lemma approx_trans2: "[| r @= x; s @= x |] ==> r @= s"
646 by (blast intro: approx_sym approx_trans)
648 lemma approx_trans3: "[| x @= r; x @= s|] ==> r @= s"
649 by (blast intro: approx_sym approx_trans)
651 lemma approx_reorient: "(x @= y) = (y @= x)"
652 by (blast intro: approx_sym)
654 (*reorientation simplification procedure: reorients (polymorphic)
655 0 = x, 1 = x, nnn = x provided x isn't 0, 1 or a numeral.*)
656 simproc_setup approx_reorient_simproc
657 ("0 @= x" | "1 @= y" | "numeral w @= z" | "neg_numeral w @= r") =
659 let val rule = @{thm approx_reorient} RS eq_reflection
660 fun proc phi ss ct = case term_of ct of
661 _ $ t $ u => if can HOLogic.dest_number u then NONE
662 else if can HOLogic.dest_number t then SOME rule else NONE
667 lemma Infinitesimal_approx_minus: "(x-y \<in> Infinitesimal) = (x @= y)"
668 by (simp add: approx_minus_iff [symmetric] mem_infmal_iff)
670 lemma approx_monad_iff: "(x @= y) = (monad(x)=monad(y))"
671 apply (simp add: monad_def)
672 apply (auto dest: approx_sym elim!: approx_trans equalityCE)
675 lemma Infinitesimal_approx:
676 "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> x @= y"
677 apply (simp add: mem_infmal_iff)
678 apply (blast intro: approx_trans approx_sym)
681 lemma approx_add: "[| a @= b; c @= d |] ==> a+c @= b+d"
682 proof (unfold approx_def)
683 assume inf: "a - b \<in> Infinitesimal" "c - d \<in> Infinitesimal"
684 have "a + c - (b + d) = (a - b) + (c - d)" by simp
685 also have "... \<in> Infinitesimal" using inf by (rule Infinitesimal_add)
686 finally show "a + c - (b + d) \<in> Infinitesimal" .
689 lemma approx_minus: "a @= b ==> -a @= -b"
690 apply (rule approx_minus_iff [THEN iffD2, THEN approx_sym])
691 apply (drule approx_minus_iff [THEN iffD1])
692 apply (simp add: add_commute)
695 lemma approx_minus2: "-a @= -b ==> a @= b"
696 by (auto dest: approx_minus)
698 lemma approx_minus_cancel [simp]: "(-a @= -b) = (a @= b)"
699 by (blast intro: approx_minus approx_minus2)
701 lemma approx_add_minus: "[| a @= b; c @= d |] ==> a + -c @= b + -d"
702 by (blast intro!: approx_add approx_minus)
704 lemma approx_diff: "[| a @= b; c @= d |] ==> a - c @= b - d"
705 using approx_add [of a b "- c" "- d"] by simp
708 fixes a b c :: "'a::real_normed_algebra star"
709 shows "[| a @= b; c: HFinite|] ==> a*c @= b*c"
710 by (simp add: approx_def Infinitesimal_HFinite_mult
711 left_diff_distrib [symmetric])
714 fixes a b c :: "'a::real_normed_algebra star"
715 shows "[|a @= b; c: HFinite|] ==> c*a @= c*b"
716 by (simp add: approx_def Infinitesimal_HFinite_mult2
717 right_diff_distrib [symmetric])
719 lemma approx_mult_subst:
720 fixes u v x y :: "'a::real_normed_algebra star"
721 shows "[|u @= v*x; x @= y; v \<in> HFinite|] ==> u @= v*y"
722 by (blast intro: approx_mult2 approx_trans)
724 lemma approx_mult_subst2:
725 fixes u v x y :: "'a::real_normed_algebra star"
726 shows "[| u @= x*v; x @= y; v \<in> HFinite |] ==> u @= y*v"
727 by (blast intro: approx_mult1 approx_trans)
729 lemma approx_mult_subst_star_of:
730 fixes u x y :: "'a::real_normed_algebra star"
731 shows "[| u @= x*star_of v; x @= y |] ==> u @= y*star_of v"
732 by (auto intro: approx_mult_subst2)
734 lemma approx_eq_imp: "a = b ==> a @= b"
735 by (simp add: approx_def)
737 lemma Infinitesimal_minus_approx: "x \<in> Infinitesimal ==> -x @= x"
738 by (blast intro: Infinitesimal_minus_iff [THEN iffD2]
739 mem_infmal_iff [THEN iffD1] approx_trans2)
741 lemma bex_Infinitesimal_iff: "(\<exists>y \<in> Infinitesimal. x - z = y) = (x @= z)"
742 by (simp add: approx_def)
744 lemma bex_Infinitesimal_iff2: "(\<exists>y \<in> Infinitesimal. x = z + y) = (x @= z)"
745 by (force simp add: bex_Infinitesimal_iff [symmetric])
747 lemma Infinitesimal_add_approx: "[| y \<in> Infinitesimal; x + y = z |] ==> x @= z"
748 apply (rule bex_Infinitesimal_iff [THEN iffD1])
749 apply (drule Infinitesimal_minus_iff [THEN iffD2])
750 apply (auto simp add: add_assoc [symmetric])
753 lemma Infinitesimal_add_approx_self: "y \<in> Infinitesimal ==> x @= x + y"
754 apply (rule bex_Infinitesimal_iff [THEN iffD1])
755 apply (drule Infinitesimal_minus_iff [THEN iffD2])
756 apply (auto simp add: add_assoc [symmetric])
759 lemma Infinitesimal_add_approx_self2: "y \<in> Infinitesimal ==> x @= y + x"
760 by (auto dest: Infinitesimal_add_approx_self simp add: add_commute)
762 lemma Infinitesimal_add_minus_approx_self: "y \<in> Infinitesimal ==> x @= x + -y"
763 by (blast intro!: Infinitesimal_add_approx_self Infinitesimal_minus_iff [THEN iffD2])
765 lemma Infinitesimal_add_cancel: "[| y \<in> Infinitesimal; x+y @= z|] ==> x @= z"
766 apply (drule_tac x = x in Infinitesimal_add_approx_self [THEN approx_sym])
767 apply (erule approx_trans3 [THEN approx_sym], assumption)
770 lemma Infinitesimal_add_right_cancel:
771 "[| y \<in> Infinitesimal; x @= z + y|] ==> x @= z"
772 apply (drule_tac x = z in Infinitesimal_add_approx_self2 [THEN approx_sym])
773 apply (erule approx_trans3 [THEN approx_sym])
774 apply (simp add: add_commute)
775 apply (erule approx_sym)
778 lemma approx_add_left_cancel: "d + b @= d + c ==> b @= c"
779 apply (drule approx_minus_iff [THEN iffD1])
780 apply (simp add: approx_minus_iff [symmetric] add_ac)
783 lemma approx_add_right_cancel: "b + d @= c + d ==> b @= c"
784 apply (rule approx_add_left_cancel)
785 apply (simp add: add_commute)
788 lemma approx_add_mono1: "b @= c ==> d + b @= d + c"
789 apply (rule approx_minus_iff [THEN iffD2])
790 apply (simp add: approx_minus_iff [symmetric] add_ac)
793 lemma approx_add_mono2: "b @= c ==> b + a @= c + a"
794 by (simp add: add_commute approx_add_mono1)
796 lemma approx_add_left_iff [simp]: "(a + b @= a + c) = (b @= c)"
797 by (fast elim: approx_add_left_cancel approx_add_mono1)
799 lemma approx_add_right_iff [simp]: "(b + a @= c + a) = (b @= c)"
800 by (simp add: add_commute)
802 lemma approx_HFinite: "[| x \<in> HFinite; x @= y |] ==> y \<in> HFinite"
803 apply (drule bex_Infinitesimal_iff2 [THEN iffD2], safe)
804 apply (drule Infinitesimal_subset_HFinite [THEN subsetD, THEN HFinite_minus_iff [THEN iffD2]])
805 apply (drule HFinite_add)
806 apply (auto simp add: add_assoc)
809 lemma approx_star_of_HFinite: "x @= star_of D ==> x \<in> HFinite"
810 by (rule approx_sym [THEN [2] approx_HFinite], auto)
812 lemma approx_mult_HFinite:
813 fixes a b c d :: "'a::real_normed_algebra star"
814 shows "[|a @= b; c @= d; b: HFinite; d: HFinite|] ==> a*c @= b*d"
815 apply (rule approx_trans)
816 apply (rule_tac [2] approx_mult2)
817 apply (rule approx_mult1)
818 prefer 2 apply (blast intro: approx_HFinite approx_sym, auto)
821 lemma scaleHR_left_diff_distrib:
822 "\<And>a b x. scaleHR (a - b) x = scaleHR a x - scaleHR b x"
823 by transfer (rule scaleR_left_diff_distrib)
825 lemma approx_scaleR1:
826 "[| a @= star_of b; c: HFinite|] ==> scaleHR a c @= b *\<^sub>R c"
827 apply (unfold approx_def)
828 apply (drule (1) Infinitesimal_HFinite_scaleHR)
829 apply (simp only: scaleHR_left_diff_distrib)
830 apply (simp add: scaleHR_def star_scaleR_def [symmetric])
833 lemma approx_scaleR2:
834 "a @= b ==> c *\<^sub>R a @= c *\<^sub>R b"
835 by (simp add: approx_def Infinitesimal_scaleR2
836 scaleR_right_diff_distrib [symmetric])
838 lemma approx_scaleR_HFinite:
839 "[|a @= star_of b; c @= d; d: HFinite|] ==> scaleHR a c @= b *\<^sub>R d"
840 apply (rule approx_trans)
841 apply (rule_tac [2] approx_scaleR2)
842 apply (rule approx_scaleR1)
843 prefer 2 apply (blast intro: approx_HFinite approx_sym, auto)
846 lemma approx_mult_star_of:
847 fixes a c :: "'a::real_normed_algebra star"
848 shows "[|a @= star_of b; c @= star_of d |]
849 ==> a*c @= star_of b*star_of d"
850 by (blast intro!: approx_mult_HFinite approx_star_of_HFinite HFinite_star_of)
852 lemma approx_SReal_mult_cancel_zero:
853 "[| (a::hypreal) \<in> Reals; a \<noteq> 0; a*x @= 0 |] ==> x @= 0"
854 apply (drule Reals_inverse [THEN SReal_subset_HFinite [THEN subsetD]])
855 apply (auto dest: approx_mult2 simp add: mult_assoc [symmetric])
858 lemma approx_mult_SReal1: "[| (a::hypreal) \<in> Reals; x @= 0 |] ==> x*a @= 0"
859 by (auto dest: SReal_subset_HFinite [THEN subsetD] approx_mult1)
861 lemma approx_mult_SReal2: "[| (a::hypreal) \<in> Reals; x @= 0 |] ==> a*x @= 0"
862 by (auto dest: SReal_subset_HFinite [THEN subsetD] approx_mult2)
864 lemma approx_mult_SReal_zero_cancel_iff [simp]:
865 "[|(a::hypreal) \<in> Reals; a \<noteq> 0 |] ==> (a*x @= 0) = (x @= 0)"
866 by (blast intro: approx_SReal_mult_cancel_zero approx_mult_SReal2)
868 lemma approx_SReal_mult_cancel:
869 "[| (a::hypreal) \<in> Reals; a \<noteq> 0; a* w @= a*z |] ==> w @= z"
870 apply (drule Reals_inverse [THEN SReal_subset_HFinite [THEN subsetD]])
871 apply (auto dest: approx_mult2 simp add: mult_assoc [symmetric])
874 lemma approx_SReal_mult_cancel_iff1 [simp]:
875 "[| (a::hypreal) \<in> Reals; a \<noteq> 0|] ==> (a* w @= a*z) = (w @= z)"
876 by (auto intro!: approx_mult2 SReal_subset_HFinite [THEN subsetD]
877 intro: approx_SReal_mult_cancel)
879 lemma approx_le_bound: "[| (z::hypreal) \<le> f; f @= g; g \<le> z |] ==> f @= z"
880 apply (simp add: bex_Infinitesimal_iff2 [symmetric], auto)
881 apply (rule_tac x = "g+y-z" in bexI)
882 apply (simp (no_asm))
883 apply (rule Infinitesimal_interval2)
884 apply (rule_tac [2] Infinitesimal_zero, auto)
888 fixes x y :: "'a::real_normed_vector star"
889 shows "x \<approx> y \<Longrightarrow> hnorm x \<approx> hnorm y"
890 proof (unfold approx_def)
891 assume "x - y \<in> Infinitesimal"
892 hence 1: "hnorm (x - y) \<in> Infinitesimal"
893 by (simp only: Infinitesimal_hnorm_iff)
894 moreover have 2: "(0::real star) \<in> Infinitesimal"
895 by (rule Infinitesimal_zero)
896 moreover have 3: "0 \<le> \<bar>hnorm x - hnorm y\<bar>"
897 by (rule abs_ge_zero)
898 moreover have 4: "\<bar>hnorm x - hnorm y\<bar> \<le> hnorm (x - y)"
899 by (rule hnorm_triangle_ineq3)
900 ultimately have "\<bar>hnorm x - hnorm y\<bar> \<in> Infinitesimal"
901 by (rule Infinitesimal_interval2)
902 thus "hnorm x - hnorm y \<in> Infinitesimal"
903 by (simp only: Infinitesimal_hrabs_iff)
907 subsection{* Zero is the Only Infinitesimal that is also a Real*}
909 lemma Infinitesimal_less_SReal:
910 "[| (x::hypreal) \<in> Reals; y \<in> Infinitesimal; 0 < x |] ==> y < x"
911 apply (simp add: Infinitesimal_def)
912 apply (rule abs_ge_self [THEN order_le_less_trans], auto)
915 lemma Infinitesimal_less_SReal2:
916 "(y::hypreal) \<in> Infinitesimal ==> \<forall>r \<in> Reals. 0 < r --> y < r"
917 by (blast intro: Infinitesimal_less_SReal)
919 lemma SReal_not_Infinitesimal:
920 "[| 0 < y; (y::hypreal) \<in> Reals|] ==> y \<notin> Infinitesimal"
921 apply (simp add: Infinitesimal_def)
922 apply (auto simp add: abs_if)
925 lemma SReal_minus_not_Infinitesimal:
926 "[| y < 0; (y::hypreal) \<in> Reals |] ==> y \<notin> Infinitesimal"
927 apply (subst Infinitesimal_minus_iff [symmetric])
928 apply (rule SReal_not_Infinitesimal, auto)
931 lemma SReal_Int_Infinitesimal_zero: "Reals Int Infinitesimal = {0::hypreal}"
933 apply (cut_tac x = x and y = 0 in linorder_less_linear)
934 apply (blast dest: SReal_not_Infinitesimal SReal_minus_not_Infinitesimal)
937 lemma SReal_Infinitesimal_zero:
938 "[| (x::hypreal) \<in> Reals; x \<in> Infinitesimal|] ==> x = 0"
939 by (cut_tac SReal_Int_Infinitesimal_zero, blast)
941 lemma SReal_HFinite_diff_Infinitesimal:
942 "[| (x::hypreal) \<in> Reals; x \<noteq> 0 |] ==> x \<in> HFinite - Infinitesimal"
943 by (auto dest: SReal_Infinitesimal_zero SReal_subset_HFinite [THEN subsetD])
945 lemma hypreal_of_real_HFinite_diff_Infinitesimal:
946 "hypreal_of_real x \<noteq> 0 ==> hypreal_of_real x \<in> HFinite - Infinitesimal"
947 by (rule SReal_HFinite_diff_Infinitesimal, auto)
949 lemma star_of_Infinitesimal_iff_0 [iff]:
950 "(star_of x \<in> Infinitesimal) = (x = 0)"
951 apply (auto simp add: Infinitesimal_def)
952 apply (drule_tac x="hnorm (star_of x)" in bspec)
953 apply (simp add: SReal_def)
954 apply (rule_tac x="norm x" in exI, simp)
958 lemma star_of_HFinite_diff_Infinitesimal:
959 "x \<noteq> 0 ==> star_of x \<in> HFinite - Infinitesimal"
962 lemma numeral_not_Infinitesimal [simp]:
963 "numeral w \<noteq> (0::hypreal) ==> (numeral w :: hypreal) \<notin> Infinitesimal"
964 by (fast dest: Reals_numeral [THEN SReal_Infinitesimal_zero])
966 (*again: 1 is a special case, but not 0 this time*)
967 lemma one_not_Infinitesimal [simp]:
968 "(1::'a::{real_normed_vector,zero_neq_one} star) \<notin> Infinitesimal"
969 apply (simp only: star_one_def star_of_Infinitesimal_iff_0)
973 lemma approx_SReal_not_zero:
974 "[| (y::hypreal) \<in> Reals; x @= y; y\<noteq> 0 |] ==> x \<noteq> 0"
975 apply (cut_tac x = 0 and y = y in linorder_less_linear, simp)
976 apply (blast dest: approx_sym [THEN mem_infmal_iff [THEN iffD2]] SReal_not_Infinitesimal SReal_minus_not_Infinitesimal)
979 lemma HFinite_diff_Infinitesimal_approx:
980 "[| x @= y; y \<in> HFinite - Infinitesimal |]
981 ==> x \<in> HFinite - Infinitesimal"
982 apply (auto intro: approx_sym [THEN [2] approx_HFinite]
983 simp add: mem_infmal_iff)
984 apply (drule approx_trans3, assumption)
985 apply (blast dest: approx_sym)
988 (*The premise y\<noteq>0 is essential; otherwise x/y =0 and we lose the
990 lemma Infinitesimal_ratio:
991 fixes x y :: "'a::{real_normed_div_algebra,field} star"
992 shows "[| y \<noteq> 0; y \<in> Infinitesimal; x/y \<in> HFinite |]
993 ==> x \<in> Infinitesimal"
994 apply (drule Infinitesimal_HFinite_mult2, assumption)
995 apply (simp add: divide_inverse mult_assoc)
998 lemma Infinitesimal_SReal_divide:
999 "[| (x::hypreal) \<in> Infinitesimal; y \<in> Reals |] ==> x/y \<in> Infinitesimal"
1000 apply (simp add: divide_inverse)
1001 apply (auto intro!: Infinitesimal_HFinite_mult
1002 dest!: Reals_inverse [THEN SReal_subset_HFinite [THEN subsetD]])
1005 (*------------------------------------------------------------------
1006 Standard Part Theorem: Every finite x: R* is infinitely
1007 close to a unique real number (i.e a member of Reals)
1008 ------------------------------------------------------------------*)
1010 subsection{* Uniqueness: Two Infinitely Close Reals are Equal*}
1012 lemma star_of_approx_iff [simp]: "(star_of x @= star_of y) = (x = y)"
1014 apply (simp add: approx_def)
1015 apply (simp only: star_of_diff [symmetric])
1016 apply (simp only: star_of_Infinitesimal_iff_0)
1020 lemma SReal_approx_iff:
1021 "[|(x::hypreal) \<in> Reals; y \<in> Reals|] ==> (x @= y) = (x = y)"
1023 apply (simp add: approx_def)
1024 apply (drule (1) Reals_diff)
1025 apply (drule (1) SReal_Infinitesimal_zero)
1029 lemma numeral_approx_iff [simp]:
1030 "(numeral v @= (numeral w :: 'a::{numeral,real_normed_vector} star)) =
1031 (numeral v = (numeral w :: 'a))"
1032 apply (unfold star_numeral_def)
1033 apply (rule star_of_approx_iff)
1036 (*And also for 0 @= #nn and 1 @= #nn, #nn @= 0 and #nn @= 1.*)
1038 "(numeral w @= (0::'a::{numeral,real_normed_vector} star)) =
1039 (numeral w = (0::'a))"
1040 "((0::'a::{numeral,real_normed_vector} star) @= numeral w) =
1041 (numeral w = (0::'a))"
1042 "(numeral w @= (1::'b::{numeral,one,real_normed_vector} star)) =
1043 (numeral w = (1::'b))"
1044 "((1::'b::{numeral,one,real_normed_vector} star) @= numeral w) =
1045 (numeral w = (1::'b))"
1046 "~ (0 @= (1::'c::{zero_neq_one,real_normed_vector} star))"
1047 "~ (1 @= (0::'c::{zero_neq_one,real_normed_vector} star))"
1048 apply (unfold star_numeral_def star_zero_def star_one_def)
1049 apply (unfold star_of_approx_iff)
1050 by (auto intro: sym)
1052 lemma star_of_approx_numeral_iff [simp]:
1053 "(star_of k @= numeral w) = (k = numeral w)"
1054 by (subst star_of_approx_iff [symmetric], auto)
1056 lemma star_of_approx_zero_iff [simp]: "(star_of k @= 0) = (k = 0)"
1057 by (simp_all add: star_of_approx_iff [symmetric])
1059 lemma star_of_approx_one_iff [simp]: "(star_of k @= 1) = (k = 1)"
1060 by (simp_all add: star_of_approx_iff [symmetric])
1062 lemma approx_unique_real:
1063 "[| (r::hypreal) \<in> Reals; s \<in> Reals; r @= x; s @= x|] ==> r = s"
1064 by (blast intro: SReal_approx_iff [THEN iffD1] approx_trans2)
1067 subsection{* Existence of Unique Real Infinitely Close*}
1069 subsubsection{*Lifting of the Ub and Lub Properties*}
1071 lemma hypreal_of_real_isUb_iff:
1072 "(isUb (Reals) (hypreal_of_real ` Q) (hypreal_of_real Y)) =
1073 (isUb (UNIV :: real set) Q Y)"
1074 by (simp add: isUb_def setle_def)
1076 lemma hypreal_of_real_isLub1:
1077 "isLub Reals (hypreal_of_real ` Q) (hypreal_of_real Y)
1078 ==> isLub (UNIV :: real set) Q Y"
1079 apply (simp add: isLub_def leastP_def)
1080 apply (auto intro: hypreal_of_real_isUb_iff [THEN iffD2]
1081 simp add: hypreal_of_real_isUb_iff setge_def)
1084 lemma hypreal_of_real_isLub2:
1085 "isLub (UNIV :: real set) Q Y
1086 ==> isLub Reals (hypreal_of_real ` Q) (hypreal_of_real Y)"
1087 apply (simp add: isLub_def leastP_def)
1088 apply (auto simp add: hypreal_of_real_isUb_iff setge_def)
1089 apply (frule_tac x2 = x in isUbD2a [THEN SReal_iff [THEN iffD1], THEN exE])
1090 prefer 2 apply assumption
1091 apply (drule_tac x = xa in spec)
1092 apply (auto simp add: hypreal_of_real_isUb_iff)
1095 lemma hypreal_of_real_isLub_iff:
1096 "(isLub Reals (hypreal_of_real ` Q) (hypreal_of_real Y)) =
1097 (isLub (UNIV :: real set) Q Y)"
1098 by (blast intro: hypreal_of_real_isLub1 hypreal_of_real_isLub2)
1100 lemma lemma_isUb_hypreal_of_real:
1101 "isUb Reals P Y ==> \<exists>Yo. isUb Reals P (hypreal_of_real Yo)"
1102 by (auto simp add: SReal_iff isUb_def)
1104 lemma lemma_isLub_hypreal_of_real:
1105 "isLub Reals P Y ==> \<exists>Yo. isLub Reals P (hypreal_of_real Yo)"
1106 by (auto simp add: isLub_def leastP_def isUb_def SReal_iff)
1108 lemma lemma_isLub_hypreal_of_real2:
1109 "\<exists>Yo. isLub Reals P (hypreal_of_real Yo) ==> \<exists>Y. isLub Reals P Y"
1110 by (auto simp add: isLub_def leastP_def isUb_def)
1112 lemma SReal_complete:
1113 "[| P \<subseteq> Reals; \<exists>x. x \<in> P; \<exists>Y. isUb Reals P Y |]
1114 ==> \<exists>t::hypreal. isLub Reals P t"
1115 apply (frule SReal_hypreal_of_real_image)
1116 apply (auto, drule lemma_isUb_hypreal_of_real)
1117 apply (auto intro!: reals_complete lemma_isLub_hypreal_of_real2
1118 simp add: hypreal_of_real_isLub_iff hypreal_of_real_isUb_iff)
1121 (* lemma about lubs *)
1122 lemma hypreal_isLub_unique:
1123 "[| isLub R S x; isLub R S y |] ==> x = (y::hypreal)"
1124 apply (frule isLub_isUb)
1125 apply (frule_tac x = y in isLub_isUb)
1126 apply (blast intro!: order_antisym dest!: isLub_le_isUb)
1129 lemma lemma_st_part_ub:
1130 "(x::hypreal) \<in> HFinite ==> \<exists>u. isUb Reals {s. s \<in> Reals & s < x} u"
1131 apply (drule HFiniteD, safe)
1132 apply (rule exI, rule isUbI)
1133 apply (auto intro: setleI isUbI simp add: abs_less_iff)
1136 lemma lemma_st_part_nonempty:
1137 "(x::hypreal) \<in> HFinite ==> \<exists>y. y \<in> {s. s \<in> Reals & s < x}"
1138 apply (drule HFiniteD, safe)
1139 apply (drule Reals_minus)
1140 apply (rule_tac x = "-t" in exI)
1141 apply (auto simp add: abs_less_iff)
1144 lemma lemma_st_part_subset: "{s. s \<in> Reals & s < x} \<subseteq> Reals"
1147 lemma lemma_st_part_lub:
1148 "(x::hypreal) \<in> HFinite ==> \<exists>t. isLub Reals {s. s \<in> Reals & s < x} t"
1149 by (blast intro!: SReal_complete lemma_st_part_ub lemma_st_part_nonempty lemma_st_part_subset)
1151 lemma lemma_hypreal_le_left_cancel: "((t::hypreal) + r \<le> t) = (r \<le> 0)"
1153 apply (drule_tac c = "-t" in add_left_mono)
1154 apply (drule_tac [2] c = t in add_left_mono)
1155 apply (auto simp add: add_assoc [symmetric])
1158 lemma lemma_st_part_le1:
1159 "[| (x::hypreal) \<in> HFinite; isLub Reals {s. s \<in> Reals & s < x} t;
1160 r \<in> Reals; 0 < r |] ==> x \<le> t + r"
1161 apply (frule isLubD1a)
1162 apply (rule ccontr, drule linorder_not_le [THEN iffD2])
1163 apply (drule (1) Reals_add)
1164 apply (drule_tac y = "r + t" in isLubD1 [THEN setleD], auto)
1167 lemma hypreal_setle_less_trans:
1168 "[| S *<= (x::hypreal); x < y |] ==> S *<= y"
1169 apply (simp add: setle_def)
1170 apply (auto dest!: bspec order_le_less_trans intro: order_less_imp_le)
1173 lemma hypreal_gt_isUb:
1174 "[| isUb R S (x::hypreal); x < y; y \<in> R |] ==> isUb R S y"
1175 apply (simp add: isUb_def)
1176 apply (blast intro: hypreal_setle_less_trans)
1179 lemma lemma_st_part_gt_ub:
1180 "[| (x::hypreal) \<in> HFinite; x < y; y \<in> Reals |]
1181 ==> isUb Reals {s. s \<in> Reals & s < x} y"
1182 by (auto dest: order_less_trans intro: order_less_imp_le intro!: isUbI setleI)
1184 lemma lemma_minus_le_zero: "t \<le> t + -r ==> r \<le> (0::hypreal)"
1185 apply (drule_tac c = "-t" in add_left_mono)
1186 apply (auto simp add: add_assoc [symmetric])
1189 lemma lemma_st_part_le2:
1190 "[| (x::hypreal) \<in> HFinite;
1191 isLub Reals {s. s \<in> Reals & s < x} t;
1192 r \<in> Reals; 0 < r |]
1194 apply (frule isLubD1a)
1195 apply (rule ccontr, drule linorder_not_le [THEN iffD1])
1196 apply (drule Reals_minus, drule_tac a = t in Reals_add, assumption)
1197 apply (drule lemma_st_part_gt_ub, assumption+)
1198 apply (drule isLub_le_isUb, assumption)
1199 apply (drule lemma_minus_le_zero)
1200 apply (auto dest: order_less_le_trans)
1203 lemma lemma_st_part1a:
1204 "[| (x::hypreal) \<in> HFinite;
1205 isLub Reals {s. s \<in> Reals & s < x} t;
1206 r \<in> Reals; 0 < r |]
1208 apply (subgoal_tac "x \<le> t+r")
1209 apply (auto intro: lemma_st_part_le1)
1212 lemma lemma_st_part2a:
1213 "[| (x::hypreal) \<in> HFinite;
1214 isLub Reals {s. s \<in> Reals & s < x} t;
1215 r \<in> Reals; 0 < r |]
1216 ==> -(x + -t) \<le> r"
1217 apply (subgoal_tac "(t + -r \<le> x)")
1219 apply (rule lemma_st_part_le2)
1223 lemma lemma_SReal_ub:
1224 "(x::hypreal) \<in> Reals ==> isUb Reals {s. s \<in> Reals & s < x} x"
1225 by (auto intro: isUbI setleI order_less_imp_le)
1227 lemma lemma_SReal_lub:
1228 "(x::hypreal) \<in> Reals ==> isLub Reals {s. s \<in> Reals & s < x} x"
1229 apply (auto intro!: isLubI2 lemma_SReal_ub setgeI)
1230 apply (frule isUbD2a)
1231 apply (rule_tac x = x and y = y in linorder_cases)
1232 apply (auto intro!: order_less_imp_le)
1233 apply (drule SReal_dense, assumption, assumption, safe)
1234 apply (drule_tac y = r in isUbD)
1235 apply (auto dest: order_less_le_trans)
1238 lemma lemma_st_part_not_eq1:
1239 "[| (x::hypreal) \<in> HFinite;
1240 isLub Reals {s. s \<in> Reals & s < x} t;
1241 r \<in> Reals; 0 < r |]
1242 ==> x + -t \<noteq> r"
1244 apply (frule isLubD1a [THEN Reals_minus])
1245 using Reals_add_cancel [of x "- t"] apply simp
1246 apply (drule_tac x = x in lemma_SReal_lub)
1247 apply (drule hypreal_isLub_unique, assumption, auto)
1250 lemma lemma_st_part_not_eq2:
1251 "[| (x::hypreal) \<in> HFinite;
1252 isLub Reals {s. s \<in> Reals & s < x} t;
1253 r \<in> Reals; 0 < r |]
1254 ==> -(x + -t) \<noteq> r"
1256 apply (frule isLubD1a)
1257 using Reals_add_cancel [of "- x" t] apply simp
1258 apply (drule_tac x = x in lemma_SReal_lub)
1259 apply (drule hypreal_isLub_unique, assumption, auto)
1262 lemma lemma_st_part_major:
1263 "[| (x::hypreal) \<in> HFinite;
1264 isLub Reals {s. s \<in> Reals & s < x} t;
1265 r \<in> Reals; 0 < r |]
1266 ==> abs (x - t) < r"
1267 apply (frule lemma_st_part1a)
1268 apply (frule_tac [4] lemma_st_part2a, auto)
1269 apply (drule order_le_imp_less_or_eq)+
1270 apply (auto dest: lemma_st_part_not_eq1 lemma_st_part_not_eq2 simp add: abs_less_iff)
1273 lemma lemma_st_part_major2:
1274 "[| (x::hypreal) \<in> HFinite; isLub Reals {s. s \<in> Reals & s < x} t |]
1275 ==> \<forall>r \<in> Reals. 0 < r --> abs (x - t) < r"
1276 by (blast dest!: lemma_st_part_major)
1279 text{*Existence of real and Standard Part Theorem*}
1280 lemma lemma_st_part_Ex:
1281 "(x::hypreal) \<in> HFinite
1282 ==> \<exists>t \<in> Reals. \<forall>r \<in> Reals. 0 < r --> abs (x - t) < r"
1283 apply (frule lemma_st_part_lub, safe)
1284 apply (frule isLubD1a)
1285 apply (blast dest: lemma_st_part_major2)
1289 "(x::hypreal) \<in> HFinite ==> \<exists>t \<in> Reals. x @= t"
1290 apply (simp add: approx_def Infinitesimal_def)
1291 apply (drule lemma_st_part_Ex, auto)
1294 text{*There is a unique real infinitely close*}
1295 lemma st_part_Ex1: "x \<in> HFinite ==> EX! t::hypreal. t \<in> Reals & x @= t"
1296 apply (drule st_part_Ex, safe)
1297 apply (drule_tac [2] approx_sym, drule_tac [2] approx_sym, drule_tac [2] approx_sym)
1298 apply (auto intro!: approx_unique_real)
1301 subsection{* Finite, Infinite and Infinitesimal*}
1303 lemma HFinite_Int_HInfinite_empty [simp]: "HFinite Int HInfinite = {}"
1304 apply (simp add: HFinite_def HInfinite_def)
1305 apply (auto dest: order_less_trans)
1308 lemma HFinite_not_HInfinite:
1309 assumes x: "x \<in> HFinite" shows "x \<notin> HInfinite"
1311 assume x': "x \<in> HInfinite"
1312 with x have "x \<in> HFinite \<inter> HInfinite" by blast
1316 lemma not_HFinite_HInfinite: "x\<notin> HFinite ==> x \<in> HInfinite"
1317 apply (simp add: HInfinite_def HFinite_def, auto)
1318 apply (drule_tac x = "r + 1" in bspec)
1322 lemma HInfinite_HFinite_disj: "x \<in> HInfinite | x \<in> HFinite"
1323 by (blast intro: not_HFinite_HInfinite)
1325 lemma HInfinite_HFinite_iff: "(x \<in> HInfinite) = (x \<notin> HFinite)"
1326 by (blast dest: HFinite_not_HInfinite not_HFinite_HInfinite)
1328 lemma HFinite_HInfinite_iff: "(x \<in> HFinite) = (x \<notin> HInfinite)"
1329 by (simp add: HInfinite_HFinite_iff)
1332 lemma HInfinite_diff_HFinite_Infinitesimal_disj:
1333 "x \<notin> Infinitesimal ==> x \<in> HInfinite | x \<in> HFinite - Infinitesimal"
1334 by (fast intro: not_HFinite_HInfinite)
1336 lemma HFinite_inverse:
1337 fixes x :: "'a::real_normed_div_algebra star"
1338 shows "[| x \<in> HFinite; x \<notin> Infinitesimal |] ==> inverse x \<in> HFinite"
1339 apply (subgoal_tac "x \<noteq> 0")
1340 apply (cut_tac x = "inverse x" in HInfinite_HFinite_disj)
1341 apply (auto dest!: HInfinite_inverse_Infinitesimal
1342 simp add: nonzero_inverse_inverse_eq)
1345 lemma HFinite_inverse2:
1346 fixes x :: "'a::real_normed_div_algebra star"
1347 shows "x \<in> HFinite - Infinitesimal ==> inverse x \<in> HFinite"
1348 by (blast intro: HFinite_inverse)
1350 (* stronger statement possible in fact *)
1351 lemma Infinitesimal_inverse_HFinite:
1352 fixes x :: "'a::real_normed_div_algebra star"
1353 shows "x \<notin> Infinitesimal ==> inverse(x) \<in> HFinite"
1354 apply (drule HInfinite_diff_HFinite_Infinitesimal_disj)
1355 apply (blast intro: HFinite_inverse HInfinite_inverse_Infinitesimal Infinitesimal_subset_HFinite [THEN subsetD])
1358 lemma HFinite_not_Infinitesimal_inverse:
1359 fixes x :: "'a::real_normed_div_algebra star"
1360 shows "x \<in> HFinite - Infinitesimal ==> inverse x \<in> HFinite - Infinitesimal"
1361 apply (auto intro: Infinitesimal_inverse_HFinite)
1362 apply (drule Infinitesimal_HFinite_mult2, assumption)
1363 apply (simp add: not_Infinitesimal_not_zero right_inverse)
1366 lemma approx_inverse:
1367 fixes x y :: "'a::real_normed_div_algebra star"
1369 "[| x @= y; y \<in> HFinite - Infinitesimal |]
1370 ==> inverse x @= inverse y"
1371 apply (frule HFinite_diff_Infinitesimal_approx, assumption)
1372 apply (frule not_Infinitesimal_not_zero2)
1373 apply (frule_tac x = x in not_Infinitesimal_not_zero2)
1374 apply (drule HFinite_inverse2)+
1375 apply (drule approx_mult2, assumption, auto)
1376 apply (drule_tac c = "inverse x" in approx_mult1, assumption)
1377 apply (auto intro: approx_sym simp add: mult_assoc)
1380 (*Used for NSLIM_inverse, NSLIMSEQ_inverse*)
1381 lemmas star_of_approx_inverse = star_of_HFinite_diff_Infinitesimal [THEN [2] approx_inverse]
1382 lemmas hypreal_of_real_approx_inverse = hypreal_of_real_HFinite_diff_Infinitesimal [THEN [2] approx_inverse]
1384 lemma inverse_add_Infinitesimal_approx:
1385 fixes x h :: "'a::real_normed_div_algebra star"
1387 "[| x \<in> HFinite - Infinitesimal;
1388 h \<in> Infinitesimal |] ==> inverse(x + h) @= inverse x"
1389 apply (auto intro: approx_inverse approx_sym Infinitesimal_add_approx_self)
1392 lemma inverse_add_Infinitesimal_approx2:
1393 fixes x h :: "'a::real_normed_div_algebra star"
1395 "[| x \<in> HFinite - Infinitesimal;
1396 h \<in> Infinitesimal |] ==> inverse(h + x) @= inverse x"
1397 apply (rule add_commute [THEN subst])
1398 apply (blast intro: inverse_add_Infinitesimal_approx)
1401 lemma inverse_add_Infinitesimal_approx_Infinitesimal:
1402 fixes x h :: "'a::real_normed_div_algebra star"
1404 "[| x \<in> HFinite - Infinitesimal;
1405 h \<in> Infinitesimal |] ==> inverse(x + h) - inverse x @= h"
1406 apply (rule approx_trans2)
1407 apply (auto intro: inverse_add_Infinitesimal_approx
1408 simp add: mem_infmal_iff approx_minus_iff [symmetric])
1411 lemma Infinitesimal_square_iff:
1412 fixes x :: "'a::real_normed_div_algebra star"
1413 shows "(x \<in> Infinitesimal) = (x*x \<in> Infinitesimal)"
1414 apply (auto intro: Infinitesimal_mult)
1415 apply (rule ccontr, frule Infinitesimal_inverse_HFinite)
1416 apply (frule not_Infinitesimal_not_zero)
1417 apply (auto dest: Infinitesimal_HFinite_mult simp add: mult_assoc)
1419 declare Infinitesimal_square_iff [symmetric, simp]
1421 lemma HFinite_square_iff [simp]:
1422 fixes x :: "'a::real_normed_div_algebra star"
1423 shows "(x*x \<in> HFinite) = (x \<in> HFinite)"
1424 apply (auto intro: HFinite_mult)
1425 apply (auto dest: HInfinite_mult simp add: HFinite_HInfinite_iff)
1428 lemma HInfinite_square_iff [simp]:
1429 fixes x :: "'a::real_normed_div_algebra star"
1430 shows "(x*x \<in> HInfinite) = (x \<in> HInfinite)"
1431 by (auto simp add: HInfinite_HFinite_iff)
1433 lemma approx_HFinite_mult_cancel:
1434 fixes a w z :: "'a::real_normed_div_algebra star"
1435 shows "[| a: HFinite-Infinitesimal; a* w @= a*z |] ==> w @= z"
1437 apply (frule HFinite_inverse, assumption)
1438 apply (drule not_Infinitesimal_not_zero)
1439 apply (auto dest: approx_mult2 simp add: mult_assoc [symmetric])
1442 lemma approx_HFinite_mult_cancel_iff1:
1443 fixes a w z :: "'a::real_normed_div_algebra star"
1444 shows "a: HFinite-Infinitesimal ==> (a * w @= a * z) = (w @= z)"
1445 by (auto intro: approx_mult2 approx_HFinite_mult_cancel)
1447 lemma HInfinite_HFinite_add_cancel:
1448 "[| x + y \<in> HInfinite; y \<in> HFinite |] ==> x \<in> HInfinite"
1450 apply (drule HFinite_HInfinite_iff [THEN iffD2])
1451 apply (auto dest: HFinite_add simp add: HInfinite_HFinite_iff)
1454 lemma HInfinite_HFinite_add:
1455 "[| x \<in> HInfinite; y \<in> HFinite |] ==> x + y \<in> HInfinite"
1456 apply (rule_tac y = "-y" in HInfinite_HFinite_add_cancel)
1457 apply (auto simp add: add_assoc HFinite_minus_iff)
1460 lemma HInfinite_ge_HInfinite:
1461 "[| (x::hypreal) \<in> HInfinite; x \<le> y; 0 \<le> x |] ==> y \<in> HInfinite"
1462 by (auto intro: HFinite_bounded simp add: HInfinite_HFinite_iff)
1464 lemma Infinitesimal_inverse_HInfinite:
1465 fixes x :: "'a::real_normed_div_algebra star"
1466 shows "[| x \<in> Infinitesimal; x \<noteq> 0 |] ==> inverse x \<in> HInfinite"
1467 apply (rule ccontr, drule HFinite_HInfinite_iff [THEN iffD2])
1468 apply (auto dest: Infinitesimal_HFinite_mult2)
1471 lemma HInfinite_HFinite_not_Infinitesimal_mult:
1472 fixes x y :: "'a::real_normed_div_algebra star"
1473 shows "[| x \<in> HInfinite; y \<in> HFinite - Infinitesimal |]
1474 ==> x * y \<in> HInfinite"
1475 apply (rule ccontr, drule HFinite_HInfinite_iff [THEN iffD2])
1476 apply (frule HFinite_Infinitesimal_not_zero)
1477 apply (drule HFinite_not_Infinitesimal_inverse)
1478 apply (safe, drule HFinite_mult)
1479 apply (auto simp add: mult_assoc HFinite_HInfinite_iff)
1482 lemma HInfinite_HFinite_not_Infinitesimal_mult2:
1483 fixes x y :: "'a::real_normed_div_algebra star"
1484 shows "[| x \<in> HInfinite; y \<in> HFinite - Infinitesimal |]
1485 ==> y * x \<in> HInfinite"
1486 apply (rule ccontr, drule HFinite_HInfinite_iff [THEN iffD2])
1487 apply (frule HFinite_Infinitesimal_not_zero)
1488 apply (drule HFinite_not_Infinitesimal_inverse)
1489 apply (safe, drule_tac x="inverse y" in HFinite_mult)
1491 apply (auto simp add: mult_assoc [symmetric] HFinite_HInfinite_iff)
1494 lemma HInfinite_gt_SReal:
1495 "[| (x::hypreal) \<in> HInfinite; 0 < x; y \<in> Reals |] ==> y < x"
1496 by (auto dest!: bspec simp add: HInfinite_def abs_if order_less_imp_le)
1498 lemma HInfinite_gt_zero_gt_one:
1499 "[| (x::hypreal) \<in> HInfinite; 0 < x |] ==> 1 < x"
1500 by (auto intro: HInfinite_gt_SReal)
1503 lemma not_HInfinite_one [simp]: "1 \<notin> HInfinite"
1504 apply (simp (no_asm) add: HInfinite_HFinite_iff)
1507 lemma approx_hrabs_disj: "abs (x::hypreal) @= x | abs x @= -x"
1508 by (cut_tac x = x in hrabs_disj, auto)
1511 subsection{*Theorems about Monads*}
1513 lemma monad_hrabs_Un_subset: "monad (abs x) \<le> monad(x::hypreal) Un monad(-x)"
1514 by (rule_tac x1 = x in hrabs_disj [THEN disjE], auto)
1516 lemma Infinitesimal_monad_eq: "e \<in> Infinitesimal ==> monad (x+e) = monad x"
1517 by (fast intro!: Infinitesimal_add_approx_self [THEN approx_sym] approx_monad_iff [THEN iffD1])
1519 lemma mem_monad_iff: "(u \<in> monad x) = (-u \<in> monad (-x))"
1520 by (simp add: monad_def)
1522 lemma Infinitesimal_monad_zero_iff: "(x \<in> Infinitesimal) = (x \<in> monad 0)"
1523 by (auto intro: approx_sym simp add: monad_def mem_infmal_iff)
1525 lemma monad_zero_minus_iff: "(x \<in> monad 0) = (-x \<in> monad 0)"
1526 apply (simp (no_asm) add: Infinitesimal_monad_zero_iff [symmetric])
1529 lemma monad_zero_hrabs_iff: "((x::hypreal) \<in> monad 0) = (abs x \<in> monad 0)"
1530 apply (rule_tac x1 = x in hrabs_disj [THEN disjE])
1531 apply (auto simp add: monad_zero_minus_iff [symmetric])
1534 lemma mem_monad_self [simp]: "x \<in> monad x"
1535 by (simp add: monad_def)
1538 subsection{*Proof that @{term "x @= y"} implies @{term"\<bar>x\<bar> @= \<bar>y\<bar>"}*}
1540 lemma approx_subset_monad: "x @= y ==> {x,y} \<le> monad x"
1541 apply (simp (no_asm))
1542 apply (simp add: approx_monad_iff)
1545 lemma approx_subset_monad2: "x @= y ==> {x,y} \<le> monad y"
1546 apply (drule approx_sym)
1547 apply (fast dest: approx_subset_monad)
1550 lemma mem_monad_approx: "u \<in> monad x ==> x @= u"
1551 by (simp add: monad_def)
1553 lemma approx_mem_monad: "x @= u ==> u \<in> monad x"
1554 by (simp add: monad_def)
1556 lemma approx_mem_monad2: "x @= u ==> x \<in> monad u"
1557 apply (simp add: monad_def)
1558 apply (blast intro!: approx_sym)
1561 lemma approx_mem_monad_zero: "[| x @= y;x \<in> monad 0 |] ==> y \<in> monad 0"
1562 apply (drule mem_monad_approx)
1563 apply (fast intro: approx_mem_monad approx_trans)
1566 lemma Infinitesimal_approx_hrabs:
1567 "[| x @= y; (x::hypreal) \<in> Infinitesimal |] ==> abs x @= abs y"
1568 apply (drule Infinitesimal_monad_zero_iff [THEN iffD1])
1569 apply (blast intro: approx_mem_monad_zero monad_zero_hrabs_iff [THEN iffD1] mem_monad_approx approx_trans3)
1572 lemma less_Infinitesimal_less:
1573 "[| 0 < x; (x::hypreal) \<notin>Infinitesimal; e :Infinitesimal |] ==> e < x"
1575 apply (auto intro: Infinitesimal_zero [THEN [2] Infinitesimal_interval]
1576 dest!: order_le_imp_less_or_eq simp add: linorder_not_less)
1579 lemma Ball_mem_monad_gt_zero:
1580 "[| 0 < (x::hypreal); x \<notin> Infinitesimal; u \<in> monad x |] ==> 0 < u"
1581 apply (drule mem_monad_approx [THEN approx_sym])
1582 apply (erule bex_Infinitesimal_iff2 [THEN iffD2, THEN bexE])
1583 apply (drule_tac e = "-xa" in less_Infinitesimal_less, auto)
1586 lemma Ball_mem_monad_less_zero:
1587 "[| (x::hypreal) < 0; x \<notin> Infinitesimal; u \<in> monad x |] ==> u < 0"
1588 apply (drule mem_monad_approx [THEN approx_sym])
1589 apply (erule bex_Infinitesimal_iff [THEN iffD2, THEN bexE])
1590 apply (cut_tac x = "-x" and e = xa in less_Infinitesimal_less, auto)
1593 lemma lemma_approx_gt_zero:
1594 "[|0 < (x::hypreal); x \<notin> Infinitesimal; x @= y|] ==> 0 < y"
1595 by (blast dest: Ball_mem_monad_gt_zero approx_subset_monad)
1597 lemma lemma_approx_less_zero:
1598 "[|(x::hypreal) < 0; x \<notin> Infinitesimal; x @= y|] ==> y < 0"
1599 by (blast dest: Ball_mem_monad_less_zero approx_subset_monad)
1601 theorem approx_hrabs: "(x::hypreal) @= y ==> abs x @= abs y"
1602 by (drule approx_hnorm, simp)
1604 lemma approx_hrabs_zero_cancel: "abs(x::hypreal) @= 0 ==> x @= 0"
1605 apply (cut_tac x = x in hrabs_disj)
1606 apply (auto dest: approx_minus)
1609 lemma approx_hrabs_add_Infinitesimal:
1610 "(e::hypreal) \<in> Infinitesimal ==> abs x @= abs(x+e)"
1611 by (fast intro: approx_hrabs Infinitesimal_add_approx_self)
1613 lemma approx_hrabs_add_minus_Infinitesimal:
1614 "(e::hypreal) \<in> Infinitesimal ==> abs x @= abs(x + -e)"
1615 by (fast intro: approx_hrabs Infinitesimal_add_minus_approx_self)
1617 lemma hrabs_add_Infinitesimal_cancel:
1618 "[| (e::hypreal) \<in> Infinitesimal; e' \<in> Infinitesimal;
1619 abs(x+e) = abs(y+e')|] ==> abs x @= abs y"
1620 apply (drule_tac x = x in approx_hrabs_add_Infinitesimal)
1621 apply (drule_tac x = y in approx_hrabs_add_Infinitesimal)
1622 apply (auto intro: approx_trans2)
1625 lemma hrabs_add_minus_Infinitesimal_cancel:
1626 "[| (e::hypreal) \<in> Infinitesimal; e' \<in> Infinitesimal;
1627 abs(x + -e) = abs(y + -e')|] ==> abs x @= abs y"
1628 apply (drule_tac x = x in approx_hrabs_add_minus_Infinitesimal)
1629 apply (drule_tac x = y in approx_hrabs_add_minus_Infinitesimal)
1630 apply (auto intro: approx_trans2)
1633 subsection {* More @{term HFinite} and @{term Infinitesimal} Theorems *}
1635 (* interesting slightly counterintuitive theorem: necessary
1636 for proving that an open interval is an NS open set
1638 lemma Infinitesimal_add_hypreal_of_real_less:
1639 "[| x < y; u \<in> Infinitesimal |]
1640 ==> hypreal_of_real x + u < hypreal_of_real y"
1641 apply (simp add: Infinitesimal_def)
1642 apply (drule_tac x = "hypreal_of_real y + -hypreal_of_real x" in bspec, simp)
1643 apply (simp add: abs_less_iff)
1646 lemma Infinitesimal_add_hrabs_hypreal_of_real_less:
1647 "[| x \<in> Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |]
1648 ==> abs (hypreal_of_real r + x) < hypreal_of_real y"
1649 apply (drule_tac x = "hypreal_of_real r" in approx_hrabs_add_Infinitesimal)
1650 apply (drule approx_sym [THEN bex_Infinitesimal_iff2 [THEN iffD2]])
1651 apply (auto intro!: Infinitesimal_add_hypreal_of_real_less
1652 simp del: star_of_abs
1653 simp add: star_of_abs [symmetric])
1656 lemma Infinitesimal_add_hrabs_hypreal_of_real_less2:
1657 "[| x \<in> Infinitesimal; abs(hypreal_of_real r) < hypreal_of_real y |]
1658 ==> abs (x + hypreal_of_real r) < hypreal_of_real y"
1659 apply (rule add_commute [THEN subst])
1660 apply (erule Infinitesimal_add_hrabs_hypreal_of_real_less, assumption)
1663 lemma hypreal_of_real_le_add_Infininitesimal_cancel:
1664 "[| u \<in> Infinitesimal; v \<in> Infinitesimal;
1665 hypreal_of_real x + u \<le> hypreal_of_real y + v |]
1666 ==> hypreal_of_real x \<le> hypreal_of_real y"
1667 apply (simp add: linorder_not_less [symmetric], auto)
1668 apply (drule_tac u = "v-u" in Infinitesimal_add_hypreal_of_real_less)
1669 apply (auto simp add: Infinitesimal_diff)
1672 lemma hypreal_of_real_le_add_Infininitesimal_cancel2:
1673 "[| u \<in> Infinitesimal; v \<in> Infinitesimal;
1674 hypreal_of_real x + u \<le> hypreal_of_real y + v |]
1676 by (blast intro: star_of_le [THEN iffD1]
1677 intro!: hypreal_of_real_le_add_Infininitesimal_cancel)
1679 lemma hypreal_of_real_less_Infinitesimal_le_zero:
1680 "[| hypreal_of_real x < e; e \<in> Infinitesimal |] ==> hypreal_of_real x \<le> 0"
1681 apply (rule linorder_not_less [THEN iffD1], safe)
1682 apply (drule Infinitesimal_interval)
1683 apply (drule_tac [4] SReal_hypreal_of_real [THEN SReal_Infinitesimal_zero], auto)
1686 (*used once, in Lim/NSDERIV_inverse*)
1687 lemma Infinitesimal_add_not_zero:
1688 "[| h \<in> Infinitesimal; x \<noteq> 0 |] ==> star_of x + h \<noteq> 0"
1690 apply (subgoal_tac "h = - star_of x", auto intro: minus_unique [symmetric])
1693 lemma Infinitesimal_square_cancel [simp]:
1694 "(x::hypreal)*x + y*y \<in> Infinitesimal ==> x*x \<in> Infinitesimal"
1695 apply (rule Infinitesimal_interval2)
1696 apply (rule_tac [3] zero_le_square, assumption)
1700 lemma HFinite_square_cancel [simp]:
1701 "(x::hypreal)*x + y*y \<in> HFinite ==> x*x \<in> HFinite"
1702 apply (rule HFinite_bounded, assumption)
1706 lemma Infinitesimal_square_cancel2 [simp]:
1707 "(x::hypreal)*x + y*y \<in> Infinitesimal ==> y*y \<in> Infinitesimal"
1708 apply (rule Infinitesimal_square_cancel)
1709 apply (rule add_commute [THEN subst])
1710 apply (simp (no_asm))
1713 lemma HFinite_square_cancel2 [simp]:
1714 "(x::hypreal)*x + y*y \<in> HFinite ==> y*y \<in> HFinite"
1715 apply (rule HFinite_square_cancel)
1716 apply (rule add_commute [THEN subst])
1717 apply (simp (no_asm))
1720 lemma Infinitesimal_sum_square_cancel [simp]:
1721 "(x::hypreal)*x + y*y + z*z \<in> Infinitesimal ==> x*x \<in> Infinitesimal"
1722 apply (rule Infinitesimal_interval2, assumption)
1723 apply (rule_tac [2] zero_le_square, simp)
1724 apply (insert zero_le_square [of y])
1725 apply (insert zero_le_square [of z], simp del:zero_le_square)
1728 lemma HFinite_sum_square_cancel [simp]:
1729 "(x::hypreal)*x + y*y + z*z \<in> HFinite ==> x*x \<in> HFinite"
1730 apply (rule HFinite_bounded, assumption)
1731 apply (rule_tac [2] zero_le_square)
1732 apply (insert zero_le_square [of y])
1733 apply (insert zero_le_square [of z], simp del:zero_le_square)
1736 lemma Infinitesimal_sum_square_cancel2 [simp]:
1737 "(y::hypreal)*y + x*x + z*z \<in> Infinitesimal ==> x*x \<in> Infinitesimal"
1738 apply (rule Infinitesimal_sum_square_cancel)
1739 apply (simp add: add_ac)
1742 lemma HFinite_sum_square_cancel2 [simp]:
1743 "(y::hypreal)*y + x*x + z*z \<in> HFinite ==> x*x \<in> HFinite"
1744 apply (rule HFinite_sum_square_cancel)
1745 apply (simp add: add_ac)
1748 lemma Infinitesimal_sum_square_cancel3 [simp]:
1749 "(z::hypreal)*z + y*y + x*x \<in> Infinitesimal ==> x*x \<in> Infinitesimal"
1750 apply (rule Infinitesimal_sum_square_cancel)
1751 apply (simp add: add_ac)
1754 lemma HFinite_sum_square_cancel3 [simp]:
1755 "(z::hypreal)*z + y*y + x*x \<in> HFinite ==> x*x \<in> HFinite"
1756 apply (rule HFinite_sum_square_cancel)
1757 apply (simp add: add_ac)
1760 lemma monad_hrabs_less:
1761 "[| y \<in> monad x; 0 < hypreal_of_real e |]
1762 ==> abs (y - x) < hypreal_of_real e"
1763 apply (drule mem_monad_approx [THEN approx_sym])
1764 apply (drule bex_Infinitesimal_iff [THEN iffD2])
1765 apply (auto dest!: InfinitesimalD)
1768 lemma mem_monad_SReal_HFinite:
1769 "x \<in> monad (hypreal_of_real a) ==> x \<in> HFinite"
1770 apply (drule mem_monad_approx [THEN approx_sym])
1771 apply (drule bex_Infinitesimal_iff2 [THEN iffD2])
1772 apply (safe dest!: Infinitesimal_subset_HFinite [THEN subsetD])
1773 apply (erule SReal_hypreal_of_real [THEN SReal_subset_HFinite [THEN subsetD], THEN HFinite_add])
1777 subsection{* Theorems about Standard Part*}
1779 lemma st_approx_self: "x \<in> HFinite ==> st x @= x"
1780 apply (simp add: st_def)
1781 apply (frule st_part_Ex, safe)
1783 apply (auto intro: approx_sym)
1786 lemma st_SReal: "x \<in> HFinite ==> st x \<in> Reals"
1787 apply (simp add: st_def)
1788 apply (frule st_part_Ex, safe)
1790 apply (auto intro: approx_sym)
1793 lemma st_HFinite: "x \<in> HFinite ==> st x \<in> HFinite"
1794 by (erule st_SReal [THEN SReal_subset_HFinite [THEN subsetD]])
1796 lemma st_unique: "\<lbrakk>r \<in> \<real>; r \<approx> x\<rbrakk> \<Longrightarrow> st x = r"
1797 apply (frule SReal_subset_HFinite [THEN subsetD])
1798 apply (drule (1) approx_HFinite)
1799 apply (unfold st_def)
1800 apply (rule some_equality)
1801 apply (auto intro: approx_unique_real)
1804 lemma st_SReal_eq: "x \<in> Reals ==> st x = x"
1805 apply (erule st_unique)
1806 apply (rule approx_refl)
1809 lemma st_hypreal_of_real [simp]: "st (hypreal_of_real x) = hypreal_of_real x"
1810 by (rule SReal_hypreal_of_real [THEN st_SReal_eq])
1812 lemma st_eq_approx: "[| x \<in> HFinite; y \<in> HFinite; st x = st y |] ==> x @= y"
1813 by (auto dest!: st_approx_self elim!: approx_trans3)
1816 assumes x: "x \<in> HFinite" and y: "y \<in> HFinite" and xy: "x @= y"
1819 have "st x @= x" "st y @= y" "st x \<in> Reals" "st y \<in> Reals"
1820 by (simp_all add: st_approx_self st_SReal x y)
1821 with xy show ?thesis
1822 by (fast elim: approx_trans approx_trans2 SReal_approx_iff [THEN iffD1])
1825 lemma st_eq_approx_iff:
1826 "[| x \<in> HFinite; y \<in> HFinite|]
1827 ==> (x @= y) = (st x = st y)"
1828 by (blast intro: approx_st_eq st_eq_approx)
1830 lemma st_Infinitesimal_add_SReal:
1831 "[| x \<in> Reals; e \<in> Infinitesimal |] ==> st(x + e) = x"
1832 apply (erule st_unique)
1833 apply (erule Infinitesimal_add_approx_self)
1836 lemma st_Infinitesimal_add_SReal2:
1837 "[| x \<in> Reals; e \<in> Infinitesimal |] ==> st(e + x) = x"
1838 apply (erule st_unique)
1839 apply (erule Infinitesimal_add_approx_self2)
1842 lemma HFinite_st_Infinitesimal_add:
1843 "x \<in> HFinite ==> \<exists>e \<in> Infinitesimal. x = st(x) + e"
1844 by (blast dest!: st_approx_self [THEN approx_sym] bex_Infinitesimal_iff2 [THEN iffD2])
1846 lemma st_add: "\<lbrakk>x \<in> HFinite; y \<in> HFinite\<rbrakk> \<Longrightarrow> st (x + y) = st x + st y"
1847 by (simp add: st_unique st_SReal st_approx_self approx_add)
1849 lemma st_numeral [simp]: "st (numeral w) = numeral w"
1850 by (rule Reals_numeral [THEN st_SReal_eq])
1852 lemma st_neg_numeral [simp]: "st (neg_numeral w) = neg_numeral w"
1853 by (rule Reals_neg_numeral [THEN st_SReal_eq])
1855 lemma st_0 [simp]: "st 0 = 0"
1856 by (simp add: st_SReal_eq)
1858 lemma st_1 [simp]: "st 1 = 1"
1859 by (simp add: st_SReal_eq)
1861 lemma st_minus: "x \<in> HFinite \<Longrightarrow> st (- x) = - st x"
1862 by (simp add: st_unique st_SReal st_approx_self approx_minus)
1864 lemma st_diff: "\<lbrakk>x \<in> HFinite; y \<in> HFinite\<rbrakk> \<Longrightarrow> st (x - y) = st x - st y"
1865 by (simp add: st_unique st_SReal st_approx_self approx_diff)
1867 lemma st_mult: "\<lbrakk>x \<in> HFinite; y \<in> HFinite\<rbrakk> \<Longrightarrow> st (x * y) = st x * st y"
1868 by (simp add: st_unique st_SReal st_approx_self approx_mult_HFinite)
1870 lemma st_Infinitesimal: "x \<in> Infinitesimal ==> st x = 0"
1871 by (simp add: st_unique mem_infmal_iff)
1873 lemma st_not_Infinitesimal: "st(x) \<noteq> 0 ==> x \<notin> Infinitesimal"
1874 by (fast intro: st_Infinitesimal)
1877 "[| x \<in> HFinite; st x \<noteq> 0 |]
1878 ==> st(inverse x) = inverse (st x)"
1879 apply (rule_tac c1 = "st x" in hypreal_mult_left_cancel [THEN iffD1])
1880 apply (auto simp add: st_mult [symmetric] st_not_Infinitesimal HFinite_inverse)
1881 apply (subst right_inverse, auto)
1884 lemma st_divide [simp]:
1885 "[| x \<in> HFinite; y \<in> HFinite; st y \<noteq> 0 |]
1886 ==> st(x/y) = (st x) / (st y)"
1887 by (simp add: divide_inverse st_mult st_not_Infinitesimal HFinite_inverse st_inverse)
1889 lemma st_idempotent [simp]: "x \<in> HFinite ==> st(st(x)) = st(x)"
1890 by (blast intro: st_HFinite st_approx_self approx_st_eq)
1892 lemma Infinitesimal_add_st_less:
1893 "[| x \<in> HFinite; y \<in> HFinite; u \<in> Infinitesimal; st x < st y |]
1894 ==> st x + u < st y"
1895 apply (drule st_SReal)+
1896 apply (auto intro!: Infinitesimal_add_hypreal_of_real_less simp add: SReal_iff)
1899 lemma Infinitesimal_add_st_le_cancel:
1900 "[| x \<in> HFinite; y \<in> HFinite;
1901 u \<in> Infinitesimal; st x \<le> st y + u
1902 |] ==> st x \<le> st y"
1903 apply (simp add: linorder_not_less [symmetric])
1904 apply (auto dest: Infinitesimal_add_st_less)
1907 lemma st_le: "[| x \<in> HFinite; y \<in> HFinite; x \<le> y |] ==> st(x) \<le> st(y)"
1908 apply (frule HFinite_st_Infinitesimal_add)
1909 apply (rotate_tac 1)
1910 apply (frule HFinite_st_Infinitesimal_add, safe)
1911 apply (rule Infinitesimal_add_st_le_cancel)
1912 apply (rule_tac [3] x = ea and y = e in Infinitesimal_diff)
1913 apply (auto simp add: add_assoc [symmetric])
1916 lemma st_zero_le: "[| 0 \<le> x; x \<in> HFinite |] ==> 0 \<le> st x"
1917 apply (subst st_0 [symmetric])
1918 apply (rule st_le, auto)
1921 lemma st_zero_ge: "[| x \<le> 0; x \<in> HFinite |] ==> st x \<le> 0"
1922 apply (subst st_0 [symmetric])
1923 apply (rule st_le, auto)
1926 lemma st_hrabs: "x \<in> HFinite ==> abs(st x) = st(abs x)"
1927 apply (simp add: linorder_not_le st_zero_le abs_if st_minus
1929 apply (auto dest!: st_zero_ge [OF order_less_imp_le])
1934 subsection {* Alternative Definitions using Free Ultrafilter *}
1936 subsubsection {* @{term HFinite} *}
1938 lemma HFinite_FreeUltrafilterNat:
1939 "star_n X \<in> HFinite
1940 ==> \<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat"
1941 apply (auto simp add: HFinite_def SReal_def)
1942 apply (rule_tac x=r in exI)
1943 apply (simp add: hnorm_def star_of_def starfun_star_n)
1944 apply (simp add: star_less_def starP2_star_n)
1947 lemma FreeUltrafilterNat_HFinite:
1948 "\<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat
1949 ==> star_n X \<in> HFinite"
1950 apply (auto simp add: HFinite_def mem_Rep_star_iff)
1951 apply (rule_tac x="star_of u" in bexI)
1952 apply (simp add: hnorm_def starfun_star_n star_of_def)
1953 apply (simp add: star_less_def starP2_star_n)
1954 apply (simp add: SReal_def)
1957 lemma HFinite_FreeUltrafilterNat_iff:
1958 "(star_n X \<in> HFinite) = (\<exists>u. {n. norm (X n) < u} \<in> FreeUltrafilterNat)"
1959 by (blast intro!: HFinite_FreeUltrafilterNat FreeUltrafilterNat_HFinite)
1961 subsubsection {* @{term HInfinite} *}
1963 lemma lemma_Compl_eq: "- {n. u < norm (xa n)} = {n. norm (xa n) \<le> u}"
1966 lemma lemma_Compl_eq2: "- {n. norm (xa n) < u} = {n. u \<le> norm (xa n)}"
1969 lemma lemma_Int_eq1:
1970 "{n. norm (xa n) \<le> u} Int {n. u \<le> norm (xa n)}
1971 = {n. norm(xa n) = u}"
1974 lemma lemma_FreeUltrafilterNat_one:
1975 "{n. norm (xa n) = u} \<le> {n. norm (xa n) < u + (1::real)}"
1978 (*-------------------------------------
1979 Exclude this type of sets from free
1980 ultrafilter for Infinite numbers!
1981 -------------------------------------*)
1982 lemma FreeUltrafilterNat_const_Finite:
1983 "{n. norm (X n) = u} \<in> FreeUltrafilterNat ==> star_n X \<in> HFinite"
1984 apply (rule FreeUltrafilterNat_HFinite)
1985 apply (rule_tac x = "u + 1" in exI)
1986 apply (erule ultra, simp)
1989 lemma HInfinite_FreeUltrafilterNat:
1990 "star_n X \<in> HInfinite ==> \<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat"
1991 apply (drule HInfinite_HFinite_iff [THEN iffD1])
1992 apply (simp add: HFinite_FreeUltrafilterNat_iff)
1993 apply (rule allI, drule_tac x="u + 1" in spec)
1994 apply (drule FreeUltrafilterNat.not_memD)
1995 apply (simp add: Collect_neg_eq [symmetric] linorder_not_less)
1996 apply (erule ultra, simp)
2000 "{n. norm (Xa n) < u} Int {n. X n = Xa n} \<subseteq> {n. norm (X n) < (u::real)}"
2003 lemma lemma_Int_HIa: "{n. u < norm (X n)} Int {n. norm (X n) < u} = {}"
2004 by (auto intro: order_less_asym)
2006 lemma FreeUltrafilterNat_HInfinite:
2007 "\<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat ==> star_n X \<in> HInfinite"
2008 apply (rule HInfinite_HFinite_iff [THEN iffD2])
2009 apply (safe, drule HFinite_FreeUltrafilterNat, safe)
2010 apply (drule_tac x = u in spec)
2011 apply (drule (1) FreeUltrafilterNat.Int)
2012 apply (simp add: Collect_conj_eq [symmetric])
2013 apply (subgoal_tac "\<forall>n. \<not> (norm (X n) < u \<and> u < norm (X n))", auto)
2016 lemma HInfinite_FreeUltrafilterNat_iff:
2017 "(star_n X \<in> HInfinite) = (\<forall>u. {n. u < norm (X n)} \<in> FreeUltrafilterNat)"
2018 by (blast intro!: HInfinite_FreeUltrafilterNat FreeUltrafilterNat_HInfinite)
2020 subsubsection {* @{term Infinitesimal} *}
2022 lemma ball_SReal_eq: "(\<forall>x::hypreal \<in> Reals. P x) = (\<forall>x::real. P (star_of x))"
2023 by (unfold SReal_def, auto)
2025 lemma Infinitesimal_FreeUltrafilterNat:
2026 "star_n X \<in> Infinitesimal ==> \<forall>u>0. {n. norm (X n) < u} \<in> \<U>"
2027 apply (simp add: Infinitesimal_def ball_SReal_eq)
2028 apply (simp add: hnorm_def starfun_star_n star_of_def)
2029 apply (simp add: star_less_def starP2_star_n)
2032 lemma FreeUltrafilterNat_Infinitesimal:
2033 "\<forall>u>0. {n. norm (X n) < u} \<in> \<U> ==> star_n X \<in> Infinitesimal"
2034 apply (simp add: Infinitesimal_def ball_SReal_eq)
2035 apply (simp add: hnorm_def starfun_star_n star_of_def)
2036 apply (simp add: star_less_def starP2_star_n)
2039 lemma Infinitesimal_FreeUltrafilterNat_iff:
2040 "(star_n X \<in> Infinitesimal) = (\<forall>u>0. {n. norm (X n) < u} \<in> \<U>)"
2041 by (blast intro!: Infinitesimal_FreeUltrafilterNat FreeUltrafilterNat_Infinitesimal)
2043 (*------------------------------------------------------------------------
2044 Infinitesimals as smaller than 1/n for all n::nat (> 0)
2045 ------------------------------------------------------------------------*)
2047 lemma lemma_Infinitesimal:
2048 "(\<forall>r. 0 < r --> x < r) = (\<forall>n. x < inverse(real (Suc n)))"
2049 apply (auto simp add: real_of_nat_Suc_gt_zero)
2050 apply (blast dest!: reals_Archimedean intro: order_less_trans)
2053 lemma lemma_Infinitesimal2:
2054 "(\<forall>r \<in> Reals. 0 < r --> x < r) =
2055 (\<forall>n. x < inverse(hypreal_of_nat (Suc n)))"
2057 apply (drule_tac x = "inverse (hypreal_of_real (real (Suc n))) " in bspec)
2058 apply (simp (no_asm_use))
2059 apply (rule real_of_nat_Suc_gt_zero [THEN positive_imp_inverse_positive, THEN star_of_less [THEN iffD2], THEN [2] impE])
2060 prefer 2 apply assumption
2061 apply (simp add: real_of_nat_def)
2062 apply (auto dest!: reals_Archimedean simp add: SReal_iff)
2063 apply (drule star_of_less [THEN iffD2])
2064 apply (simp add: real_of_nat_def)
2065 apply (blast intro: order_less_trans)
2069 lemma Infinitesimal_hypreal_of_nat_iff:
2070 "Infinitesimal = {x. \<forall>n. hnorm x < inverse (hypreal_of_nat (Suc n))}"
2071 apply (simp add: Infinitesimal_def)
2072 apply (auto simp add: lemma_Infinitesimal2)
2076 subsection{*Proof that @{term omega} is an infinite number*}
2078 text{*It will follow that epsilon is an infinitesimal number.*}
2080 lemma Suc_Un_eq: "{n. n < Suc m} = {n. n < m} Un {n. n = m}"
2081 by (auto simp add: less_Suc_eq)
2083 (*-------------------------------------------
2084 Prove that any segment is finite and
2085 hence cannot belong to FreeUltrafilterNat
2086 -------------------------------------------*)
2087 lemma finite_nat_segment: "finite {n::nat. n < m}"
2089 apply (auto simp add: Suc_Un_eq)
2092 lemma finite_real_of_nat_segment: "finite {n::nat. real n < real (m::nat)}"
2093 by (auto intro: finite_nat_segment)
2095 lemma finite_real_of_nat_less_real: "finite {n::nat. real n < u}"
2096 apply (cut_tac x = u in reals_Archimedean2, safe)
2097 apply (rule finite_real_of_nat_segment [THEN [2] finite_subset])
2098 apply (auto dest: order_less_trans)
2101 lemma lemma_real_le_Un_eq:
2102 "{n. f n \<le> u} = {n. f n < u} Un {n. u = (f n :: real)}"
2103 by (auto dest: order_le_imp_less_or_eq simp add: order_less_imp_le)
2105 lemma finite_real_of_nat_le_real: "finite {n::nat. real n \<le> u}"
2106 by (auto simp add: lemma_real_le_Un_eq lemma_finite_omega_set finite_real_of_nat_less_real)
2108 lemma finite_rabs_real_of_nat_le_real: "finite {n::nat. abs(real n) \<le> u}"
2109 apply (simp (no_asm) add: real_of_nat_Suc_gt_zero finite_real_of_nat_le_real)
2112 lemma rabs_real_of_nat_le_real_FreeUltrafilterNat:
2113 "{n. abs(real n) \<le> u} \<notin> FreeUltrafilterNat"
2114 by (blast intro!: FreeUltrafilterNat.finite finite_rabs_real_of_nat_le_real)
2116 lemma FreeUltrafilterNat_nat_gt_real: "{n. u < real n} \<in> FreeUltrafilterNat"
2117 apply (rule ccontr, drule FreeUltrafilterNat.not_memD)
2118 apply (subgoal_tac "- {n::nat. u < real n} = {n. real n \<le> u}")
2119 prefer 2 apply force
2120 apply (simp add: finite_real_of_nat_le_real [THEN FreeUltrafilterNat.finite])
2123 (*--------------------------------------------------------------
2124 The complement of {n. abs(real n) \<le> u} =
2125 {n. u < abs (real n)} is in FreeUltrafilterNat
2126 by property of (free) ultrafilters
2127 --------------------------------------------------------------*)
2129 lemma Compl_real_le_eq: "- {n::nat. real n \<le> u} = {n. u < real n}"
2130 by (auto dest!: order_le_less_trans simp add: linorder_not_le)
2132 text{*@{term omega} is a member of @{term HInfinite}*}
2134 lemma FreeUltrafilterNat_omega: "{n. u < real n} \<in> FreeUltrafilterNat"
2135 apply (cut_tac u = u in rabs_real_of_nat_le_real_FreeUltrafilterNat)
2136 apply (auto dest: FreeUltrafilterNat.not_memD simp add: Compl_real_le_eq)
2139 theorem HInfinite_omega [simp]: "omega \<in> HInfinite"
2140 apply (simp add: omega_def)
2141 apply (rule FreeUltrafilterNat_HInfinite)
2142 apply (simp (no_asm) add: real_norm_def real_of_nat_Suc diff_less_eq [symmetric] FreeUltrafilterNat_omega)
2145 (*-----------------------------------------------
2146 Epsilon is a member of Infinitesimal
2147 -----------------------------------------------*)
2149 lemma Infinitesimal_epsilon [simp]: "epsilon \<in> Infinitesimal"
2150 by (auto intro!: HInfinite_inverse_Infinitesimal HInfinite_omega simp add: hypreal_epsilon_inverse_omega)
2152 lemma HFinite_epsilon [simp]: "epsilon \<in> HFinite"
2153 by (auto intro: Infinitesimal_subset_HFinite [THEN subsetD])
2155 lemma epsilon_approx_zero [simp]: "epsilon @= 0"
2156 apply (simp (no_asm) add: mem_infmal_iff [symmetric])
2159 (*------------------------------------------------------------------------
2160 Needed for proof that we define a hyperreal [<X(n)] @= hypreal_of_real a given
2161 that \<forall>n. |X n - a| < 1/n. Used in proof of NSLIM => LIM.
2162 -----------------------------------------------------------------------*)
2164 lemma real_of_nat_less_inverse_iff:
2165 "0 < u ==> (u < inverse (real(Suc n))) = (real(Suc n) < inverse u)"
2166 apply (simp add: inverse_eq_divide)
2167 apply (subst pos_less_divide_eq, assumption)
2168 apply (subst pos_less_divide_eq)
2169 apply (simp add: real_of_nat_Suc_gt_zero)
2170 apply (simp add: mult_commute)
2173 lemma finite_inverse_real_of_posnat_gt_real:
2174 "0 < u ==> finite {n. u < inverse(real(Suc n))}"
2175 apply (simp (no_asm_simp) add: real_of_nat_less_inverse_iff)
2176 apply (simp (no_asm_simp) add: real_of_nat_Suc less_diff_eq [symmetric])
2177 apply (rule finite_real_of_nat_less_real)
2180 lemma lemma_real_le_Un_eq2:
2181 "{n. u \<le> inverse(real(Suc n))} =
2182 {n. u < inverse(real(Suc n))} Un {n. u = inverse(real(Suc n))}"
2183 apply (auto dest: order_le_imp_less_or_eq simp add: order_less_imp_le)
2186 lemma real_of_nat_inverse_eq_iff:
2187 "(u = inverse (real(Suc n))) = (real(Suc n) = inverse u)"
2188 by (auto simp add: real_of_nat_Suc_gt_zero less_imp_neq [THEN not_sym])
2190 lemma lemma_finite_omega_set2: "finite {n::nat. u = inverse(real(Suc n))}"
2191 apply (simp (no_asm_simp) add: real_of_nat_inverse_eq_iff)
2192 apply (cut_tac x = "inverse u - 1" in lemma_finite_omega_set)
2193 apply (simp add: real_of_nat_Suc diff_eq_eq [symmetric] eq_commute)
2196 lemma finite_inverse_real_of_posnat_ge_real:
2197 "0 < u ==> finite {n. u \<le> inverse(real(Suc n))}"
2198 by (auto simp add: lemma_real_le_Un_eq2 lemma_finite_omega_set2 finite_inverse_real_of_posnat_gt_real)
2200 lemma inverse_real_of_posnat_ge_real_FreeUltrafilterNat:
2201 "0 < u ==> {n. u \<le> inverse(real(Suc n))} \<notin> FreeUltrafilterNat"
2202 by (blast intro!: FreeUltrafilterNat.finite finite_inverse_real_of_posnat_ge_real)
2204 (*--------------------------------------------------------------
2205 The complement of {n. u \<le> inverse(real(Suc n))} =
2206 {n. inverse(real(Suc n)) < u} is in FreeUltrafilterNat
2207 by property of (free) ultrafilters
2208 --------------------------------------------------------------*)
2209 lemma Compl_le_inverse_eq:
2210 "- {n. u \<le> inverse(real(Suc n))} =
2211 {n. inverse(real(Suc n)) < u}"
2212 apply (auto dest!: order_le_less_trans simp add: linorder_not_le)
2215 lemma FreeUltrafilterNat_inverse_real_of_posnat:
2217 {n. inverse(real(Suc n)) < u} \<in> FreeUltrafilterNat"
2218 apply (cut_tac u = u in inverse_real_of_posnat_ge_real_FreeUltrafilterNat)
2219 apply (auto dest: FreeUltrafilterNat.not_memD simp add: Compl_le_inverse_eq)
2222 text{* Example of an hypersequence (i.e. an extended standard sequence)
2223 whose term with an hypernatural suffix is an infinitesimal i.e.
2224 the whn'nth term of the hypersequence is a member of Infinitesimal*}
2226 lemma SEQ_Infinitesimal:
2227 "( *f* (%n::nat. inverse(real(Suc n)))) whn : Infinitesimal"
2228 apply (simp add: hypnat_omega_def starfun_star_n star_n_inverse)
2229 apply (simp add: Infinitesimal_FreeUltrafilterNat_iff)
2230 apply (simp add: real_of_nat_Suc_gt_zero FreeUltrafilterNat_inverse_real_of_posnat)
2233 text{* Example where we get a hyperreal from a real sequence
2234 for which a particular property holds. The theorem is
2235 used in proofs about equivalence of nonstandard and
2236 standard neighbourhoods. Also used for equivalence of
2237 nonstandard ans standard definitions of pointwise
2240 (*-----------------------------------------------------
2241 |X(n) - x| < 1/n ==> [<X n>] - hypreal_of_real x| \<in> Infinitesimal
2242 -----------------------------------------------------*)
2243 lemma real_seq_to_hypreal_Infinitesimal:
2244 "\<forall>n. norm(X n - x) < inverse(real(Suc n))
2245 ==> star_n X - star_of x \<in> Infinitesimal"
2246 apply (auto intro!: bexI dest: FreeUltrafilterNat_inverse_real_of_posnat FreeUltrafilterNat.Int intro: order_less_trans FreeUltrafilterNat.subset simp add: star_n_diff star_of_def Infinitesimal_FreeUltrafilterNat_iff star_n_inverse)
2249 lemma real_seq_to_hypreal_approx:
2250 "\<forall>n. norm(X n - x) < inverse(real(Suc n))
2251 ==> star_n X @= star_of x"
2252 apply (subst approx_minus_iff)
2253 apply (rule mem_infmal_iff [THEN subst])
2254 apply (erule real_seq_to_hypreal_Infinitesimal)
2257 lemma real_seq_to_hypreal_approx2:
2258 "\<forall>n. norm(x - X n) < inverse(real(Suc n))
2259 ==> star_n X @= star_of x"
2260 apply (rule real_seq_to_hypreal_approx)
2261 apply (subst norm_minus_cancel [symmetric])
2262 apply (simp del: norm_minus_cancel)
2265 lemma real_seq_to_hypreal_Infinitesimal2:
2266 "\<forall>n. norm(X n - Y n) < inverse(real(Suc n))
2267 ==> star_n X - star_n Y \<in> Infinitesimal"
2268 by (auto intro!: bexI
2269 dest: FreeUltrafilterNat_inverse_real_of_posnat
2270 FreeUltrafilterNat.Int
2271 intro: order_less_trans FreeUltrafilterNat.subset
2272 simp add: Infinitesimal_FreeUltrafilterNat_iff star_n_diff