src/HOL/Multivariate_Analysis/Uniform_Limit.thy
author wenzelm
Mon, 21 Sep 2015 21:46:14 +0200
changeset 61222 05d28dc76e5c
parent 60812 8fff64349793
child 61531 ab2e862263e7
permissions -rw-r--r--
isabelle update_cartouches;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     1
(*  Title:      HOL/Multivariate_Analysis/Uniform_Limit.thy
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     2
    Author:     Christoph Traut, TU München
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     3
    Author:     Fabian Immler, TU München
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     4
*)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     5
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     6
section \<open>Uniform Limit and Uniform Convergence\<close>
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     7
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     8
theory Uniform_Limit
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
     9
imports Topology_Euclidean_Space
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    10
begin
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    11
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    12
definition uniformly_on :: "'a set \<Rightarrow> ('a \<Rightarrow> 'b::metric_space) \<Rightarrow> ('a \<Rightarrow> 'b) filter"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    13
  where "uniformly_on S l = (INF e:{0 <..}. principal {f. \<forall>x\<in>S. dist (f x) (l x) < e})"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    14
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    15
abbreviation
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    16
  "uniform_limit S f l \<equiv> filterlim f (uniformly_on S l)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    17
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    18
lemma uniform_limit_iff:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    19
  "uniform_limit S f l F \<longleftrightarrow> (\<forall>e>0. \<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (f n x) (l x) < e)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    20
  unfolding filterlim_iff uniformly_on_def
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    21
  by (subst eventually_INF_base)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    22
    (fastforce
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    23
      simp: eventually_principal uniformly_on_def
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    24
      intro: bexI[where x="min a b" for a b]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    25
      elim: eventually_elim1)+
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    26
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    27
lemma uniform_limitD:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    28
  "uniform_limit S f l F \<Longrightarrow> e > 0 \<Longrightarrow> \<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (f n x) (l x) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    29
  by (simp add: uniform_limit_iff)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    30
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    31
lemma uniform_limitI:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    32
  "(\<And>e. e > 0 \<Longrightarrow> \<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (f n x) (l x) < e) \<Longrightarrow> uniform_limit S f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    33
  by (simp add: uniform_limit_iff)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    34
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    35
lemma uniform_limit_sequentially_iff:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    36
  "uniform_limit S f l sequentially \<longleftrightarrow> (\<forall>e>0. \<exists>N. \<forall>n\<ge>N. \<forall>x \<in> S. dist (f n x) (l x) < e)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    37
  unfolding uniform_limit_iff eventually_sequentially ..
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    38
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    39
lemma uniform_limit_at_iff:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    40
  "uniform_limit S f l (at x) \<longleftrightarrow>
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    41
    (\<forall>e>0. \<exists>d>0. \<forall>z. 0 < dist z x \<and> dist z x < d \<longrightarrow> (\<forall>x\<in>S. dist (f z x) (l x) < e))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    42
  unfolding uniform_limit_iff eventually_at2 ..
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    43
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    44
lemma uniform_limit_at_le_iff:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    45
  "uniform_limit S f l (at x) \<longleftrightarrow>
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    46
    (\<forall>e>0. \<exists>d>0. \<forall>z. 0 < dist z x \<and> dist z x < d \<longrightarrow> (\<forall>x\<in>S. dist (f z x) (l x) \<le> e))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    47
  unfolding uniform_limit_iff eventually_at2
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    48
  by (fastforce dest: spec[where x = "e / 2" for e])
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    49
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    50
lemma swap_uniform_limit:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    51
  assumes f: "\<forall>\<^sub>F n in F. (f n ---> g n) (at x within S)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    52
  assumes g: "(g ---> l) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    53
  assumes uc: "uniform_limit S f h F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    54
  assumes "\<not>trivial_limit F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    55
  shows "(h ---> l) (at x within S)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    56
