src/HOL/Analysis/Elementary_Normed_Spaces.thy
author haftmann
Sun, 30 Dec 2018 10:34:56 +0000
changeset 69545 4aed40ecfb43
parent 69544 5aa5a8d6e5b5
child 69611 42cc3609fedf
permissions -rw-r--r--
redundant
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69544
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     1
(*  Author:     L C Paulson, University of Cambridge
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     2
    Author:     Amine Chaieb, University of Cambridge
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     3
    Author:     Robert Himmelmann, TU Muenchen
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     4
    Author:     Brian Huffman, Portland State University
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     5
*)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     6
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     7
section \<open>Elementary Normed Vector Spaces\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     8
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
     9
theory Elementary_Normed_Spaces
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    10
  imports
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    11
  "HOL-Library.FuncSet"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    12
  Elementary_Metric_Spaces
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    13
begin
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    14
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    15
subsection%unimportant \<open>Various Lemmas Combining Imports\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    16
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    17
lemma countable_PiE:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    18
  "finite I \<Longrightarrow> (\<And>i. i \<in> I \<Longrightarrow> countable (F i)) \<Longrightarrow> countable (Pi\<^sub>E I F)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    19
  by (induct I arbitrary: F rule: finite_induct) (auto simp: PiE_insert_eq)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    20
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    21
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    22
lemma open_sums:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    23
  fixes T :: "('b::real_normed_vector) set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    24
  assumes "open S \<or> open T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    25
  shows "open (\<Union>x\<in> S. \<Union>y \<in> T. {x + y})"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    26
  using assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    27
proof
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    28
  assume S: "open S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    29
  show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    30
  proof (clarsimp simp: open_dist)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    31
    fix x y
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    32
    assume "x \<in> S" "y \<in> T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    33
    with S obtain e where "e > 0" and e: "\<And>x'. dist x' x < e \<Longrightarrow> x' \<in> S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    34
      by (auto simp: open_dist)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    35
    then have "\<And>z. dist z (x + y) < e \<Longrightarrow> \<exists>x\<in>S. \<exists>y\<in>T. z = x + y"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    36
      by (metis \<open>y \<in> T\<close> diff_add_cancel dist_add_cancel2)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    37
    then show "\<exists>e>0. \<forall>z. dist z (x + y) < e \<longrightarrow> (\<exists>x\<in>S. \<exists>y\<in>T. z = x + y)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    38
      using \<open>0 < e\<close> \<open>x \<in> S\<close> by blast
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    39
  qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    40
