src/HOL/Nonstandard_Analysis/HyperDef.thy
changeset 70232 d19266b7465f
parent 69597 ff784d5a5bfb
child 70356 4a327c061870
equal deleted inserted replaced
70228:2d5b122aa0ff 70232:d19266b7465f
   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: