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) |