proof (rule tendstoI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    57
  fix e :: real
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    58
  def e' \<equiv> "e/3"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    59
  assume "0 < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    60
  then have "0 < e'" by (simp add: e'_def)
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
    61
  from uniform_limitD[OF uc \<open>0 < e'\<close>]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    62
  have "\<forall>\<^sub>F n in F. \<forall>x\<in>S. dist (h x) (f n x) < e'"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    63
    by (simp add: dist_commute)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    64
  moreover
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    65
  from f
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    66
  have "\<forall>\<^sub>F n in F. \<forall>\<^sub>F x in at x within S. dist (g n) (f n x) < e'"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
    67
    by eventually_elim (auto dest!: tendstoD[OF _ \<open>0 < e'\<close>] simp: dist_commute)
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    68
  moreover
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
    69
  from tendstoD[OF g \<open>0 < e'\<close>] have "\<forall>\<^sub>F x in F. dist l (g x) < e'"
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    70
    by (simp add: dist_commute)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    71
  ultimately
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    72
  have "\<forall>\<^sub>F _ in F. \<forall>\<^sub>F x in at x within S. dist (h x) l < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    73
  proof eventually_elim
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    74
    case (elim n)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    75
    note fh = elim(1)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    76
    note gl = elim(3)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    77
    have "\<forall>\<^sub>F x in at x within S. x \<in> S"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    78
      by (auto simp: eventually_at_filter)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    79
    with elim(2)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    80
    show ?case
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    81
    proof eventually_elim
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    82
      case (elim x)
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
    83
      from fh[rule_format, OF \<open>x \<in> S\<close>] elim(1)
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    84
      have "dist (h x) (g n) < e' + e'"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    85
        by (rule dist_triangle_lt[OF add_strict_mono])
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    86
      from dist_triangle_lt[OF add_strict_mono, OF this gl]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    87
      show ?case by (simp add: e'_def)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    88
    qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    89
  qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    90
  thus "\<forall>\<^sub>F x in at x within S. dist (h x) l < e"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
    91
    using eventually_happens by (metis \<open>\<not>trivial_limit F\<close>)
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    92
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    93
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    94
lemma
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    95
  tendsto_uniform_limitI:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    96
  assumes "uniform_limit S f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    97
  assumes "x \<in> S"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    98
  shows "((\<lambda>y. f y x) ---> l x) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
    99
  using assms
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   100
  by (auto intro!: tendstoI simp: eventually_elim1 dest!: uniform_limitD)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   101
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   102
lemma uniform_limit_theorem:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   103
  assumes c: "\<forall>\<^sub>F n in F. continuous_on A (f n)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   104
  assumes ul: "uniform_limit A f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   105
  assumes "\<not> trivial_limit F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   106
  shows "continuous_on A l"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   107
  unfolding continuous_on_def
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   108
proof safe
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   109
  fix x assume "x \<in> A"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   110
  then have "\<forall>\<^sub>F n in F. (f n ---> f n x) (at x within A)" "((\<lambda>n. f n x) ---> l x) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   111
    using c ul
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   112
    by (auto simp: continuous_on_def eventually_elim1 tendsto_uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   113
  then show "(l ---> l x) (at x within A)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   114
    by (rule swap_uniform_limit) fact+
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   115
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   116
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   117
lemma weierstrass_m_test:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   118
fixes f :: "_ \<Rightarrow> _ \<Rightarrow> _ :: banach"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   119
assumes "\<And>n x. x \<in> A \<Longrightarrow> norm (f n x) \<le> M n"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   120
assumes "summable M"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   121
shows "uniform_limit A (\<lambda>n x. \<Sum>i<n. f i x) (\<lambda>x. suminf (\<lambda>i. f i x)) sequentially"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   122
proof (rule uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   123
  fix e :: real
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   124
  assume "0 < e"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   125
  from suminf_exist_split[OF \<open>0 < e\<close> \<open>summable M\<close>]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   126
  have "\<forall>\<^sub>F k in sequentially. norm (\<Sum>i. M (i + k)) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   127
    by (auto simp: eventually_sequentially)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   128
  thus "\<forall>\<^sub>F n in sequentially. \<forall>x\<in>A. dist (\<Sum>i<n. f i x) (\<Sum>i. f i x) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   129
  proof eventually_elim
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   130
    case (elim k)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   131
    show ?case
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   132
    proof safe
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   133
      fix x assume "x \<in> A"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   134
      have "\<exists>N. \<forall>n\<ge>N. norm (f n x) \<le> M n"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   135
        using assms(1)[OF \<open>x \<in> A\<close>] by simp
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   136
      hence summable_norm_f: "summable (\<lambda>n. norm (f n x))"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   137
        by(rule summable_norm_comparison_test[OF _ \<open>summable M\<close>])
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   138
      have summable_f: "summable (\<lambda>n. f n x)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   139
        using summable_norm_cancel[OF summable_norm_f] .
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   140
      have summable_norm_f_plus_k: "summable (\<lambda>i. norm (f (i + k) x))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   141
        using summable_ignore_initial_segment[OF summable_norm_f]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   142
        by auto
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   143
      have summable_M_plus_k: "summable (\<lambda>i. M (i + k))"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   144
        using summable_ignore_initial_segment[OF \<open>summable M\<close>]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   145
        by auto
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   146
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   147
      have "dist (\<Sum>i<k. f i x) (\<Sum>i. f i x) = norm ((\<Sum>i. f i x) - (\<Sum>i<k. f i x))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   148
        using dist_norm dist_commute by (subst dist_commute)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   149
      also have "... = norm (\<Sum>i. f (i + k) x)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   150
        using suminf_minus_initial_segment[OF summable_f, where k=k] by simp
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   151
      also have "... \<le> (\<Sum>i. norm (f (i + k) x))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   152
        using summable_norm[OF summable_norm_f_plus_k] .
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   153
      also have "... \<le> (\<Sum>i. M (i + k))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   154
        by (rule suminf_le[OF _ summable_norm_f_plus_k summable_M_plus_k])
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   155
           (simp add: assms(1)[OF \<open>x \<in> A\<close>])
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   156
      finally show "dist (\<Sum>i<k. f i x) (\<Sum>i. f i x) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   157
        using elim by auto
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   158
    qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   159
  qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   160
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   161
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   162
lemma uniform_limit_eq_rhs: "uniform_limit X f l F \<Longrightarrow> l = m \<Longrightarrow> uniform_limit X f m F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   163
  by simp
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   164
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   165
named_theorems uniform_limit_intros "introduction rules for uniform_limit"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   166
setup \<open>
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   167
  Global_Theory.add_thms_dynamic (@{binding uniform_limit_eq_intros},
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   168
    fn context =>
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   169
      Named_Theorems.get (Context.proof_of context) @{named_theorems uniform_limit_intros}
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   170
      |> map_filter (try (fn thm => @{thm uniform_limit_eq_rhs} OF [thm])))
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   171
\<close>
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   172
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   173
lemma (in bounded_linear) uniform_limit[uniform_limit_intros]:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   174
  assumes "uniform_limit X g l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   175
  shows "uniform_limit X (\<lambda>a b. f (g a b)) (\<lambda>a. f (l a)) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   176
proof (rule uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   177
  fix e::real
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   178
  from pos_bounded obtain K
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   179
    where K: "\<And>x y. dist (f x) (f y) \<le> K * dist x y" "K > 0"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   180
    by (auto simp: ac_simps dist_norm diff[symmetric])
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   181
  assume "0 < e" with \<open>K > 0\<close> have "e / K > 0" by simp
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   182
  from uniform_limitD[OF assms this]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   183
  show "\<forall>\<^sub>F n in F. \<forall>x\<in>X. dist (f (g n x)) (f (l x)) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   184
    by eventually_elim (metis le_less_trans mult.commute pos_less_divide_eq K)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   185
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   186
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   187
lemmas bounded_linear_uniform_limit_intros[uniform_limit_intros] =
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   188
  bounded_linear.uniform_limit[OF bounded_linear_Im]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   189
  bounded_linear.uniform_limit[OF bounded_linear_Re]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   190
  bounded_linear.uniform_limit[OF bounded_linear_cnj]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   191
  bounded_linear.uniform_limit[OF bounded_linear_fst]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   192
  bounded_linear.uniform_limit[OF bounded_linear_snd]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   193
  bounded_linear.uniform_limit[OF bounded_linear_zero]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   194
  bounded_linear.uniform_limit[OF bounded_linear_of_real]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   195
  bounded_linear.uniform_limit[OF bounded_linear_inner_left]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   196
  bounded_linear.uniform_limit[OF bounded_linear_inner_right]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   197
  bounded_linear.uniform_limit[OF bounded_linear_divide]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   198
  bounded_linear.uniform_limit[OF bounded_linear_scaleR_right]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   199
  bounded_linear.uniform_limit[OF bounded_linear_mult_left]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   200
  bounded_linear.uniform_limit[OF bounded_linear_mult_right]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   201
  bounded_linear.uniform_limit[OF bounded_linear_scaleR_left]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   202
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   203
lemmas uniform_limit_uminus[uniform_limit_intros] =
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   204
  bounded_linear.uniform_limit[OF bounded_linear_minus[OF bounded_linear_ident]]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   205
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   206
lemma uniform_limit_add[uniform_limit_intros]:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   207
  fixes f g::"'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_vector"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   208
  assumes "uniform_limit X f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   209
  assumes "uniform_limit X g m F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   210
  shows "uniform_limit X (\<lambda>a b. f a b + g a b) (\<lambda>a. l a + m a) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   211
proof (rule uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   212
  fix e::real
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   213
  assume "0 < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   214
  hence "0 < e / 2" by simp
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   215
  from
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   216
    uniform_limitD[OF assms(1) this]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   217
    uniform_limitD[OF assms(2) this]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   218
  show "\<forall>\<^sub>F n in F. \<forall>x\<in>X. dist (f n x + g n x) (l x + m x) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   219
    by eventually_elim (simp add: dist_triangle_add_half)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   220
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   221
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   222
lemma uniform_limit_minus[uniform_limit_intros]:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   223
  fixes f g::"'a \<Rightarrow> 'b \<Rightarrow> 'c::real_normed_vector"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   224
  assumes "uniform_limit X f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   225
  assumes "uniform_limit X g m F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   226
  shows "uniform_limit X (\<lambda>a b. f a b - g a b) (\<lambda>a. l a - m a) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   227
  unfolding diff_conv_add_uminus
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   228
  by (rule uniform_limit_intros assms)+
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   229
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   230
lemma (in bounded_bilinear) bounded_uniform_limit[uniform_limit_intros]:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   231
  assumes "uniform_limit X f l F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   232
  assumes "uniform_limit X g m F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   233
  assumes "bounded (m ` X)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   234
  assumes "bounded (l ` X)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   235
  shows "uniform_limit X (\<lambda>a b. prod (f a b) (g a b)) (\<lambda>a. prod (l a) (m a)) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   236
proof (rule uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   237
  fix e::real
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   238
  from pos_bounded obtain K where K:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   239
    "0 < K" "\<And>a b. norm (prod a b) \<le> norm a * norm b * K"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   240
    by auto
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   241
  hence "sqrt (K*4) > 0" by simp
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   242
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   243
  from assms obtain Km Kl
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   244
  where Km: "Km > 0" "\<And>x. x \<in> X \<Longrightarrow> norm (m x) \<le> Km"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   245
    and Kl: "Kl > 0" "\<And>x. x \<in> X \<Longrightarrow> norm (l x) \<le> Kl"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   246
    by (auto simp: bounded_pos)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   247
  hence "K * Km * 4 > 0" "K * Kl * 4 > 0"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   248
    using \<open>K > 0\<close>
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   249
    by simp_all
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   250
  assume "0 < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   251
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   252
  hence "sqrt e > 0" by simp
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   253
  from uniform_limitD[OF assms(1) divide_pos_pos[OF this \<open>sqrt (K*4) > 0\<close>]]
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   254
    uniform_limitD[OF assms(2) divide_pos_pos[OF this \<open>sqrt (K*4) > 0\<close>]]
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   255
    uniform_limitD[OF assms(1) divide_pos_pos[OF \<open>e > 0\<close> \<open>K * Km * 4 > 0\<close>]]
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   256
    uniform_limitD[OF assms(2) divide_pos_pos[OF \<open>e > 0\<close> \<open>K * Kl * 4 > 0\<close>]]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   257
  show "\<forall>\<^sub>F n in F. \<forall>x\<in>X. dist (prod (f n x) (g n x)) (prod (l x) (m x)) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   258
  proof eventually_elim
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   259
    case (elim n)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   260
    show ?case
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   261
    proof safe
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   262
      fix x assume "x \<in> X"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   263
      have "dist (prod (f n x) (g n x)) (prod (l x) (m x)) \<le>
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   264
        norm (prod (f n x - l x) (g n x - m x)) +
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   265
        norm (prod (f n x - l x) (m x)) +
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   266
        norm (prod (l x) (g n x - m x))"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   267
        by (auto simp: dist_norm prod_diff_prod intro: order_trans norm_triangle_ineq add_mono)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   268
      also note K(2)[of "f n x - l x" "g n x - m x"]
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   269
      also from elim(1)[THEN bspec, OF \<open>_ \<in> X\<close>, unfolded dist_norm]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   270
      have "norm (f n x - l x) \<le> sqrt e / sqrt (K * 4)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   271
        by simp
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   272
      also from elim(2)[THEN bspec, OF \<open>_ \<in> X\<close>, unfolded dist_norm]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   273
      have "norm (g n x - m x) \<le> sqrt e / sqrt (K * 4)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   274
        by simp
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   275
      also have "sqrt e / sqrt (K * 4) * (sqrt e / sqrt (K * 4)) * K = e / 4"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   276
        using \<open>K > 0\<close> \<open>e > 0\<close> by auto
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   277
      also note K(2)[of "f n x - l x" "m x"]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   278
      also note K(2)[of "l x" "g n x - m x"]
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   279
      also from elim(3)[THEN bspec, OF \<open>_ \<in> X\<close>, unfolded dist_norm]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   280
      have "norm (f n x - l x) \<le> e / (K * Km * 4)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   281
        by simp
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   282
      also from elim(4)[THEN bspec, OF \<open>_ \<in> X\<close>, unfolded dist_norm]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   283
      have "norm (g n x - m x) \<le> e / (K * Kl * 4)"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   284
        by simp
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   285
      also note Kl(2)[OF \<open>_ \<in> X\<close>]
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   286
      also note Km(2)[OF \<open>_ \<in> X\<close>]
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   287
      also have "e / (K * Km * 4) * Km * K = e / 4"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   288
        using \<open>K > 0\<close> \<open>Km > 0\<close> by simp
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   289
      also have " Kl * (e / (K * Kl * 4)) * K = e / 4"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   290
        using \<open>K > 0\<close> \<open>Kl > 0\<close> by simp
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   291
      also have "e / 4 + e / 4 + e / 4 < e" using \<open>e > 0\<close> by simp
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   292
      finally show "dist (prod (f n x) (g n x)) (prod (l x) (m x)) < e"
61222
05d28dc76e5c isabelle update_cartouches;
wenzelm
parents: 60812
diff changeset
   293
        using \<open>K > 0\<close> \<open>Kl > 0\<close> \<open>Km > 0\<close> \<open>e > 0\<close>
60812
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   294
        by (simp add: algebra_simps mult_right_mono divide_right_mono)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   295
    qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   296
  qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   297
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   298
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   299
lemmas bounded_bilinear_bounded_uniform_limit_intros[uniform_limit_intros] =
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   300
  bounded_bilinear.bounded_uniform_limit[OF Inner_Product.bounded_bilinear_inner]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   301
  bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_mult]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   302
  bounded_bilinear.bounded_uniform_limit[OF Real_Vector_Spaces.bounded_bilinear_scaleR]
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   303
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   304
lemma metric_uniform_limit_imp_uniform_limit:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   305
  assumes f: "uniform_limit S f a F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   306
  assumes le: "eventually (\<lambda>x. \<forall>y\<in>S. dist (g x y) (b y) \<le> dist (f x y) (a y)) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   307
  shows "uniform_limit S g b F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   308
proof (rule uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   309
  fix e :: real assume "0 < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   310
  from uniform_limitD[OF f this] le
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   311
  show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (g x y) (b y) < e"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   312
    by eventually_elim force
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   313
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   314
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   315
lemma uniform_limit_null_comparison:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   316
  assumes "\<forall>\<^sub>F x in F. \<forall>a\<in>S. norm (f x a) \<le> g x a"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   317
  assumes "uniform_limit S g (\<lambda>_. 0) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   318
  shows "uniform_limit S f (\<lambda>_. 0) F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   319
  using assms(2)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   320
proof (rule metric_uniform_limit_imp_uniform_limit)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   321
  show "\<forall>\<^sub>F x in F. \<forall>y\<in>S. dist (f x y) 0 \<le> dist (g x y) 0"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   322
    using assms(1) by (rule eventually_elim1) (force simp add: dist_norm)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   323
qed
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   324
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   325
lemma uniform_limit_on_union:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   326
  "uniform_limit I f g F \<Longrightarrow> uniform_limit J f g F \<Longrightarrow> uniform_limit (I \<union> J) f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   327
  by (auto intro!: uniform_limitI dest!: uniform_limitD elim: eventually_elim2)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   328
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   329
lemma uniform_limit_on_empty:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   330
  "uniform_limit {} f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   331
  by (auto intro!: uniform_limitI)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   332
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   333
lemma uniform_limit_on_UNION:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   334
  assumes "finite S"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   335
  assumes "\<And>s. s \<in> S \<Longrightarrow> uniform_limit (h s) f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   336
  shows "uniform_limit (UNION S h) f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   337
  using assms
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   338
  by induct (auto intro: uniform_limit_on_empty uniform_limit_on_union)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   339
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   340
lemma uniform_limit_on_Union:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   341
  assumes "finite I"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   342
  assumes "\<And>J. J \<in> I \<Longrightarrow> uniform_limit J f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   343
  shows "uniform_limit (Union I) f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   344
  by (metis SUP_identity_eq assms uniform_limit_on_UNION)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   345
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   346
lemma uniform_limit_on_subset:
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   347
  "uniform_limit J f g F \<Longrightarrow> I \<subseteq> J \<Longrightarrow> uniform_limit I f g F"
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   348
  by (auto intro!: uniform_limitI dest!: uniform_limitD intro: eventually_rev_mono)
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   349
8fff64349793 added theory Uniform_Limit
immler
parents:
diff changeset
   350
end