src/HOL/Hyperreal/NSA.thy
changeset 20407 93a34d5d1dc5
parent 20254 58b71535ed00
child 20432 07ec57376051
equal deleted inserted replaced
20406:f0a5421efb0b 20407:93a34d5d1dc5
   283 done
   283 done
   284 
   284 
   285 
   285 
   286 subsection{* Set of Infinitesimals is a Subring of the Hyperreals*}
   286 subsection{* Set of Infinitesimals is a Subring of the Hyperreals*}
   287 
   287 
       
   288 lemma InfinitesimalI:
       
   289   "(\<And>r. \<lbrakk>r \<in> \<real>; 0 < r\<rbrakk> \<Longrightarrow> \<bar>x\<bar> < r) \<Longrightarrow> x \<in> Infinitesimal"
       
   290 by (simp add: Infinitesimal_def)
       
   291 
   288 lemma InfinitesimalD:
   292 lemma InfinitesimalD:
   289       "x \<in> Infinitesimal ==> \<forall>r \<in> Reals. 0 < r --> abs x < r"
   293       "x \<in> Infinitesimal ==> \<forall>r \<in> Reals. 0 < r --> abs x < r"
   290 by (simp add: Infinitesimal_def)
   294 by (simp add: Infinitesimal_def)
   291 
   295 
   292 lemma Infinitesimal_zero [iff]: "0 \<in> Infinitesimal"
   296 lemma Infinitesimal_zero [iff]: "0 \<in> Infinitesimal"
   295 lemma hypreal_sum_of_halves: "x/(2::hypreal) + x/(2::hypreal) = x"
   299 lemma hypreal_sum_of_halves: "x/(2::hypreal) + x/(2::hypreal) = x"
   296 by auto
   300 by auto
   297 
   301 
   298 lemma Infinitesimal_add:
   302 lemma Infinitesimal_add:
   299      "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> (x+y) \<in> Infinitesimal"
   303      "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> (x+y) \<in> Infinitesimal"
   300 apply (auto simp add: Infinitesimal_def)
   304 apply (rule InfinitesimalI)
   301 apply (rule hypreal_sum_of_halves [THEN subst])
   305 apply (rule hypreal_sum_of_halves [THEN subst])
   302 apply (drule half_gt_zero)
   306 apply (drule half_gt_zero)
   303 apply (blast intro: hrabs_add_less SReal_divide_number_of)
   307 apply (blast intro: hrabs_add_less SReal_divide_number_of dest: InfinitesimalD)
   304 done
   308 done
   305 
   309 
   306 lemma Infinitesimal_minus_iff [simp]: "(-x:Infinitesimal) = (x:Infinitesimal)"
   310 lemma Infinitesimal_minus_iff [simp]: "(-x:Infinitesimal) = (x:Infinitesimal)"
   307 by (simp add: Infinitesimal_def)
   311 by (simp add: Infinitesimal_def)
   308 
   312 
   310      "[| x \<in> Infinitesimal;  y \<in> Infinitesimal |] ==> x-y \<in> Infinitesimal"
   314      "[| x \<in> Infinitesimal;  y \<in> Infinitesimal |] ==> x-y \<in> Infinitesimal"
   311 by (simp add: diff_def Infinitesimal_add)
   315 by (simp add: diff_def Infinitesimal_add)
   312 
   316 
   313 lemma Infinitesimal_mult:
   317 lemma Infinitesimal_mult:
   314      "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> (x * y) \<in> Infinitesimal"
   318      "[| x \<in> Infinitesimal; y \<in> Infinitesimal |] ==> (x * y) \<in> Infinitesimal"
   315 apply (auto simp add: Infinitesimal_def abs_mult)
   319 apply (rule InfinitesimalI)
   316 apply (case_tac "y=0", simp) 
   320 apply (simp only: abs_mult)
   317 apply (cut_tac a = "abs x" and b = 1 and c = "abs y" and d = r 
   321 apply (case_tac "y = 0", simp)
   318        in mult_strict_mono, auto)
   322 apply (subgoal_tac "\<bar>x\<bar> * \<bar>y\<bar> < 1 * r", simp only: mult_1)
       
   323 apply (rule mult_strict_mono)
       
   324 apply (simp_all add: InfinitesimalD)
   319 done
   325 done
   320 
   326 
   321 lemma Infinitesimal_HFinite_mult:
   327 lemma Infinitesimal_HFinite_mult:
   322      "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (x * y) \<in> Infinitesimal"
   328      "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (x * y) \<in> Infinitesimal"
   323 apply (auto dest!: HFiniteD simp add: Infinitesimal_def abs_mult)
   329 apply (rule InfinitesimalI)
   324 apply (frule hrabs_less_gt_zero)
   330 apply (drule HFiniteD, clarify)
   325 apply (drule_tac x = "r/t" in bspec)
   331 apply (simp only: abs_mult)
   326 apply (blast intro: SReal_divide)
   332 apply (subgoal_tac "\<bar>x\<bar> * \<bar>y\<bar> < (r / t) * t", simp)
   327 apply (cut_tac a = "abs x" and b = "r/t" and c = "abs y" in mult_strict_mono)
   333 apply (subgoal_tac "0 < r / t")
   328 apply (auto simp add: zero_less_divide_iff)
   334 apply (rule mult_strict_mono)
       
   335 apply (simp add: InfinitesimalD SReal_divide)
       
   336 apply (assumption, assumption, simp)
       
   337 apply (simp only: divide_pos_pos hrabs_less_gt_zero)
   329 done
   338 done
   330 
   339 
   331 lemma Infinitesimal_HFinite_mult2:
   340 lemma Infinitesimal_HFinite_mult2:
   332      "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (y * x) \<in> Infinitesimal"
   341      "[| x \<in> Infinitesimal; y \<in> HFinite |] ==> (y * x) \<in> Infinitesimal"
   333 by (auto dest: Infinitesimal_HFinite_mult simp add: mult_commute)
   342 by (auto dest: Infinitesimal_HFinite_mult simp add: mult_commute)
   341 apply (drule inverse_inverse_eq [symmetric, THEN subst])
   350 apply (drule inverse_inverse_eq [symmetric, THEN subst])
   342 apply (rule inverse_less_iff_less [THEN iffD1])
   351 apply (rule inverse_less_iff_less [THEN iffD1])
   343 apply (auto simp add: SReal_inverse)
   352 apply (auto simp add: SReal_inverse)
   344 done
   353 done
   345 
   354 
       
   355 lemma HInfiniteI: "(\<And>r. r \<in> \<real> \<Longrightarrow> r < \<bar>x\<bar>) \<Longrightarrow> x \<in> HInfinite"
       
   356 by (simp add: HInfinite_def)
       
   357 
       
   358 lemma HInfiniteD: "\<lbrakk>x \<in> HInfinite; r \<in> \<real>\<rbrakk> \<Longrightarrow> r < \<bar>x\<bar>"
       
   359 by (simp add: HInfinite_def)
       
   360 
   346 lemma HInfinite_mult: "[|x \<in> HInfinite;y \<in> HInfinite|] ==> (x*y) \<in> HInfinite"
   361 lemma HInfinite_mult: "[|x \<in> HInfinite;y \<in> HInfinite|] ==> (x*y) \<in> HInfinite"
   347 apply (auto simp add: HInfinite_def  abs_mult)
   362 apply (rule HInfiniteI, simp only: abs_mult)
   348 apply (erule_tac x = 1 in ballE)
   363 apply (subgoal_tac "r * 1 < \<bar>x\<bar> * \<bar>y\<bar>", simp only: mult_1)
   349 apply (erule_tac x = r in ballE)
   364 apply (case_tac "x = 0", simp add: HInfinite_def)
   350 apply (case_tac "y=0", simp)
   365 apply (rule mult_strict_mono)
   351 apply (cut_tac c = 1 and d = "abs x" and a = r and b = "abs y" in mult_strict_mono)
   366 apply (simp_all add: HInfiniteD)
   352 apply (auto simp add: mult_ac)
       
   353 done
   367 done
   354 
   368 
   355 lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) \<le> y|] ==> r < x+y"
   369 lemma hypreal_add_zero_less_le_mono: "[|r < x; (0::hypreal) \<le> y|] ==> r < x+y"
   356 by (auto dest: add_less_le_mono)
   370 by (auto dest: add_less_le_mono)
   357 
   371 
   419          e' \<le> x ; x \<le> e |] ==> x \<in> Infinitesimal"
   433          e' \<le> x ; x \<le> e |] ==> x \<in> Infinitesimal"
   420 by (auto intro: Infinitesimal_interval simp add: order_le_less)
   434 by (auto intro: Infinitesimal_interval simp add: order_le_less)
   421 
   435 
   422 lemma not_Infinitesimal_mult:
   436 lemma not_Infinitesimal_mult:
   423      "[| x \<notin> Infinitesimal;  y \<notin> Infinitesimal|] ==> (x*y) \<notin>Infinitesimal"
   437      "[| x \<notin> Infinitesimal;  y \<notin> Infinitesimal|] ==> (x*y) \<notin>Infinitesimal"
   424 apply (unfold Infinitesimal_def, clarify)
   438 apply (unfold Infinitesimal_def, clarify, rename_tac r s)
   425 apply (simp add: linorder_not_less abs_mult)
   439 apply (simp only: linorder_not_less abs_mult)
   426 apply (erule_tac x = "r*ra" in ballE)
   440 apply (drule_tac x = "r * s" in bspec)
   427 prefer 2 apply (fast intro: SReal_mult)
   441 apply (fast intro: SReal_mult)
   428 apply (auto simp add: zero_less_mult_iff)
   442 apply (drule mp, blast intro: mult_pos_pos)
   429 apply (cut_tac c = ra and d = "abs y" and a = r and b = "abs x" in mult_mono, auto)
   443 apply (drule_tac c = s and d = "abs y" and a = r and b = "abs x" in mult_mono)
       
   444 apply (simp_all (no_asm_simp))
   430 done
   445 done
   431 
   446 
   432 lemma Infinitesimal_mult_disj:
   447 lemma Infinitesimal_mult_disj:
   433      "x*y \<in> Infinitesimal ==> x \<in> Infinitesimal | y \<in> Infinitesimal"
   448      "x*y \<in> Infinitesimal ==> x \<in> Infinitesimal | y \<in> Infinitesimal"
   434 apply (rule ccontr)
   449 apply (rule ccontr)