src/HOL/NSA/NSA.thy
author hoelzl
Tue, 05 Nov 2013 09:45:02 +0100
changeset 55715 c4159fe6fa46
parent 55682 b1d955791529
child 55862 03ff4d1e6784
permissions -rw-r--r--
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
     4 *)
     5 
     6 header{*Infinite Numbers, Infinitesimals, Infinitely Close Relation*}
     7 
     8 theory NSA
     9 imports HyperDef "~~/src/HOL/Library/Lubs_Glbs"
    10 begin
    11 
    12 definition
    13   hnorm :: "'a::real_normed_vector star \<Rightarrow> real star" where
    14   [transfer_unfold]: "hnorm = *f* norm"
    15 
    16 definition
    17   Infinitesimal  :: "('a::real_normed_vector) star set" where
    18   "Infinitesimal = {x. \<forall>r \<in> Reals. 0 < r --> hnorm x < r}"
    19 
    20 definition
    21   HFinite :: "('a::real_normed_vector) star set" where
    22   "HFinite = {x. \<exists>r \<in> Reals. hnorm x < r}"
    23 
    24 definition
    25   HInfinite :: "('a::real_normed_vector) star set" where
    26   "HInfinite = {x. \<forall>r \<in> Reals. r < hnorm x}"
    27 
    28 definition
    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)"
    32 
    33 definition
    34   st        :: "hypreal => hypreal" where
    35     --{*the standard part of a hyperreal*}
    36   "st = (%x. @r. x \<in> HFinite & r \<in> Reals & r @= x)"
    37 
    38 definition
    39   monad     :: "'a::real_normed_vector star => 'a star set" where
    40   "monad x = {y. x @= y}"
    41 
    42 definition
    43   galaxy    :: "'a::real_normed_vector star => 'a star set" where
    44   "galaxy x = {y. (x + -y) \<in> HFinite}"
    45 
    46 notation (xsymbols)
    47   approx  (infixl "\<approx>" 50)
    48 
    49 notation (HTML output)
    50   approx  (infixl "\<approx>" 50)
    51 
    52 lemma SReal_def: "Reals == {x. \<exists>r. x = hypreal_of_real r}"
    53 by (simp add: Reals_def image_def)
    54 
    55 subsection {* Nonstandard Extension of the Norm Function *}
    56 
    57 definition
    58   scaleHR :: "real star \<Rightarrow> 'a star \<Rightarrow> 'a::real_normed_vector star" where
    59   [transfer_unfold]: "scaleHR = starfun2 scaleR"
    60 
    61 lemma Standard_hnorm [simp]: "x \<in> Standard \<Longrightarrow> hnorm x \<in> Standard"
    62 by (simp add: hnorm_def)
    63 
    64 lemma star_of_norm [simp]: "star_of (norm x) = hnorm (star_of x)"
    65 by transfer (rule refl)
    66 
    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)
    70 
    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)
    74 
    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)
    78 
    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)
    82 
    83 lemma hnorm_scaleR:
    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)
    87 
    88 lemma hnorm_scaleHR:
    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)
    92 
    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)
    96 
    97 lemma hnorm_mult:
    98   "\<And>x y::'a::real_normed_div_algebra star. hnorm (x * y) = hnorm x * hnorm y"
    99 by transfer (rule norm_mult)
   100 
   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)
   105 
   106 lemma hnorm_one [simp]:
   107   "hnorm (1\<Colon>'a::real_normed_div_algebra star) = 1"
   108 by transfer (rule norm_one)
   109 
   110 lemma hnorm_zero [simp]:
   111   "hnorm (0\<Colon>'a::real_normed_vector star) = 0"
   112 by transfer (rule norm_zero)
   113 
   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)
   117 
   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)
   121 
   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)
   125 
   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)
   129 
   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)
   133 
   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)
   137 
   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)
   141 
   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)
   146 
   147 lemma hnorm_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)
   151 
   152 lemma hnorm_divide:
   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)
   156 
   157 lemma hypreal_hnorm_def [simp]:
   158   "\<And>r::hypreal. hnorm r = \<bar>r\<bar>"
   159 by transfer (rule real_norm_def)
   160 
   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)
   165 
   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)
   170 
   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')
   175 done
   176 
   177 subsection{*Closure Laws for the Standard Reals*}
   178 
   179 lemma Reals_minus_iff [simp]: "(-x \<in> Reals) = (x \<in> Reals)"
   180 apply auto
   181 apply (drule Reals_minus, auto)
   182 done
   183 
   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)
   186 
   187 lemma SReal_hrabs: "(x::hypreal) \<in> Reals ==> abs x \<in> Reals"
   188 by (simp add: Reals_eq_Standard)
   189 
   190 lemma SReal_hypreal_of_real [simp]: "hypreal_of_real x \<in> Reals"
   191 by (simp add: Reals_eq_Standard)
   192 
   193 lemma SReal_divide_numeral: "r \<in> Reals ==> r/(numeral w::hypreal) \<in> Reals"
   194 by simp
   195 
   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])
   200 done
   201 
   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])
   205 done
   206 
   207 lemma SReal_UNIV_real: "{x. hypreal_of_real x \<in> Reals} = (UNIV::real set)"
   208 by simp
   209 
   210 lemma SReal_iff: "(x \<in> Reals) = (\<exists>y. x = hypreal_of_real y)"
   211 by (simp add: SReal_def)
   212 
   213 lemma hypreal_of_real_image: "hypreal_of_real `(UNIV::real set) = Reals"
   214 by (simp add: Reals_eq_Standard Standard_def)
   215 
   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)
   219 done
   220 
   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)
   224 
   225 lemma SReal_dense:
   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)
   229 done
   230 
   231 text{*Completeness of Reals, but both lemmas are unused.*}
   232 
   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])
   237 
   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)"
   242 apply (rule conjI)
   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)
   247 done
   248 
   249 
   250 subsection{* Set of Finite Elements is a Subring of the Extended Reals*}
   251 
   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)
   255 done
   256 
   257 lemma HFinite_mult:
   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)
   262 done
   263 
   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)
   268 done
   269 
   270 lemma HFinite_minus_iff: "(-x \<in> HFinite) = (x \<in> HFinite)"
   271 by (simp add: HFinite_def)
   272 
   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)
   278 done
   279 
   280 lemma SReal_subset_HFinite: "(Reals::hypreal set) \<subseteq> HFinite"
   281 by (auto simp add: SReal_def)
   282 
   283 lemma HFiniteD: "x \<in> HFinite ==> \<exists>t \<in> Reals. hnorm x < t"
   284 by (simp add: HFinite_def)
   285 
   286 lemma HFinite_hrabs_iff [iff]: "(abs (x::hypreal) \<in> HFinite) = (x \<in> HFinite)"
   287 by (simp add: HFinite_def)
   288 
   289 lemma HFinite_hnorm_iff [iff]:
   290   "(hnorm (x::hypreal) \<in> HFinite) = (x \<in> HFinite)"
   291 by (simp add: HFinite_def)
   292 
   293 lemma HFinite_numeral [simp]: "numeral w \<in> HFinite"
   294 unfolding star_numeral_def by (rule HFinite_star_of)
   295 
   296 (** As always with numerals, 0 and 1 are special cases **)
   297 
   298 lemma HFinite_0 [simp]: "0 \<in> HFinite"
   299 unfolding star_zero_def by (rule HFinite_star_of)
   300 
   301 lemma HFinite_1 [simp]: "1 \<in> HFinite"
   302 unfolding star_one_def by (rule HFinite_star_of)
   303 
   304 lemma hrealpow_HFinite:
   305   fixes x :: "'a::{real_normed_algebra,monoid_mult} star"
   306   shows "x \<in> HFinite ==> x ^ n \<in> HFinite"
   307 apply (induct n)
   308 apply (auto simp add: power_Suc intro: HFinite_mult)
   309 done
   310 
   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)
   318 done
   319 
   320 
   321 subsection{* Set of Infinitesimals is a Subring of the Hyperreals*}
   322 
   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)
   326 
   327 lemma InfinitesimalD:
   328       "x \<in> Infinitesimal ==> \<forall>r \<in> Reals. 0 < r --> hnorm x < r"
   329 by (simp add: Infinitesimal_def)
   330 
   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)
   334 
   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)
   338 
   339 lemma Infinitesimal_zero [iff]: "0 \<in> Infinitesimal"
   340 by (simp add: Infinitesimal_def)
   341 
   342 lemma hypreal_sum_of_halves: "x/(2::hypreal) + x/(2::hypreal) = x"
   343 by auto
   344 
   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)
   351 done
   352 
   353 lemma Infinitesimal_minus_iff [simp]: "(-x:Infinitesimal) = (x:Infinitesimal)"
   354 by (simp add: Infinitesimal_def)
   355 
   356 lemma Infinitesimal_hnorm_iff:
   357   "(hnorm x \<in> Infinitesimal) = (x \<in> Infinitesimal)"
   358 by (simp add: Infinitesimal_def)
   359 
   360 lemma Infinitesimal_hrabs_iff [iff]:
   361   "(abs (x::hypreal) \<in> Infinitesimal) = (x \<in> Infinitesimal)"
   362 by (simp add: abs_if)
   363 
   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)
   368 
   369 lemma Infinitesimal_diff:
   370      "[| x \<in> Infinitesimal;  y \<in> Infinitesimal |] ==> x-y \<in> Infinitesimal"
   371   using Infinitesimal_add [of x "- y"] by simp
   372 
   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)
   380 done
   381 
   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)
   392 apply assumption
   393 apply (simp only: divide_pos_pos)
   394 apply (erule order_le_less_trans [OF hnorm_ge_zero])
   395 done
   396 
   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])
   409 done
   410 
   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)
   420 apply assumption
   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])
   424 done
   425 
   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)
   435 done
   436 
   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)
   440 apply simp
   441 done
   442 
   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)
   451 apply assumption
   452 apply (clarify, simp add: Compl_HFinite [symmetric])
   453 done
   454 
   455 lemma HInfiniteI: "(\<And>r. r \<in> \<real> \<Longrightarrow> r < hnorm x) \<Longrightarrow> x \<in> HInfinite"
   456 by (simp add: HInfinite_def)
   457 
   458 lemma HInfiniteD: "\<lbrakk>x \<in> HInfinite; r \<in> \<real>\<rbrakk> \<Longrightarrow> r < hnorm x"
   459 by (simp add: HInfinite_def)
   460 
   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)
   469 done
   470 
   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)
   473 
   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)
   478 
   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)
   482 
   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)
   486 
   487 lemma HInfinite_minus_iff: "(-x \<in> HInfinite) = (x \<in> HInfinite)"
   488 by (simp add: HInfinite_def)
   489 
   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)
   496 apply simp_all
   497 done
   498 
   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)
   502 
   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)
   508 
   509 lemma not_Infinitesimal_not_zero: "x \<notin> Infinitesimal ==> x \<noteq> 0"
   510 by auto
   511 
   512 lemma not_Infinitesimal_not_zero2: "x \<in> HFinite - Infinitesimal ==> x \<noteq> 0"
   513 by auto
   514 
   515 lemma HFinite_diff_Infinitesimal_hrabs:
   516   "(x::hypreal) \<in> HFinite - Infinitesimal ==> abs x \<in> HFinite - Infinitesimal"
   517 by blast
   518 
   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)
   522 
   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)
   526 
   527 lemma hrabs_le_Infinitesimal:
   528      "[| e \<in> Infinitesimal; abs (x::hypreal) \<le> e |] ==> x \<in> Infinitesimal"
   529 by (erule hnorm_le_Infinitesimal, simp)
   530 
   531 lemma hrabs_less_Infinitesimal:
   532       "[| e \<in> Infinitesimal; abs (x::hypreal) < e |] ==> x \<in> Infinitesimal"
   533 by (erule hnorm_less_Infinitesimal, simp)
   534 
   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)
   539 
   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)
   544 
   545 
   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)
   551 done
   552 
   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)
   557 done
   558 
   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)
   562 
   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)
   566 
   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))
   577 done
   578 
   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"
   582 apply (rule ccontr)
   583 apply (drule de_Morgan_disj [THEN iffD1])
   584 apply (fast dest: not_Infinitesimal_mult)
   585 done
   586 
   587 lemma HFinite_Infinitesimal_not_zero: "x \<in> HFinite-Infinitesimal ==> x \<noteq> 0"
   588 by blast
   589 
   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"
   595 apply clarify
   596 apply (blast dest: HFinite_mult not_Infinitesimal_mult)
   597 done
   598 
   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)
   603 done
   604 
   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])
   609 
   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])
   614 
   615 
   616 subsection{*The Infinitely Close Relation*}
   617 
   618 lemma mem_infmal_iff: "(x \<in> Infinitesimal) = (x @= 0)"
   619 by (simp add: Infinitesimal_def approx_def)
   620 
   621 lemma approx_minus_iff: " (x @= y) = (x - y @= 0)"
   622 by (simp add: approx_def)
   623 
   624 lemma approx_minus_iff2: " (x @= y) = (-y + x @= 0)"
   625 by (simp add: approx_def add_commute)
   626 
   627 lemma approx_refl [iff]: "x @= x"
   628 by (simp add: approx_def Infinitesimal_def)
   629 
   630 lemma hypreal_minus_distrib1: "-(y + -(x::'a::ab_group_add)) = x + -y"
   631 by (simp add: add_commute)
   632 
   633 lemma approx_sym: "x @= y ==> y @= x"
   634 apply (simp add: approx_def)
   635 apply (drule Infinitesimal_minus_iff [THEN iffD2])
   636 apply simp
   637 done
   638 
   639 lemma approx_trans: "[| x @= y; y @= z |] ==> x @= z"
   640 apply (simp add: approx_def)
   641 apply (drule (1) Infinitesimal_add)
   642 apply simp
   643 done
   644 
   645 lemma approx_trans2: "[| r @= x; s @= x |] ==> r @= s"
   646 by (blast intro: approx_sym approx_trans)
   647 
   648 lemma approx_trans3: "[| x @= r; x @= s|] ==> r @= s"
   649 by (blast intro: approx_sym approx_trans)
   650 
   651 lemma approx_reorient: "(x @= y) = (y @= x)"
   652 by (blast intro: approx_sym)
   653 
   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") =
   658 {*
   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
   663         | _ => NONE
   664   in proc end
   665 *}
   666 
   667 lemma Infinitesimal_approx_minus: "(x-y \<in> Infinitesimal) = (x @= y)"
   668 by (simp add: approx_minus_iff [symmetric] mem_infmal_iff)
   669 
   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)
   673 done
   674 
   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)
   679 done
   680 
   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" .
   687 qed
   688 
   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)
   693 done
   694 
   695 lemma approx_minus2: "-a @= -b ==> a @= b"
   696 by (auto dest: approx_minus)
   697 
   698 lemma approx_minus_cancel [simp]: "(-a @= -b) = (a @= b)"
   699 by (blast intro: approx_minus approx_minus2)
   700 
   701 lemma approx_add_minus: "[| a @= b; c @= d |] ==> a + -c @= b + -d"
   702 by (blast intro!: approx_add approx_minus)
   703 
   704 lemma approx_diff: "[| a @= b; c @= d |] ==> a - c @= b - d"
   705   using approx_add [of a b "- c" "- d"] by simp
   706 
   707 lemma approx_mult1:
   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])
   712 
   713 lemma approx_mult2:
   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])
   718 
   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)
   723 
   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)
   728 
   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)
   733 
   734 lemma approx_eq_imp: "a = b ==> a @= b"
   735 by (simp add: approx_def)
   736 
   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)
   740 
   741 lemma bex_Infinitesimal_iff: "(\<exists>y \<in> Infinitesimal. x - z = y) = (x @= z)"
   742 by (simp add: approx_def)
   743 
   744 lemma bex_Infinitesimal_iff2: "(\<exists>y \<in> Infinitesimal. x = z + y) = (x @= z)"
   745 by (force simp add: bex_Infinitesimal_iff [symmetric])
   746 
   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])
   751 done
   752 
   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])
   757 done
   758 
   759 lemma Infinitesimal_add_approx_self2: "y \<in> Infinitesimal ==> x @= y + x"
   760 by (auto dest: Infinitesimal_add_approx_self simp add: add_commute)
   761 
   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])
   764 
   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)
   768 done
   769 
   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)
   776 done
   777 
   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)
   781 done
   782 
   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)
   786 done
   787 
   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)
   791 done
   792 
   793 lemma approx_add_mono2: "b @= c ==> b + a @= c + a"
   794 by (simp add: add_commute approx_add_mono1)
   795 
   796 lemma approx_add_left_iff [simp]: "(a + b @= a + c) = (b @= c)"
   797 by (fast elim: approx_add_left_cancel approx_add_mono1)
   798 
   799 lemma approx_add_right_iff [simp]: "(b + a @= c + a) = (b @= c)"
   800 by (simp add: add_commute)
   801 
   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)
   807 done
   808 
   809 lemma approx_star_of_HFinite: "x @= star_of D ==> x \<in> HFinite"
   810 by (rule approx_sym [THEN [2] approx_HFinite], auto)
   811 
   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)
   819 done
   820 
   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)
   824 
   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])
   831 done
   832 
   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])
   837 
   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)
   844 done
   845 
   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)
   851 
   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])
   856 done
   857 
   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)
   860 
   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)
   863 
   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)
   867 
   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])
   872 done
   873 
   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)
   878 
   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)
   885 done
   886 
   887 lemma approx_hnorm:
   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)
   904 qed
   905 
   906 
   907 subsection{* Zero is the Only Infinitesimal that is also a Real*}
   908 
   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)
   913 done
   914 
   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)
   918 
   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)
   923 done
   924 
   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)
   929 done
   930 
   931 lemma SReal_Int_Infinitesimal_zero: "Reals Int Infinitesimal = {0::hypreal}"
   932 apply auto
   933 apply (cut_tac x = x and y = 0 in linorder_less_linear)
   934 apply (blast dest: SReal_not_Infinitesimal SReal_minus_not_Infinitesimal)
   935 done
   936 
   937 lemma SReal_Infinitesimal_zero:
   938   "[| (x::hypreal) \<in> Reals; x \<in> Infinitesimal|] ==> x = 0"
   939 by (cut_tac SReal_Int_Infinitesimal_zero, blast)
   940 
   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])
   944 
   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)
   948 
   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)
   955 apply simp
   956 done
   957 
   958 lemma star_of_HFinite_diff_Infinitesimal:
   959      "x \<noteq> 0 ==> star_of x \<in> HFinite - Infinitesimal"
   960 by simp
   961 
   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])
   965 
   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)
   970 apply simp
   971 done
   972 
   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)
   977 done
   978 
   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)
   986 done
   987 
   988 (*The premise y\<noteq>0 is essential; otherwise x/y =0 and we lose the
   989   HFinite premise.*)
   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)
   996 done
   997 
   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]])
  1003 done
  1004 
  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  ------------------------------------------------------------------*)
  1009 
  1010 subsection{* Uniqueness: Two Infinitely Close Reals are Equal*}
  1011 
  1012 lemma star_of_approx_iff [simp]: "(star_of x @= star_of y) = (x = y)"
  1013 apply safe
  1014 apply (simp add: approx_def)
  1015 apply (simp only: star_of_diff [symmetric])
  1016 apply (simp only: star_of_Infinitesimal_iff_0)
  1017 apply simp
  1018 done
  1019 
  1020 lemma SReal_approx_iff:
  1021   "[|(x::hypreal) \<in> Reals; y \<in> Reals|] ==> (x @= y) = (x = y)"
  1022 apply auto
  1023 apply (simp add: approx_def)
  1024 apply (drule (1) Reals_diff)
  1025 apply (drule (1) SReal_Infinitesimal_zero)
  1026 apply simp
  1027 done
  1028 
  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)
  1034 done
  1035 
  1036 (*And also for 0 @= #nn and 1 @= #nn, #nn @= 0 and #nn @= 1.*)
  1037 lemma [simp]:
  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)
  1051 
  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)
  1055 
  1056 lemma star_of_approx_zero_iff [simp]: "(star_of k @= 0) = (k = 0)"
  1057 by (simp_all add: star_of_approx_iff [symmetric])
  1058 
  1059 lemma star_of_approx_one_iff [simp]: "(star_of k @= 1) = (k = 1)"
  1060 by (simp_all add: star_of_approx_iff [symmetric])
  1061 
  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)
  1065 
  1066 
  1067 subsection{* Existence of Unique Real Infinitely Close*}
  1068 
  1069 subsubsection{*Lifting of the Ub and Lub Properties*}
  1070 
  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)
  1075 
  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)
  1082 done
  1083 
  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)
  1093 done
  1094 
  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)
  1099 
  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)
  1103 
  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)
  1107 
  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)
  1111 
  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)
  1119 done
  1120 
  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)
  1127 done
  1128 
  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)
  1134 done
  1135 
  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)
  1142 done
  1143 
  1144 lemma lemma_st_part_subset: "{s. s \<in> Reals & s < x} \<subseteq> Reals"
  1145 by auto
  1146 
  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)
  1150 
  1151 lemma lemma_hypreal_le_left_cancel: "((t::hypreal) + r \<le> t) = (r \<le> 0)"
  1152 apply safe
  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])
  1156 done
  1157 
  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)
  1165 done
  1166 
  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)
  1171 done
  1172 
  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)
  1177 done
  1178 
  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)
  1183 
  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])
  1187 done
  1188 
  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 |]
  1193       ==> t + -r \<le> x"
  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)
  1201 done
  1202 
  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 |]
  1207       ==> x + -t \<le> r"
  1208 apply (subgoal_tac "x \<le> t+r") 
  1209 apply (auto intro: lemma_st_part_le1)
  1210 done
  1211 
  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)") 
  1218 apply simp
  1219 apply (rule lemma_st_part_le2)
  1220 apply auto
  1221 done
  1222 
  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)
  1226 
  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)
  1236 done
  1237 
  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"
  1243 apply auto
  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)
  1248 done
  1249 
  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"
  1255 apply (auto)
  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)
  1260 done
  1261 
  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)
  1271 done
  1272 
  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)
  1277 
  1278 
  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)
  1286 done
  1287 
  1288 lemma st_part_Ex:
  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)
  1292 done
  1293 
  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)
  1299 done
  1300 
  1301 subsection{* Finite, Infinite and Infinitesimal*}
  1302 
  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)
  1306 done
  1307 
  1308 lemma HFinite_not_HInfinite: 
  1309   assumes x: "x \<in> HFinite" shows "x \<notin> HInfinite"
  1310 proof
  1311   assume x': "x \<in> HInfinite"
  1312   with x have "x \<in> HFinite \<inter> HInfinite" by blast
  1313   thus False by auto
  1314 qed
  1315 
  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)
  1319 apply (auto)
  1320 done
  1321 
  1322 lemma HInfinite_HFinite_disj: "x \<in> HInfinite | x \<in> HFinite"
  1323 by (blast intro: not_HFinite_HInfinite)
  1324 
  1325 lemma HInfinite_HFinite_iff: "(x \<in> HInfinite) = (x \<notin> HFinite)"
  1326 by (blast dest: HFinite_not_HInfinite not_HFinite_HInfinite)
  1327 
  1328 lemma HFinite_HInfinite_iff: "(x \<in> HFinite) = (x \<notin> HInfinite)"
  1329 by (simp add: HInfinite_HFinite_iff)
  1330 
  1331 
  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)
  1335 
  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)
  1343 done
  1344 
  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)
  1349 
  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])
  1356 done
  1357 
  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)
  1364 done
  1365 
  1366 lemma approx_inverse:
  1367   fixes x y :: "'a::real_normed_div_algebra star"
  1368   shows
  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)
  1378 done
  1379 
  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]
  1383 
  1384 lemma inverse_add_Infinitesimal_approx:
  1385   fixes x h :: "'a::real_normed_div_algebra star"
  1386   shows
  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)
  1390 done
  1391 
  1392 lemma inverse_add_Infinitesimal_approx2:
  1393   fixes x h :: "'a::real_normed_div_algebra star"
  1394   shows
  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)
  1399 done
  1400 
  1401 lemma inverse_add_Infinitesimal_approx_Infinitesimal:
  1402   fixes x h :: "'a::real_normed_div_algebra star"
  1403   shows
  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])
  1409 done
  1410 
  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)
  1418 done
  1419 declare Infinitesimal_square_iff [symmetric, simp]
  1420 
  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)
  1426 done
  1427 
  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)
  1432 
  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"
  1436 apply safe
  1437 apply (frule HFinite_inverse, assumption)
  1438 apply (drule not_Infinitesimal_not_zero)
  1439 apply (auto dest: approx_mult2 simp add: mult_assoc [symmetric])
  1440 done
  1441 
  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)
  1446 
  1447 lemma HInfinite_HFinite_add_cancel:
  1448      "[| x + y \<in> HInfinite; y \<in> HFinite |] ==> x \<in> HInfinite"
  1449 apply (rule ccontr)
  1450 apply (drule HFinite_HInfinite_iff [THEN iffD2])
  1451 apply (auto dest: HFinite_add simp add: HInfinite_HFinite_iff)
  1452 done
  1453 
  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)
  1458 done
  1459 
  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)
  1463 
  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)
  1469 done
  1470 
  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)
  1480 done
  1481 
  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)
  1490 apply assumption
  1491 apply (auto simp add: mult_assoc [symmetric] HFinite_HInfinite_iff)
  1492 done
  1493 
  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)
  1497 
  1498 lemma HInfinite_gt_zero_gt_one:
  1499   "[| (x::hypreal) \<in> HInfinite; 0 < x |] ==> 1 < x"
  1500 by (auto intro: HInfinite_gt_SReal)
  1501 
  1502 
  1503 lemma not_HInfinite_one [simp]: "1 \<notin> HInfinite"
  1504 apply (simp (no_asm) add: HInfinite_HFinite_iff)
  1505 done
  1506 
  1507 lemma approx_hrabs_disj: "abs (x::hypreal) @= x | abs x @= -x"
  1508 by (cut_tac x = x in hrabs_disj, auto)
  1509 
  1510 
  1511 subsection{*Theorems about Monads*}
  1512 
  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)
  1515 
  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])
  1518 
  1519 lemma mem_monad_iff: "(u \<in> monad x) = (-u \<in> monad (-x))"
  1520 by (simp add: monad_def)
  1521 
  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)
  1524 
  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])
  1527 done
  1528 
  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])
  1532 done
  1533 
  1534 lemma mem_monad_self [simp]: "x \<in> monad x"
  1535 by (simp add: monad_def)
  1536 
  1537 
  1538 subsection{*Proof that @{term "x @= y"} implies @{term"\<bar>x\<bar> @= \<bar>y\<bar>"}*}
  1539 
  1540 lemma approx_subset_monad: "x @= y ==> {x,y} \<le> monad x"
  1541 apply (simp (no_asm))
  1542 apply (simp add: approx_monad_iff)
  1543 done
  1544 
  1545 lemma approx_subset_monad2: "x @= y ==> {x,y} \<le> monad y"
  1546 apply (drule approx_sym)
  1547 apply (fast dest: approx_subset_monad)
  1548 done
  1549 
  1550 lemma mem_monad_approx: "u \<in> monad x ==> x @= u"
  1551 by (simp add: monad_def)
  1552 
  1553 lemma approx_mem_monad: "x @= u ==> u \<in> monad x"
  1554 by (simp add: monad_def)
  1555 
  1556 lemma approx_mem_monad2: "x @= u ==> x \<in> monad u"
  1557 apply (simp add: monad_def)
  1558 apply (blast intro!: approx_sym)
  1559 done
  1560 
  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)
  1564 done
  1565 
  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)
  1570 done
  1571 
  1572 lemma less_Infinitesimal_less:
  1573      "[| 0 < x;  (x::hypreal) \<notin>Infinitesimal;  e :Infinitesimal |] ==> e < x"
  1574 apply (rule ccontr)
  1575 apply (auto intro: Infinitesimal_zero [THEN [2] Infinitesimal_interval] 
  1576             dest!: order_le_imp_less_or_eq simp add: linorder_not_less)
  1577 done
  1578 
  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)
  1584 done
  1585 
  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)
  1591 done
  1592 
  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)
  1596 
  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)
  1600 
  1601 theorem approx_hrabs: "(x::hypreal) @= y ==> abs x @= abs y"
  1602 by (drule approx_hnorm, simp)
  1603 
  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)
  1607 done
  1608 
  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)
  1612 
  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)
  1616 
  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)
  1623 done
  1624 
  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)
  1631 done
  1632 
  1633 subsection {* More @{term HFinite} and @{term Infinitesimal} Theorems *}
  1634 
  1635 (* interesting slightly counterintuitive theorem: necessary
  1636    for proving that an open interval is an NS open set
  1637 *)
  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)
  1644 done
  1645 
  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])
  1654 done
  1655 
  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)
  1661 done
  1662 
  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)
  1670 done
  1671 
  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 |]
  1675       ==> x \<le> y"
  1676 by (blast intro: star_of_le [THEN iffD1] 
  1677           intro!: hypreal_of_real_le_add_Infininitesimal_cancel)
  1678 
  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)
  1684 done
  1685 
  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"
  1689 apply auto
  1690 apply (subgoal_tac "h = - star_of x", auto intro: minus_unique [symmetric])
  1691 done
  1692 
  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)
  1697 apply (auto)
  1698 done
  1699 
  1700 lemma HFinite_square_cancel [simp]:
  1701   "(x::hypreal)*x + y*y \<in> HFinite ==> x*x \<in> HFinite"
  1702 apply (rule HFinite_bounded, assumption)
  1703 apply (auto)
  1704 done
  1705 
  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))
  1711 done
  1712 
  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))
  1718 done
  1719 
  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)
  1726 done
  1727 
  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)
  1734 done
  1735 
  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)
  1740 done
  1741 
  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)
  1746 done
  1747 
  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)
  1752 done
  1753 
  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)
  1758 done
  1759 
  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)
  1766 done
  1767 
  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])
  1774 done
  1775 
  1776 
  1777 subsection{* Theorems about Standard Part*}
  1778 
  1779 lemma st_approx_self: "x \<in> HFinite ==> st x @= x"
  1780 apply (simp add: st_def)
  1781 apply (frule st_part_Ex, safe)
  1782 apply (rule someI2)
  1783 apply (auto intro: approx_sym)
  1784 done
  1785 
  1786 lemma st_SReal: "x \<in> HFinite ==> st x \<in> Reals"
  1787 apply (simp add: st_def)
  1788 apply (frule st_part_Ex, safe)
  1789 apply (rule someI2)
  1790 apply (auto intro: approx_sym)
  1791 done
  1792 
  1793 lemma st_HFinite: "x \<in> HFinite ==> st x \<in> HFinite"
  1794 by (erule st_SReal [THEN SReal_subset_HFinite [THEN subsetD]])
  1795 
  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)
  1802 done
  1803 
  1804 lemma st_SReal_eq: "x \<in> Reals ==> st x = x"
  1805 apply (erule st_unique)
  1806 apply (rule approx_refl)
  1807 done
  1808 
  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])
  1811 
  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)
  1814 
  1815 lemma approx_st_eq: 
  1816   assumes x: "x \<in> HFinite" and y: "y \<in> HFinite" and xy: "x @= y" 
  1817   shows "st x = st y"
  1818 proof -
  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])
  1823 qed
  1824 
  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)
  1829 
  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)
  1834 done
  1835 
  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)
  1840 done
  1841 
  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])
  1845 
  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)
  1848 
  1849 lemma st_numeral [simp]: "st (numeral w) = numeral w"
  1850 by (rule Reals_numeral [THEN st_SReal_eq])
  1851 
  1852 lemma st_neg_numeral [simp]: "st (neg_numeral w) = neg_numeral w"
  1853 by (rule Reals_neg_numeral [THEN st_SReal_eq])
  1854 
  1855 lemma st_0 [simp]: "st 0 = 0"
  1856 by (simp add: st_SReal_eq)
  1857 
  1858 lemma st_1 [simp]: "st 1 = 1"
  1859 by (simp add: st_SReal_eq)
  1860 
  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)
  1863 
  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)
  1866 
  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)
  1869 
  1870 lemma st_Infinitesimal: "x \<in> Infinitesimal ==> st x = 0"
  1871 by (simp add: st_unique mem_infmal_iff)
  1872 
  1873 lemma st_not_Infinitesimal: "st(x) \<noteq> 0 ==> x \<notin> Infinitesimal"
  1874 by (fast intro: st_Infinitesimal)
  1875 
  1876 lemma st_inverse:
  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)
  1882 done
  1883 
  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)
  1888 
  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)
  1891 
  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)
  1897 done
  1898 
  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)
  1905 done
  1906 
  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])
  1914 done
  1915 
  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)
  1919 done
  1920 
  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)
  1924 done
  1925 
  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
  1928    linorder_not_less)
  1929 apply (auto dest!: st_zero_ge [OF order_less_imp_le]) 
  1930 done
  1931 
  1932 
  1933 
  1934 subsection {* Alternative Definitions using Free Ultrafilter *}
  1935 
  1936 subsubsection {* @{term HFinite} *}
  1937 
  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)
  1945 done
  1946 
  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)
  1955 done
  1956 
  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)
  1960 
  1961 subsubsection {* @{term HInfinite} *}
  1962 
  1963 lemma lemma_Compl_eq: "- {n. u < norm (xa n)} = {n. norm (xa n) \<le> u}"
  1964 by auto
  1965 
  1966 lemma lemma_Compl_eq2: "- {n. norm (xa n) < u} = {n. u \<le> norm (xa n)}"
  1967 by auto
  1968 
  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}"
  1972 by auto
  1973 
  1974 lemma lemma_FreeUltrafilterNat_one:
  1975      "{n. norm (xa n) = u} \<le> {n. norm (xa n) < u + (1::real)}"
  1976 by auto
  1977 
  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)
  1987 done
  1988 
  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)
  1997 done
  1998 
  1999 lemma lemma_Int_HI:
  2000      "{n. norm (Xa n) < u} Int {n. X n = Xa n} \<subseteq> {n. norm (X n) < (u::real)}"
  2001 by auto
  2002 
  2003 lemma lemma_Int_HIa: "{n. u < norm (X n)} Int {n. norm (X n) < u} = {}"
  2004 by (auto intro: order_less_asym)
  2005 
  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)
  2014 done
  2015 
  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)
  2019 
  2020 subsubsection {* @{term Infinitesimal} *}
  2021 
  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)
  2024 
  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)
  2030 done
  2031 
  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)
  2037 done
  2038 
  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)
  2042 
  2043 (*------------------------------------------------------------------------
  2044          Infinitesimals as smaller than 1/n for all n::nat (> 0)
  2045  ------------------------------------------------------------------------*)
  2046 
  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)
  2051 done
  2052 
  2053 lemma lemma_Infinitesimal2:
  2054      "(\<forall>r \<in> Reals. 0 < r --> x < r) =
  2055       (\<forall>n. x < inverse(hypreal_of_nat (Suc n)))"
  2056 apply safe
  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)
  2066 done
  2067 
  2068 
  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)
  2073 done
  2074 
  2075 
  2076 subsection{*Proof that @{term omega} is an infinite number*}
  2077 
  2078 text{*It will follow that epsilon is an infinitesimal number.*}
  2079 
  2080 lemma Suc_Un_eq: "{n. n < Suc m} = {n. n < m} Un {n. n = m}"
  2081 by (auto simp add: less_Suc_eq)
  2082 
  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}"
  2088 apply (induct "m")
  2089 apply (auto simp add: Suc_Un_eq)
  2090 done
  2091 
  2092 lemma finite_real_of_nat_segment: "finite {n::nat. real n < real (m::nat)}"
  2093 by (auto intro: finite_nat_segment)
  2094 
  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)
  2099 done
  2100 
  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)
  2104 
  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)
  2107 
  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)
  2110 done
  2111 
  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)
  2115 
  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])
  2121 done
  2122 
  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  --------------------------------------------------------------*)
  2128 
  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)
  2131 
  2132 text{*@{term omega} is a member of @{term HInfinite}*}
  2133 
  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)
  2137 done
  2138 
  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)
  2143 done
  2144 
  2145 (*-----------------------------------------------
  2146        Epsilon is a member of Infinitesimal
  2147  -----------------------------------------------*)
  2148 
  2149 lemma Infinitesimal_epsilon [simp]: "epsilon \<in> Infinitesimal"
  2150 by (auto intro!: HInfinite_inverse_Infinitesimal HInfinite_omega simp add: hypreal_epsilon_inverse_omega)
  2151 
  2152 lemma HFinite_epsilon [simp]: "epsilon \<in> HFinite"
  2153 by (auto intro: Infinitesimal_subset_HFinite [THEN subsetD])
  2154 
  2155 lemma epsilon_approx_zero [simp]: "epsilon @= 0"
  2156 apply (simp (no_asm) add: mem_infmal_iff [symmetric])
  2157 done
  2158 
  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  -----------------------------------------------------------------------*)
  2163 
  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)
  2171 done
  2172 
  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)
  2178 done
  2179 
  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)
  2184 done
  2185 
  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])
  2189 
  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)
  2194 done
  2195 
  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)
  2199 
  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)
  2203 
  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)
  2213 done
  2214 
  2215 lemma FreeUltrafilterNat_inverse_real_of_posnat:
  2216      "0 < u ==>
  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)
  2220 done
  2221 
  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*}
  2225 
  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)
  2231 done
  2232 
  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
  2238       limit.*}
  2239 
  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)
  2247 done
  2248 
  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)
  2255 done
  2256 
  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)
  2263 done
  2264 
  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 
  2273                    star_n_inverse)
  2274 
  2275 end