199 subsection \<open>Existence of Infinite Hyperreal Number\<close> |
199 subsection \<open>Existence of Infinite Hyperreal Number\<close> |
200 |
200 |
201 text \<open>Existence of infinite number not corresponding to any real number. |
201 text \<open>Existence of infinite number not corresponding to any real number. |
202 Use assumption that member \<^term>\<open>\<U>\<close> is not finite.\<close> |
202 Use assumption that member \<^term>\<open>\<U>\<close> is not finite.\<close> |
203 |
203 |
204 text \<open>A few lemmas first.\<close> |
|
205 |
|
206 lemma lemma_omega_empty_singleton_disj: |
|
207 "{n::nat. x = real n} = {} \<or> (\<exists>y. {n::nat. x = real n} = {y})" |
|
208 by force |
|
209 |
|
210 lemma lemma_finite_omega_set: "finite {n::nat. x = real n}" |
|
211 using lemma_omega_empty_singleton_disj [of x] by auto |
|
212 |
|
213 lemma not_ex_hypreal_of_real_eq_omega: "\<nexists>x. hypreal_of_real x = \<omega>" |
|
214 apply (simp add: omega_def star_of_def star_n_eq_iff) |
|
215 apply clarify |
|
216 apply (rule_tac x2="x-1" in lemma_finite_omega_set [THEN FreeUltrafilterNat.finite, THEN notE]) |
|
217 apply (erule eventually_mono) |
|
218 apply auto |
|
219 done |
|
220 |
|
221 lemma hypreal_of_real_not_eq_omega: "hypreal_of_real x \<noteq> \<omega>" |
204 lemma hypreal_of_real_not_eq_omega: "hypreal_of_real x \<noteq> \<omega>" |
222 using not_ex_hypreal_of_real_eq_omega by auto |
205 proof - |
|
206 have False if "\<forall>\<^sub>F n in \<U>. x = 1 + real n" for x |
|
207 proof - |
|
208 have "finite {n::nat. x = 1 + real n}" |
|
209 by (simp add: finite_nat_set_iff_bounded_le) (metis add.commute nat_le_linear nat_le_real_less) |
|
210 then show False |
|
211 using FreeUltrafilterNat.finite that by blast |
|
212 qed |
|
213 then show ?thesis |
|
214 by (auto simp add: omega_def star_of_def star_n_eq_iff) |
|
215 qed |
223 |
216 |
224 text \<open>Existence of infinitesimal number also not corresponding to any real number.\<close> |
217 text \<open>Existence of infinitesimal number also not corresponding to any real number.\<close> |
225 |
218 |
226 lemma lemma_epsilon_empty_singleton_disj: |
|
227 "{n::nat. x = inverse(real(Suc n))} = {} \<or> (\<exists>y. {n::nat. x = inverse(real(Suc n))} = {y})" |
|
228 by auto |
|
229 |
|
230 lemma lemma_finite_epsilon_set: "finite {n. x = inverse (real (Suc n))}" |
|
231 using lemma_epsilon_empty_singleton_disj [of x] by auto |
|
232 |
|
233 lemma not_ex_hypreal_of_real_eq_epsilon: "\<nexists>x. hypreal_of_real x = \<epsilon>" |
|
234 by (auto simp: epsilon_def star_of_def star_n_eq_iff |
|
235 lemma_finite_epsilon_set [THEN FreeUltrafilterNat.finite] simp del: of_nat_Suc) |
|
236 |
|
237 lemma hypreal_of_real_not_eq_epsilon: "hypreal_of_real x \<noteq> \<epsilon>" |
219 lemma hypreal_of_real_not_eq_epsilon: "hypreal_of_real x \<noteq> \<epsilon>" |
238 using not_ex_hypreal_of_real_eq_epsilon by auto |
220 proof - |
|
221 have False if "\<forall>\<^sub>F n in \<U>. x = inverse (1 + real n)" for x |
|
222 proof - |
|
223 have "finite {n::nat. x = inverse (1 + real n)}" |
|
224 by (simp add: finite_nat_set_iff_bounded_le) (metis add.commute inverse_inverse_eq linear nat_le_real_less of_nat_Suc) |
|
225 then show False |
|
226 using FreeUltrafilterNat.finite that by blast |
|
227 qed |
|
228 then show ?thesis |
|
229 by (auto simp: epsilon_def star_of_def star_n_eq_iff) |
|
230 qed |
239 |
231 |
240 lemma hypreal_epsilon_not_zero: "\<epsilon> \<noteq> 0" |
232 lemma hypreal_epsilon_not_zero: "\<epsilon> \<noteq> 0" |
241 by (simp add: epsilon_def star_zero_def star_of_def star_n_eq_iff FreeUltrafilterNat.proper |
233 using hypreal_of_real_not_eq_epsilon by force |
242 del: star_of_zero) |
|
243 |
234 |
244 lemma hypreal_epsilon_inverse_omega: "\<epsilon> = inverse \<omega>" |
235 lemma hypreal_epsilon_inverse_omega: "\<epsilon> = inverse \<omega>" |
245 by (simp add: epsilon_def omega_def star_n_inverse) |
236 by (simp add: epsilon_def omega_def star_n_inverse) |
246 |
237 |
247 lemma hypreal_epsilon_gt_zero: "0 < \<epsilon>" |
238 lemma hypreal_epsilon_gt_zero: "0 < \<epsilon>" |
248 by (simp add: hypreal_epsilon_inverse_omega) |
239 by (simp add: hypreal_epsilon_inverse_omega) |
249 |
|
250 |
|
251 subsection \<open>Absolute Value Function for the Hyperreals\<close> |
|
252 |
|
253 lemma hrabs_add_less: "\<bar>x\<bar> < r \<Longrightarrow> \<bar>y\<bar> < s \<Longrightarrow> \<bar>x + y\<bar> < r + s" |
|
254 for x y r s :: hypreal |
|
255 by (simp add: abs_if split: if_split_asm) |
|
256 |
|
257 lemma hrabs_less_gt_zero: "\<bar>x\<bar> < r \<Longrightarrow> 0 < r" |
|
258 for x r :: hypreal |
|
259 by (blast intro!: order_le_less_trans abs_ge_zero) |
|
260 |
|
261 lemma hrabs_disj: "\<bar>x\<bar> = x \<or> \<bar>x\<bar> = -x" |
|
262 for x :: "'a::abs_if" |
|
263 by (simp add: abs_if) |
|
264 |
|
265 lemma hrabs_add_lemma_disj: "y + - x + (y + - z) = \<bar>x + - z\<bar> \<Longrightarrow> y = z \<or> x = y" |
|
266 for x y z :: hypreal |
|
267 by (simp add: abs_if split: if_split_asm) |
|
268 |
240 |
269 |
241 |
270 subsection \<open>Embedding the Naturals into the Hyperreals\<close> |
242 subsection \<open>Embedding the Naturals into the Hyperreals\<close> |
271 |
243 |
272 abbreviation hypreal_of_nat :: "nat \<Rightarrow> hypreal" |
244 abbreviation hypreal_of_nat :: "nat \<Rightarrow> hypreal" |
423 by transfer (rule power_mult_distrib) |
395 by transfer (rule power_mult_distrib) |
424 |
396 |
425 lemma hyperpow_two_le [simp]: "\<And>r. (0::'a::{monoid_mult,linordered_ring_strict} star) \<le> r pow 2" |
397 lemma hyperpow_two_le [simp]: "\<And>r. (0::'a::{monoid_mult,linordered_ring_strict} star) \<le> r pow 2" |
426 by (auto simp add: hyperpow_two zero_le_mult_iff) |
398 by (auto simp add: hyperpow_two zero_le_mult_iff) |
427 |
399 |
428 lemma hrabs_hyperpow_two [simp]: |
|
429 "\<bar>x pow 2\<bar> = (x::'a::{monoid_mult,linordered_ring_strict} star) pow 2" |
|
430 by (simp only: abs_of_nonneg hyperpow_two_le) |
|
431 |
|
432 lemma hyperpow_two_hrabs [simp]: "\<bar>x::'a::linordered_idom star\<bar> pow 2 = x pow 2" |
400 lemma hyperpow_two_hrabs [simp]: "\<bar>x::'a::linordered_idom star\<bar> pow 2 = x pow 2" |
433 by (simp add: hyperpow_hrabs) |
401 by (simp add: hyperpow_hrabs) |
434 |
402 |
435 text \<open>The precondition could be weakened to \<^term>\<open>0\<le>x\<close>.\<close> |
|
436 lemma hypreal_mult_less_mono: "u < v \<Longrightarrow> x < y \<Longrightarrow> 0 < v \<Longrightarrow> 0 < x \<Longrightarrow> u * x < v * y" |
|
437 for u v x y :: hypreal |
|
438 by (simp add: mult_strict_mono order_less_imp_le) |
|
439 |
|
440 lemma hyperpow_two_gt_one: "\<And>r::'a::linordered_semidom star. 1 < r \<Longrightarrow> 1 < r pow 2" |
403 lemma hyperpow_two_gt_one: "\<And>r::'a::linordered_semidom star. 1 < r \<Longrightarrow> 1 < r pow 2" |
441 by transfer simp |
404 by transfer simp |
442 |
405 |
443 lemma hyperpow_two_ge_one: "\<And>r::'a::linordered_semidom star. 1 \<le> r \<Longrightarrow> 1 \<le> r pow 2" |
406 lemma hyperpow_two_ge_one: "\<And>r::'a::linordered_semidom star. 1 \<le> r \<Longrightarrow> 1 \<le> r pow 2" |
444 by transfer (rule one_le_power) |
407 by transfer (rule one_le_power) |
445 |
408 |
446 lemma two_hyperpow_ge_one [simp]: "(1::hypreal) \<le> 2 pow n" |
409 lemma two_hyperpow_ge_one [simp]: "(1::hypreal) \<le> 2 pow n" |
447 apply (rule_tac y = "1 pow n" in order_trans) |
410 by (metis hyperpow_eq_one hyperpow_le one_le_numeral zero_less_one) |
448 apply (rule_tac [2] hyperpow_le) |
|
449 apply auto |
|
450 done |
|
451 |
411 |
452 lemma hyperpow_minus_one2 [simp]: "\<And>n. (- 1) pow (2 * n) = (1::hypreal)" |
412 lemma hyperpow_minus_one2 [simp]: "\<And>n. (- 1) pow (2 * n) = (1::hypreal)" |
453 by transfer (rule power_minus1_even) |
413 by transfer (rule power_minus1_even) |
454 |
414 |
455 lemma hyperpow_less_le: "\<And>r n N. (0::hypreal) \<le> r \<Longrightarrow> r \<le> 1 \<Longrightarrow> n < N \<Longrightarrow> r pow N \<le> r pow n" |
415 lemma hyperpow_less_le: "\<And>r n N. (0::hypreal) \<le> r \<Longrightarrow> r \<le> 1 \<Longrightarrow> n < N \<Longrightarrow> r pow N \<le> r pow n" |
467 |
427 |
468 lemma hyperpow_zero_HNatInfinite [simp]: "N \<in> HNatInfinite \<Longrightarrow> (0::hypreal) pow N = 0" |
428 lemma hyperpow_zero_HNatInfinite [simp]: "N \<in> HNatInfinite \<Longrightarrow> (0::hypreal) pow N = 0" |
469 by (drule HNatInfinite_is_Suc, auto) |
429 by (drule HNatInfinite_is_Suc, auto) |
470 |
430 |
471 lemma hyperpow_le_le: "(0::hypreal) \<le> r \<Longrightarrow> r \<le> 1 \<Longrightarrow> n \<le> N \<Longrightarrow> r pow N \<le> r pow n" |
431 lemma hyperpow_le_le: "(0::hypreal) \<le> r \<Longrightarrow> r \<le> 1 \<Longrightarrow> n \<le> N \<Longrightarrow> r pow N \<le> r pow n" |
472 apply (drule order_le_less [of n, THEN iffD1]) |
432 by (metis hyperpow_less_le le_less) |
473 apply (auto intro: hyperpow_less_le) |
|
474 done |
|
475 |
433 |
476 lemma hyperpow_Suc_le_self2: "(0::hypreal) \<le> r \<Longrightarrow> r < 1 \<Longrightarrow> r pow (n + (1::hypnat)) \<le> r" |
434 lemma hyperpow_Suc_le_self2: "(0::hypreal) \<le> r \<Longrightarrow> r < 1 \<Longrightarrow> r pow (n + (1::hypnat)) \<le> r" |
477 apply (drule_tac n = " (1::hypnat) " in hyperpow_le_le) |
435 by (metis hyperpow_less_le hyperpow_one hypnat_add_self_le le_less) |
478 apply auto |
|
479 done |
|
480 |
436 |
481 lemma hyperpow_hypnat_of_nat: "\<And>x. x pow hypnat_of_nat n = x ^ n" |
437 lemma hyperpow_hypnat_of_nat: "\<And>x. x pow hypnat_of_nat n = x ^ n" |
482 by transfer (rule refl) |
438 by transfer (rule refl) |
483 |
439 |
484 lemma of_hypreal_hyperpow: |
440 lemma of_hypreal_hyperpow: |