next
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    41
  assume T: "open T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    42
  show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    43
  proof (clarsimp simp: open_dist)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    44
    fix x y
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    45
    assume "x \<in> S" "y \<in> T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    46
    with T obtain e where "e > 0" and e: "\<And>x'. dist x' y < e \<Longrightarrow> x' \<in> T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    47
      by (auto simp: open_dist)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    48
    then have "\<And>z. dist z (x + y) < e \<Longrightarrow> \<exists>x\<in>S. \<exists>y\<in>T. z = x + y"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    49
      by (metis \<open>x \<in> S\<close> add_diff_cancel_left' add_diff_eq diff_diff_add dist_norm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    50
    then show "\<exists>e>0. \<forall>z. dist z (x + y) < e \<longrightarrow> (\<exists>x\<in>S. \<exists>y\<in>T. z = x + y)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    51
      using \<open>0 < e\<close> \<open>y \<in> T\<close> by blast
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    52
  qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    53
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    54
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    55
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    56
subsection \<open>Support\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    57
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    58
definition (in monoid_add) support_on :: "'b set \<Rightarrow> ('b \<Rightarrow> 'a) \<Rightarrow> 'b set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    59
  where "support_on s f = {x\<in>s. f x \<noteq> 0}"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    60
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    61
lemma in_support_on: "x \<in> support_on s f \<longleftrightarrow> x \<in> s \<and> f x \<noteq> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    62
  by (simp add: support_on_def)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    63
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    64
lemma support_on_simps[simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    65
  "support_on {} f = {}"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    66
  "support_on (insert x s) f =
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    67
    (if f x = 0 then support_on s f else insert x (support_on s f))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    68
  "support_on (s \<union> t) f = support_on s f \<union> support_on t f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    69
  "support_on (s \<inter> t) f = support_on s f \<inter> support_on t f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    70
  "support_on (s - t) f = support_on s f - support_on t f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    71
  "support_on (f ` s) g = f ` (support_on s (g \<circ> f))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    72
  unfolding support_on_def by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    73
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    74
lemma support_on_cong:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    75
  "(\<And>x. x \<in> s \<Longrightarrow> f x = 0 \<longleftrightarrow> g x = 0) \<Longrightarrow> support_on s f = support_on s g"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    76
  by (auto simp: support_on_def)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    77
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    78
lemma support_on_if: "a \<noteq> 0 \<Longrightarrow> support_on A (\<lambda>x. if P x then a else 0) = {x\<in>A. P x}"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    79
  by (auto simp: support_on_def)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    80
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    81
lemma support_on_if_subset: "support_on A (\<lambda>x. if P x then a else 0) \<subseteq> {x \<in> A. P x}"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    82
  by (auto simp: support_on_def)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    83
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    84
lemma finite_support[intro]: "finite S \<Longrightarrow> finite (support_on S f)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    85
  unfolding support_on_def by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    86
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    87
(* TODO: is supp_sum really needed? TODO: Generalize to Finite_Set.fold *)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    88
definition (in comm_monoid_add) supp_sum :: "('b \<Rightarrow> 'a) \<Rightarrow> 'b set \<Rightarrow> 'a"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    89
  where "supp_sum f S = (\<Sum>x\<in>support_on S f. f x)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    90
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    91
lemma supp_sum_empty[simp]: "supp_sum f {} = 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    92
  unfolding supp_sum_def by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    93
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    94
lemma supp_sum_insert[simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    95
  "finite (support_on S f) \<Longrightarrow>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    96
    supp_sum f (insert x S) = (if x \<in> S then supp_sum f S else f x + supp_sum f S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    97
  by (simp add: supp_sum_def in_support_on insert_absorb)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    98
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
    99
lemma supp_sum_divide_distrib: "supp_sum f A / (r::'a::field) = supp_sum (\<lambda>n. f n / r) A"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   100
  by (cases "r = 0")
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   101
     (auto simp: supp_sum_def sum_divide_distrib intro!: sum.cong support_on_cong)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   102
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   103
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   104
subsection \<open>Intervals\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   105
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   106
lemma image_affinity_interval:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   107
  fixes c :: "'a::ordered_real_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   108
  shows "((\<lambda>x. m *\<^sub>R x + c) ` {a..b}) = 
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   109
           (if {a..b}={} then {}
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   110
            else if 0 \<le> m then {m *\<^sub>R a + c .. m  *\<^sub>R b + c}
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   111
            else {m *\<^sub>R b + c .. m *\<^sub>R a + c})"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   112
         (is "?lhs = ?rhs")
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   113
proof (cases "m=0")
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   114
  case True
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   115
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   116
    by force
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   117
next
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   118
  case False
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   119
  show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   120
  proof
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   121
    show "?lhs \<subseteq> ?rhs"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   122
      by (auto simp: scaleR_left_mono scaleR_left_mono_neg)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   123
    show "?rhs \<subseteq> ?lhs"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   124
    proof (clarsimp, intro conjI impI subsetI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   125
      show "\<lbrakk>0 \<le> m; a \<le> b; x \<in> {m *\<^sub>R a + c..m *\<^sub>R b + c}\<rbrakk>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   126
            \<Longrightarrow> x \<in> (\<lambda>x. m *\<^sub>R x + c) ` {a..b}" for x
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   127
        apply (rule_tac x="inverse m *\<^sub>R (x-c)" in rev_image_eqI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   128
        using False apply (auto simp: le_diff_eq pos_le_divideRI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   129
        using diff_le_eq pos_le_divideR_eq by force
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   130
      show "\<lbrakk>\<not> 0 \<le> m; a \<le> b;  x \<in> {m *\<^sub>R b + c..m *\<^sub>R a + c}\<rbrakk>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   131
            \<Longrightarrow> x \<in> (\<lambda>x. m *\<^sub>R x + c) ` {a..b}" for x
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   132
        apply (rule_tac x="inverse m *\<^sub>R (x-c)" in rev_image_eqI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   133
        apply (auto simp: diff_le_eq neg_le_divideR_eq)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   134
        using diff_eq_diff_less_eq linordered_field_class.sign_simps(11) minus_diff_eq not_less scaleR_le_cancel_left_neg by fastforce
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   135
    qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   136
  qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   137
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   138
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   139
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   140
subsection%unimportant \<open>Various Lemmas on Normed Algebras\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   141
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   142
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   143
lemma closed_of_nat_image: "closed (of_nat ` A :: 'a::real_normed_algebra_1 set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   144
  by (rule discrete_imp_closed[of 1]) (auto simp: dist_of_nat)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   145
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   146
lemma closed_of_int_image: "closed (of_int ` A :: 'a::real_normed_algebra_1 set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   147
  by (rule discrete_imp_closed[of 1]) (auto simp: dist_of_int)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   148
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   149
lemma closed_Nats [simp]: "closed (\<nat> :: 'a :: real_normed_algebra_1 set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   150
  unfolding Nats_def by (rule closed_of_nat_image)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   151
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   152
lemma closed_Ints [simp]: "closed (\<int> :: 'a :: real_normed_algebra_1 set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   153
  unfolding Ints_def by (rule closed_of_int_image)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   154
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   155
lemma closed_subset_Ints:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   156
  fixes A :: "'a :: real_normed_algebra_1 set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   157
  assumes "A \<subseteq> \<int>"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   158
  shows   "closed A"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   159
proof (intro discrete_imp_closed[OF zero_less_one] ballI impI, goal_cases)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   160
  case (1 x y)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   161
  with assms have "x \<in> \<int>" and "y \<in> \<int>" by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   162
  with \<open>dist y x < 1\<close> show "y = x"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   163
    by (auto elim!: Ints_cases simp: dist_of_int)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   164
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   165
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   166
subsection \<open>Filters\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   167
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   168
definition indirection :: "'a::real_normed_vector \<Rightarrow> 'a \<Rightarrow> 'a filter"  (infixr "indirection" 70)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   169
  where "a indirection v = at a within {b. \<exists>c\<ge>0. b - a = scaleR c v}"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   170
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   171
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   172
subsection \<open>Trivial Limits\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   173
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   174
lemma trivial_limit_at_infinity:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   175
  "\<not> trivial_limit (at_infinity :: ('a::{real_normed_vector,perfect_space}) filter)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   176
  unfolding trivial_limit_def eventually_at_infinity
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   177
  apply clarsimp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   178
  apply (subgoal_tac "\<exists>x::'a. x \<noteq> 0", clarify)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   179
   apply (rule_tac x="scaleR (b / norm x) x" in exI, simp)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   180
  apply (cut_tac islimpt_UNIV [of "0::'a", unfolded islimpt_def])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   181
  apply (drule_tac x=UNIV in spec, simp)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   182
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   183
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   184
subsection \<open>Limits\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   185
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   186
proposition Lim_at_infinity: "(f \<longlongrightarrow> l) at_infinity \<longleftrightarrow> (\<forall>e>0. \<exists>b. \<forall>x. norm x \<ge> b \<longrightarrow> dist (f x) l < e)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   187
  by (auto simp: tendsto_iff eventually_at_infinity)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   188
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   189
corollary Lim_at_infinityI [intro?]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   190
  assumes "\<And>e. e > 0 \<Longrightarrow> \<exists>B. \<forall>x. norm x \<ge> B \<longrightarrow> dist (f x) l \<le> e"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   191
  shows "(f \<longlongrightarrow> l) at_infinity"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   192
  apply (simp add: Lim_at_infinity, clarify)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   193
  apply (rule ex_forward [OF assms [OF half_gt_zero]], auto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   194
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   195
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   196
lemma Lim_transform_within_set_eq:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   197
  fixes a l :: "'a::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   198
  shows "eventually (\<lambda>x. x \<in> s \<longleftrightarrow> x \<in> t) (at a)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   199
         \<Longrightarrow> ((f \<longlongrightarrow> l) (at a within s) \<longleftrightarrow> (f \<longlongrightarrow> l) (at a within t))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   200
  by (force intro: Lim_transform_within_set elim: eventually_mono)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   201
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   202
lemma Lim_null:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   203
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   204
  shows "(f \<longlongrightarrow> l) net \<longleftrightarrow> ((\<lambda>x. f(x) - l) \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   205
  by (simp add: Lim dist_norm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   206
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   207
lemma Lim_null_comparison:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   208
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   209
  assumes "eventually (\<lambda>x. norm (f x) \<le> g x) net" "(g \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   210
  shows "(f \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   211
  using assms(2)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   212
proof (rule metric_tendsto_imp_tendsto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   213
  show "eventually (\<lambda>x. dist (f x) 0 \<le> dist (g x) 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   214
    using assms(1) by (rule eventually_mono) (simp add: dist_norm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   215
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   216
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   217
lemma Lim_transform_bound:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   218
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   219
    and g :: "'a \<Rightarrow> 'c::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   220
  assumes "eventually (\<lambda>n. norm (f n) \<le> norm (g n)) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   221
    and "(g \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   222
  shows "(f \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   223
  using assms(1) tendsto_norm_zero [OF assms(2)]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   224
  by (rule Lim_null_comparison)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   225
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   226
lemma lim_null_mult_right_bounded:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   227
  fixes f :: "'a \<Rightarrow> 'b::real_normed_div_algebra"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   228
  assumes f: "(f \<longlongrightarrow> 0) F" and g: "eventually (\<lambda>x. norm(g x) \<le> B) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   229
    shows "((\<lambda>z. f z * g z) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   230
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   231
  have *: "((\<lambda>x. norm (f x) * B) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   232
    by (simp add: f tendsto_mult_left_zero tendsto_norm_zero)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   233
  have "((\<lambda>x. norm (f x) * norm (g x)) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   234
    apply (rule Lim_null_comparison [OF _ *])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   235
    apply (simp add: eventually_mono [OF g] mult_left_mono)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   236
    done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   237
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   238
    by (subst tendsto_norm_zero_iff [symmetric]) (simp add: norm_mult)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   239
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   240
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   241
lemma lim_null_mult_left_bounded:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   242
  fixes f :: "'a \<Rightarrow> 'b::real_normed_div_algebra"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   243
  assumes g: "eventually (\<lambda>x. norm(g x) \<le> B) F" and f: "(f \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   244
    shows "((\<lambda>z. g z * f z) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   245
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   246
  have *: "((\<lambda>x. B * norm (f x)) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   247
    by (simp add: f tendsto_mult_right_zero tendsto_norm_zero)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   248
  have "((\<lambda>x. norm (g x) * norm (f x)) \<longlongrightarrow> 0) F"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   249
    apply (rule Lim_null_comparison [OF _ *])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   250
    apply (simp add: eventually_mono [OF g] mult_right_mono)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   251
    done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   252
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   253
    by (subst tendsto_norm_zero_iff [symmetric]) (simp add: norm_mult)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   254
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   255
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   256
lemma lim_null_scaleR_bounded:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   257
  assumes f: "(f \<longlongrightarrow> 0) net" and gB: "eventually (\<lambda>a. f a = 0 \<or> norm(g a) \<le> B) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   258
    shows "((\<lambda>n. f n *\<^sub>R g n) \<longlongrightarrow> 0) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   259
proof
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   260
  fix \<epsilon>::real
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   261
  assume "0 < \<epsilon>"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   262
  then have B: "0 < \<epsilon> / (abs B + 1)" by simp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   263
  have *: "\<bar>f x\<bar> * norm (g x) < \<epsilon>" if f: "\<bar>f x\<bar> * (\<bar>B\<bar> + 1) < \<epsilon>" and g: "norm (g x) \<le> B" for x
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   264
  proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   265
    have "\<bar>f x\<bar> * norm (g x) \<le> \<bar>f x\<bar> * B"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   266
      by (simp add: mult_left_mono g)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   267
    also have "\<dots> \<le> \<bar>f x\<bar> * (\<bar>B\<bar> + 1)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   268
      by (simp add: mult_left_mono)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   269
    also have "\<dots> < \<epsilon>"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   270
      by (rule f)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   271
    finally show ?thesis .
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   272
  qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   273
  show "\<forall>\<^sub>F x in net. dist (f x *\<^sub>R g x) 0 < \<epsilon>"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   274
    apply (rule eventually_mono [OF eventually_conj [OF tendstoD [OF f B] gB] ])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   275
    apply (auto simp: \<open>0 < \<epsilon>\<close> divide_simps * split: if_split_asm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   276
    done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   277
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   278
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   279
lemma Lim_norm_ubound:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   280
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   281
  assumes "\<not>(trivial_limit net)" "(f \<longlongrightarrow> l) net" "eventually (\<lambda>x. norm(f x) \<le> e) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   282
  shows "norm(l) \<le> e"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   283
  using assms by (fast intro: tendsto_le tendsto_intros)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   284
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   285
lemma Lim_norm_lbound:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   286
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   287
  assumes "\<not> trivial_limit net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   288
    and "(f \<longlongrightarrow> l) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   289
    and "eventually (\<lambda>x. e \<le> norm (f x)) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   290
  shows "e \<le> norm l"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   291
  using assms by (fast intro: tendsto_le tendsto_intros)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   292
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   293
text\<open>Limit under bilinear function\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   294
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   295
lemma Lim_bilinear:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   296
  assumes "(f \<longlongrightarrow> l) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   297
    and "(g \<longlongrightarrow> m) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   298
    and "bounded_bilinear h"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   299
  shows "((\<lambda>x. h (f x) (g x)) \<longlongrightarrow> (h l m)) net"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   300
  using \<open>bounded_bilinear h\<close> \<open>(f \<longlongrightarrow> l) net\<close> \<open>(g \<longlongrightarrow> m) net\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   301
  by (rule bounded_bilinear.tendsto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   302
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   303
lemma Lim_at_zero:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   304
  fixes a :: "'a::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   305
    and l :: "'b::topological_space"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   306
  shows "(f \<longlongrightarrow> l) (at a) \<longleftrightarrow> ((\<lambda>x. f(a + x)) \<longlongrightarrow> l) (at 0)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   307
  using LIM_offset_zero LIM_offset_zero_cancel ..
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   308
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   309
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   310
subsection%unimportant \<open>Limit Point of Filter\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   311
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   312
lemma netlimit_at_vector:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   313
  fixes a :: "'a::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   314
  shows "netlimit (at a) = a"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   315
proof (cases "\<exists>x. x \<noteq> a")
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   316
  case True then obtain x where x: "x \<noteq> a" ..
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   317
  have "\<not> trivial_limit (at a)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   318
    unfolding trivial_limit_def eventually_at dist_norm
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   319
    apply clarsimp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   320
    apply (rule_tac x="a + scaleR (d / 2) (sgn (x - a))" in exI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   321
    apply (simp add: norm_sgn sgn_zero_iff x)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   322
    done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   323
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   324
    by (rule netlimit_within [of a UNIV])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   325
qed simp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   326
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   327
subsection \<open>Boundedness\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   328
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   329
lemma bounded_pos: "bounded S \<longleftrightarrow> (\<exists>b>0. \<forall>x\<in> S. norm x \<le> b)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   330
  apply (simp add: bounded_iff)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   331
  apply (subgoal_tac "\<And>x (y::real). 0 < 1 + \<bar>y\<bar> \<and> (x \<le> y \<longrightarrow> x \<le> 1 + \<bar>y\<bar>)")
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   332
  apply metis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   333
  apply arith
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   334
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   335
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   336
lemma bounded_pos_less: "bounded S \<longleftrightarrow> (\<exists>b>0. \<forall>x\<in> S. norm x < b)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   337
  apply (simp add: bounded_pos)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   338
  apply (safe; rule_tac x="b+1" in exI; force)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   339
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   340
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   341
lemma Bseq_eq_bounded:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   342
  fixes f :: "nat \<Rightarrow> 'a::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   343
  shows "Bseq f \<longleftrightarrow> bounded (range f)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   344
  unfolding Bseq_def bounded_pos by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   345
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   346
lemma bounded_linear_image:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   347
  assumes "bounded S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   348
    and "bounded_linear f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   349
  shows "bounded (f ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   350
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   351
  from assms(1) obtain b where "b > 0" and b: "\<forall>x\<in>S. norm x \<le> b"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   352
    unfolding bounded_pos by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   353
  from assms(2) obtain B where B: "B > 0" "\<forall>x. norm (f x) \<le> B * norm x"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   354
    using bounded_linear.pos_bounded by (auto simp: ac_simps)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   355
  show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   356
    unfolding bounded_pos
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   357
  proof (intro exI, safe)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   358
    show "norm (f x) \<le> B * b" if "x \<in> S" for x
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   359
      by (meson B b less_imp_le mult_left_mono order_trans that)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   360
  qed (use \<open>b > 0\<close> \<open>B > 0\<close> in auto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   361
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   362
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   363
lemma bounded_scaling:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   364
  fixes S :: "'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   365
  shows "bounded S \<Longrightarrow> bounded ((\<lambda>x. c *\<^sub>R x) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   366
  apply (rule bounded_linear_image, assumption)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   367
  apply (rule bounded_linear_scaleR_right)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   368
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   369
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   370
lemma bounded_scaleR_comp:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   371
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   372
  assumes "bounded (f ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   373
  shows "bounded ((\<lambda>x. r *\<^sub>R f x) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   374
  using bounded_scaling[of "f ` S" r] assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   375
  by (auto simp: image_image)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   376
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   377
lemma bounded_translation:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   378
  fixes S :: "'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   379
  assumes "bounded S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   380
  shows "bounded ((\<lambda>x. a + x) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   381
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   382
  from assms obtain b where b: "b > 0" "\<forall>x\<in>S. norm x \<le> b"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   383
    unfolding bounded_pos by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   384
  {
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   385
    fix x
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   386
    assume "x \<in> S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   387
    then have "norm (a + x) \<le> b + norm a"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   388
      using norm_triangle_ineq[of a x] b by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   389
  }
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   390
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   391
    unfolding bounded_pos
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   392
    using norm_ge_zero[of a] b(1) and add_strict_increasing[of b 0 "norm a"]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   393
    by (auto intro!: exI[of _ "b + norm a"])
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   394
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   395
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   396
lemma bounded_translation_minus:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   397
  fixes S :: "'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   398
  shows "bounded S \<Longrightarrow> bounded ((\<lambda>x. x - a) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   399
using bounded_translation [of S "-a"] by simp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   400
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   401
lemma bounded_uminus [simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   402
  fixes X :: "'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   403
  shows "bounded (uminus ` X) \<longleftrightarrow> bounded X"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   404
by (auto simp: bounded_def dist_norm; rule_tac x="-x" in exI; force simp: add.commute norm_minus_commute)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   405
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   406
lemma uminus_bounded_comp [simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   407
  fixes f :: "'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   408
  shows "bounded ((\<lambda>x. - f x) ` S) \<longleftrightarrow> bounded (f ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   409
  using bounded_uminus[of "f ` S"]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   410
  by (auto simp: image_image)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   411
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   412
lemma bounded_plus_comp:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   413
  fixes f g::"'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   414
  assumes "bounded (f ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   415
  assumes "bounded (g ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   416
  shows "bounded ((\<lambda>x. f x + g x) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   417
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   418
  {
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   419
    fix B C
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   420
    assume "\<And>x. x\<in>S \<Longrightarrow> norm (f x) \<le> B" "\<And>x. x\<in>S \<Longrightarrow> norm (g x) \<le> C"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   421
    then have "\<And>x. x \<in> S \<Longrightarrow> norm (f x + g x) \<le> B + C"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   422
      by (auto intro!: norm_triangle_le add_mono)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   423
  } then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   424
    using assms by (fastforce simp: bounded_iff)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   425
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   426
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   427
lemma bounded_plus:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   428
  fixes S ::"'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   429
  assumes "bounded S" "bounded T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   430
  shows "bounded ((\<lambda>(x,y). x + y) ` (S \<times> T))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   431
  using bounded_plus_comp [of fst "S \<times> T" snd] assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   432
  by (auto simp: split_def split: if_split_asm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   433
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   434
lemma bounded_minus_comp:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   435
  "bounded (f ` S) \<Longrightarrow> bounded (g ` S) \<Longrightarrow> bounded ((\<lambda>x. f x - g x) ` S)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   436
  for f g::"'a \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   437
  using bounded_plus_comp[of "f" S "\<lambda>x. - g x"]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   438
  by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   439
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   440
lemma bounded_minus:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   441
  fixes S ::"'a::real_normed_vector set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   442
  assumes "bounded S" "bounded T"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   443
  shows "bounded ((\<lambda>(x,y). x - y) ` (S \<times> T))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   444
  using bounded_minus_comp [of fst "S \<times> T" snd] assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   445
  by (auto simp: split_def split: if_split_asm)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   446
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   447
lemma not_bounded_UNIV[simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   448
  "\<not> bounded (UNIV :: 'a::{real_normed_vector, perfect_space} set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   449
proof (auto simp: bounded_pos not_le)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   450
  obtain x :: 'a where "x \<noteq> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   451
    using perfect_choose_dist [OF zero_less_one] by fast
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   452
  fix b :: real
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   453
  assume b: "b >0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   454
  have b1: "b +1 \<ge> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   455
    using b by simp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   456
  with \<open>x \<noteq> 0\<close> have "b < norm (scaleR (b + 1) (sgn x))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   457
    by (simp add: norm_sgn)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   458
  then show "\<exists>x::'a. b < norm x" ..
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   459
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   460
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   461
corollary cobounded_imp_unbounded:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   462
    fixes S :: "'a::{real_normed_vector, perfect_space} set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   463
    shows "bounded (- S) \<Longrightarrow> \<not> bounded S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   464
  using bounded_Un [of S "-S"]  by (simp add: sup_compl_top)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   465
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   466
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   467
subsection \<open>Normed spaces with the Heine-Borel property\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   468
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   469
lemma not_compact_UNIV[simp]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   470
  fixes s :: "'a::{real_normed_vector,perfect_space,heine_borel} set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   471
  shows "\<not> compact (UNIV::'a set)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   472
    by (simp add: compact_eq_bounded_closed)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   473
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   474
text\<open>Representing sets as the union of a chain of compact sets.\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   475
lemma closed_Union_compact_subsets:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   476
  fixes S :: "'a::{heine_borel,real_normed_vector} set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   477
  assumes "closed S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   478
  obtains F where "\<And>n. compact(F n)" "\<And>n. F n \<subseteq> S" "\<And>n. F n \<subseteq> F(Suc n)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   479
                  "(\<Union>n. F n) = S" "\<And>K. \<lbrakk>compact K; K \<subseteq> S\<rbrakk> \<Longrightarrow> \<exists>N. \<forall>n \<ge> N. K \<subseteq> F n"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   480
proof
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   481
  show "compact (S \<inter> cball 0 (of_nat n))" for n
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   482
    using assms compact_eq_bounded_closed by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   483
next
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   484
  show "(\<Union>n. S \<inter> cball 0 (real n)) = S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   485
    by (auto simp: real_arch_simple)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   486
next
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   487
  fix K :: "'a set"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   488
  assume "compact K" "K \<subseteq> S"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   489
  then obtain N where "K \<subseteq> cball 0 N"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   490
    by (meson bounded_pos mem_cball_0 compact_imp_bounded subsetI)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   491
  then show "\<exists>N. \<forall>n\<ge>N. K \<subseteq> S \<inter> cball 0 (real n)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   492
    by (metis of_nat_le_iff Int_subset_iff \<open>K \<subseteq> S\<close> real_arch_simple subset_cball subset_trans)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   493
qed auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   494
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   495
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   496
subsection \<open>Continuity\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   497
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   498
subsubsection%unimportant \<open>Structural rules for uniform continuity\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   499
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   500
lemma uniformly_continuous_on_dist[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   501
  fixes f g :: "'a::metric_space \<Rightarrow> 'b::metric_space"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   502
  assumes "uniformly_continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   503
    and "uniformly_continuous_on s g"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   504
  shows "uniformly_continuous_on s (\<lambda>x. dist (f x) (g x))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   505
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   506
  {
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   507
    fix a b c d :: 'b
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   508
    have "\<bar>dist a b - dist c d\<bar> \<le> dist a c + dist b d"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   509
      using dist_triangle2 [of a b c] dist_triangle2 [of b c d]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   510
      using dist_triangle3 [of c d a] dist_triangle [of a d b]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   511
      by arith
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   512
  } note le = this
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   513
  {
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   514
    fix x y
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   515
    assume f: "(\<lambda>n. dist (f (x n)) (f (y n))) \<longlonglongrightarrow> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   516
    assume g: "(\<lambda>n. dist (g (x n)) (g (y n))) \<longlonglongrightarrow> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   517
    have "(\<lambda>n. \<bar>dist (f (x n)) (g (x n)) - dist (f (y n)) (g (y n))\<bar>) \<longlonglongrightarrow> 0"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   518
      by (rule Lim_transform_bound [OF _ tendsto_add_zero [OF f g]],
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   519
        simp add: le)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   520
  }
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   521
  then show ?thesis
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   522
    using assms unfolding uniformly_continuous_on_sequentially
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   523
    unfolding dist_real_def by simp
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   524
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   525
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   526
lemma uniformly_continuous_on_norm[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   527
  fixes f :: "'a :: metric_space \<Rightarrow> 'b :: real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   528
  assumes "uniformly_continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   529
  shows "uniformly_continuous_on s (\<lambda>x. norm (f x))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   530
  unfolding norm_conv_dist using assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   531
  by (intro uniformly_continuous_on_dist uniformly_continuous_on_const)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   532
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   533
lemma uniformly_continuous_on_cmul[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   534
  fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   535
  assumes "uniformly_continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   536
  shows "uniformly_continuous_on s (\<lambda>x. c *\<^sub>R f(x))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   537
  using bounded_linear_scaleR_right assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   538
  by (rule bounded_linear.uniformly_continuous_on)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   539
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   540
lemma dist_minus:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   541
  fixes x y :: "'a::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   542
  shows "dist (- x) (- y) = dist x y"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   543
  unfolding dist_norm minus_diff_minus norm_minus_cancel ..
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   544
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   545
lemma uniformly_continuous_on_minus[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   546
  fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   547
  shows "uniformly_continuous_on s f \<Longrightarrow> uniformly_continuous_on s (\<lambda>x. - f x)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   548
  unfolding uniformly_continuous_on_def dist_minus .
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   549
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   550
lemma uniformly_continuous_on_add[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   551
  fixes f g :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   552
  assumes "uniformly_continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   553
    and "uniformly_continuous_on s g"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   554
  shows "uniformly_continuous_on s (\<lambda>x. f x + g x)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   555
  using assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   556
  unfolding uniformly_continuous_on_sequentially
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   557
  unfolding dist_norm tendsto_norm_zero_iff add_diff_add
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   558
  by (auto intro: tendsto_add_zero)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   559
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   560
lemma uniformly_continuous_on_diff[continuous_intros]:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   561
  fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   562
  assumes "uniformly_continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   563
    and "uniformly_continuous_on s g"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   564
  shows "uniformly_continuous_on s (\<lambda>x. f x - g x)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   565
  using assms uniformly_continuous_on_add [of s f "- g"]
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   566
    by (simp add: fun_Compl_def uniformly_continuous_on_minus)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   567
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   568
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   569
subsection%unimportant \<open>Topological properties of linear functions\<close>
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   570
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   571
lemma linear_lim_0:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   572
  assumes "bounded_linear f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   573
  shows "(f \<longlongrightarrow> 0) (at (0))"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   574
proof -
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   575
  interpret f: bounded_linear f by fact
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   576
  have "(f \<longlongrightarrow> f 0) (at 0)"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   577
    using tendsto_ident_at by (rule f.tendsto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   578
  then show ?thesis unfolding f.zero .
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   579
qed
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   580
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   581
lemma linear_continuous_at:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   582
  assumes "bounded_linear f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   583
  shows "continuous (at a) f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   584
  unfolding continuous_at using assms
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   585
  apply (rule bounded_linear.tendsto)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   586
  apply (rule tendsto_ident_at)
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   587
  done
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   588
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   589
lemma linear_continuous_within:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   590
  "bounded_linear f \<Longrightarrow> continuous (at x within s) f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   591
  using continuous_at_imp_continuous_within[of x f s] using linear_continuous_at[of f] by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   592
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   593
lemma linear_continuous_on:
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   594
  "bounded_linear f \<Longrightarrow> continuous_on s f"
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   595
  using continuous_at_imp_continuous_on[of s f] using linear_continuous_at[of f] by auto
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   596
5aa5a8d6e5b5 split off theorems involving classes below metric_space and real_normed_vector
immler
parents:
diff changeset
   597
end