470 lemmas bounded_bilinear_bounded_uniform_limit_intros[uniform_limit_intros] = |
470 lemmas bounded_bilinear_bounded_uniform_limit_intros[uniform_limit_intros] = |
471 bounded_bilinear.bounded_uniform_limit[OF Inner_Product.bounded_bilinear_inner] |
471 bounded_bilinear.bounded_uniform_limit[OF Inner_Product.bounded_bilinear_inner] |
472 bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_mult] |
472 bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_mult] |
473 bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_scaleR] |
473 bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_scaleR] |
474 |
474 |
|
475 lemma uniform_lim_mult: |
|
476 fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_algebra" |
|
477 assumes f: "uniform_limit S f l F" |
|
478 and g: "uniform_limit S g m F" |
|
479 and l: "bounded (l ` S)" |
|
480 and m: "bounded (m ` S)" |
|
481 shows "uniform_limit S (\<lambda>a b. f a b * g a b) (\<lambda>a. l a * m a) F" |
|
482 by (intro bounded_bilinear_bounded_uniform_limit_intros assms) |
|
483 |
|
484 lemma uniform_lim_inverse: |
|
485 fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_field" |
|
486 assumes f: "uniform_limit S f l F" |
|
487 and b: "\<And>x. x \<in> S \<Longrightarrow> b \<le> norm(l x)" |
|
488 and "b > 0" |
|
489 shows "uniform_limit S (\<lambda>x y. inverse (f x y)) (inverse \<circ> l) F" |
|
490 proof (rule uniform_limitI) |
|
491 fix e::real |
|
492 assume "e > 0" |
|
493 have lte: "dist (inverse (f x y)) ((inverse \<circ> l) y) < e" |
|
494 if "b/2 \<le> norm (f x y)" "norm (f x y - l y) < e * b\<^sup>2 / 2" "y \<in> S" |
|
495 for x y |
|
496 proof - |
|
497 have [simp]: "l y \<noteq> 0" "f x y \<noteq> 0" |
|
498 using \<open>b > 0\<close> that b [OF \<open>y \<in> S\<close>] by fastforce+ |
|
499 have "norm (l y - f x y) < e * b\<^sup>2 / 2" |
|
500 by (metis norm_minus_commute that(2)) |
|
501 also have "... \<le> e * (norm (f x y) * norm (l y))" |
|
502 using \<open>e > 0\<close> that b [OF \<open>y \<in> S\<close>] apply (simp add: power2_eq_square) |
|
503 by (metis \<open>b > 0\<close> less_eq_real_def mult.left_commute mult_mono') |
|
504 finally show ?thesis |
|
505 by (auto simp: dist_norm divide_simps norm_mult norm_divide) |
|
506 qed |
|
507 have "\<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (f n x) (l x) < b/2" |
|
508 using uniform_limitD [OF f, of "b/2"] by (simp add: \<open>b > 0\<close>) |
|
509 then have "\<forall>\<^sub>F x in F. \<forall>y\<in>S. b/2 \<le> norm (f x y)" |
|
510 apply (rule eventually_mono) |
|
511 using b apply (simp only: dist_norm) |
|
512 by (metis (no_types, hide_lams) diff_zero dist_commute dist_norm norm_triangle_half_l not_less) |
|
513 then have "\<forall>\<^sub>F x in F. \<forall>y\<in>S. b/2 \<le> norm (f x y) \<and> norm (f x y - l y) < e * b\<^sup>2 / 2" |
|
514 apply (simp only: ball_conj_distrib dist_norm [symmetric]) |
|
515 apply (rule eventually_conj, assumption) |
|
516 apply (rule uniform_limitD [OF f, of "e * b ^ 2 / 2"]) |
|
517 using \<open>b > 0\<close> \<open>e > 0\<close> by auto |
|
518 then show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (inverse (f x y)) ((inverse \<circ> l) y) < e" |
|
519 using lte by (force intro: eventually_mono) |
|
520 qed |
|
521 |
|
522 lemma uniform_lim_div: |
|
523 fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_field" |
|
524 assumes f: "uniform_limit S f l F" |
|
525 and g: "uniform_limit S g m F" |
|
526 and l: "bounded (l ` S)" |
|
527 and b: "\<And>x. x \<in> S \<Longrightarrow> b \<le> norm(m x)" |
|
528 and "b > 0" |
|
529 shows "uniform_limit S (\<lambda>a b. f a b / g a b) (\<lambda>a. l a / m a) F" |
|
530 proof - |
|
531 have m: "bounded ((inverse \<circ> m) ` S)" |
|
532 using b \<open>b > 0\<close> |
|
533 apply (simp add: bounded_iff) |
|
534 by (metis le_imp_inverse_le norm_inverse) |
|
535 have "uniform_limit S (\<lambda>a b. f a b * inverse (g a b)) |
|
536 (\<lambda>a. l a * (inverse \<circ> m) a) F" |
|
537 by (rule uniform_lim_mult [OF f uniform_lim_inverse [OF g b \<open>b > 0\<close>] l m]) |
|
538 then show ?thesis |
|
539 by (simp add: field_class.field_divide_inverse) |
|
540 qed |
|
541 |
475 lemma uniform_limit_null_comparison: |
542 lemma uniform_limit_null_comparison: |
476 assumes "\<forall>\<^sub>F x in F. \<forall>a\<in>S. norm (f x a) \<le> g x a" |
543 assumes "\<forall>\<^sub>F x in F. \<forall>a\<in>S. norm (f x a) \<le> g x a" |
477 assumes "uniform_limit S g (\<lambda>_. 0) F" |
544 assumes "uniform_limit S g (\<lambda>_. 0) F" |
478 shows "uniform_limit S f (\<lambda>_. 0) F" |
545 shows "uniform_limit S f (\<lambda>_. 0) F" |
479 using assms(2) |
546 using assms(2) |
480 proof (rule metric_uniform_limit_imp_uniform_limit) |
547 proof (rule metric_uniform_limit_imp_uniform_limit) |
481 show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (f x y) 0 \<le> dist (g x y) 0" |
548 show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (f x y) 0 \<le> dist (g x y) 0" |
482 using assms(1) by (rule eventually_mono) (force simp add: dist_norm) |
549 using assms(1) by (rule eventually_mono) (force simp add: dist_norm) |
483 qed |
550 qed |
484 |
551 |
485 lemma uniform_limit_on_union: |
552 lemma uniform_limit_on_Un: |
486 "uniform_limit I f g F \<Longrightarrow> uniform_limit J f g F \<Longrightarrow> uniform_limit (I \<union> J) f g F" |
553 "uniform_limit I f g F \<Longrightarrow> uniform_limit J f g F \<Longrightarrow> uniform_limit (I \<union> J) f g F" |
487 by (auto intro!: uniform_limitI dest!: uniform_limitD elim: eventually_elim2) |
554 by (auto intro!: uniform_limitI dest!: uniform_limitD elim: eventually_elim2) |
488 |
555 |
489 lemma uniform_limit_on_empty [iff]: |
556 lemma uniform_limit_on_empty [iff]: |
490 "uniform_limit {} f g F" |
557 "uniform_limit {} f g F" |