src/HOL/Limits.thy
changeset 68064 b249fab48c76
parent 67958 732c0b059463
child 68296 69d680e94961
equal deleted inserted replaced
68051:68def9274939 68064:b249fab48c76
   785   bounded_linear.tendsto [OF bounded_linear_of_real]
   785   bounded_linear.tendsto [OF bounded_linear_of_real]
   786 
   786 
   787 lemmas tendsto_scaleR [tendsto_intros] =
   787 lemmas tendsto_scaleR [tendsto_intros] =
   788   bounded_bilinear.tendsto [OF bounded_bilinear_scaleR]
   788   bounded_bilinear.tendsto [OF bounded_bilinear_scaleR]
   789 
   789 
   790 lemmas tendsto_mult [tendsto_intros] =
   790 
   791   bounded_bilinear.tendsto [OF bounded_bilinear_mult]
   791 text\<open>Analogous type class for multiplication\<close>
       
   792 class topological_semigroup_mult = topological_space + semigroup_mult +
       
   793   assumes tendsto_mult_Pair: "LIM x (nhds a \<times>\<^sub>F nhds b). fst x * snd x :> nhds (a * b)"
       
   794 
       
   795 instance real_normed_algebra < topological_semigroup_mult
       
   796 proof
       
   797   fix a b :: 'a
       
   798   show "((\<lambda>x. fst x * snd x) \<longlongrightarrow> a * b) (nhds a \<times>\<^sub>F nhds b)"
       
   799     unfolding nhds_prod[symmetric]
       
   800     using tendsto_fst[OF filterlim_ident, of "(a,b)"] tendsto_snd[OF filterlim_ident, of "(a,b)"]
       
   801     by (simp add: bounded_bilinear.tendsto [OF bounded_bilinear_mult])
       
   802 qed
       
   803 
       
   804 lemma tendsto_mult [tendsto_intros]:
       
   805   fixes a b :: "'a::topological_semigroup_mult"
       
   806   shows "(f \<longlongrightarrow> a) F \<Longrightarrow> (g \<longlongrightarrow> b) F \<Longrightarrow> ((\<lambda>x. f x * g x) \<longlongrightarrow> a * b) F"
       
   807   using filterlim_compose[OF tendsto_mult_Pair, of "\<lambda>x. (f x, g x)" a b F]
       
   808   by (simp add: nhds_prod[symmetric] tendsto_Pair)
   792 
   809 
   793 lemma tendsto_mult_left: "(f \<longlongrightarrow> l) F \<Longrightarrow> ((\<lambda>x. c * (f x)) \<longlongrightarrow> c * l) F"
   810 lemma tendsto_mult_left: "(f \<longlongrightarrow> l) F \<Longrightarrow> ((\<lambda>x. c * (f x)) \<longlongrightarrow> c * l) F"
   794   for c :: "'a::real_normed_algebra"
   811   for c :: "'a::topological_semigroup_mult"
   795   by (rule tendsto_mult [OF tendsto_const])
   812   by (rule tendsto_mult [OF tendsto_const])
   796 
   813 
   797 lemma tendsto_mult_right: "(f \<longlongrightarrow> l) F \<Longrightarrow> ((\<lambda>x. (f x) * c) \<longlongrightarrow> l * c) F"
   814 lemma tendsto_mult_right: "(f \<longlongrightarrow> l) F \<Longrightarrow> ((\<lambda>x. (f x) * c) \<longlongrightarrow> l * c) F"
   798   for c :: "'a::real_normed_algebra"
   815   for c :: "'a::topological_semigroup_mult"
   799   by (rule tendsto_mult [OF _ tendsto_const])
   816   by (rule tendsto_mult [OF _ tendsto_const])
   800 
   817 
   801 lemmas continuous_of_real [continuous_intros] =
   818 lemmas continuous_of_real [continuous_intros] =
   802   bounded_linear.continuous [OF bounded_linear_of_real]
   819   bounded_linear.continuous [OF bounded_linear_of_real]
   803 
   820 
  2067     by (rule Suc)
  2084     by (rule Suc)
  2068   finally show ?case .
  2085   finally show ?case .
  2069 qed
  2086 qed
  2070 
  2087 
  2071 lemma convergent_add:
  2088 lemma convergent_add:
  2072   fixes X Y :: "nat \<Rightarrow> 'a::real_normed_vector"
  2089   fixes X Y :: "nat \<Rightarrow> 'a::topological_monoid_add"
  2073   assumes "convergent (\<lambda>n. X n)"
  2090   assumes "convergent (\<lambda>n. X n)"
  2074     and "convergent (\<lambda>n. Y n)"
  2091     and "convergent (\<lambda>n. Y n)"
  2075   shows "convergent (\<lambda>n. X n + Y n)"
  2092   shows "convergent (\<lambda>n. X n + Y n)"
  2076   using assms unfolding convergent_def by (blast intro: tendsto_add)
  2093   using assms unfolding convergent_def by (blast intro: tendsto_add)
  2077 
  2094 
  2078 lemma convergent_sum:
  2095 lemma convergent_sum:
  2079   fixes X :: "'a \<Rightarrow> nat \<Rightarrow> 'b::real_normed_vector"
  2096   fixes X :: "'a \<Rightarrow> nat \<Rightarrow> 'b::topological_comm_monoid_add"
  2080   shows "(\<And>i. i \<in> A \<Longrightarrow> convergent (\<lambda>n. X i n)) \<Longrightarrow> convergent (\<lambda>n. \<Sum>i\<in>A. X i n)"
  2097   shows "(\<And>i. i \<in> A \<Longrightarrow> convergent (\<lambda>n. X i n)) \<Longrightarrow> convergent (\<lambda>n. \<Sum>i\<in>A. X i n)"
  2081   by (induct A rule: infinite_finite_induct) (simp_all add: convergent_const convergent_add)
  2098   by (induct A rule: infinite_finite_induct) (simp_all add: convergent_const convergent_add)
  2082 
  2099 
  2083 lemma (in bounded_linear) convergent:
  2100 lemma (in bounded_linear) convergent:
  2084   assumes "convergent (\<lambda>n. X n)"
  2101   assumes "convergent (\<lambda>n. X n)"
  2089   assumes "convergent (\<lambda>n. X n)"
  2106   assumes "convergent (\<lambda>n. X n)"
  2090     and "convergent (\<lambda>n. Y n)"
  2107     and "convergent (\<lambda>n. Y n)"
  2091   shows "convergent (\<lambda>n. X n ** Y n)"
  2108   shows "convergent (\<lambda>n. X n ** Y n)"
  2092   using assms unfolding convergent_def by (blast intro: tendsto)
  2109   using assms unfolding convergent_def by (blast intro: tendsto)
  2093 
  2110 
  2094 lemma convergent_minus_iff: "convergent X \<longleftrightarrow> convergent (\<lambda>n. - X n)"
  2111 lemma convergent_minus_iff:
  2095   for X :: "nat \<Rightarrow> 'a::real_normed_vector"
  2112   fixes X :: "nat \<Rightarrow> 'a::topological_group_add"
  2096   apply (simp add: convergent_def)
  2113   shows "convergent X \<longleftrightarrow> convergent (\<lambda>n. - X n)"
  2097   apply (auto dest: tendsto_minus)
  2114   unfolding convergent_def by (force dest: tendsto_minus)
  2098   apply (drule tendsto_minus)
       
  2099   apply auto
       
  2100   done
       
  2101 
  2115 
  2102 lemma convergent_diff:
  2116 lemma convergent_diff:
  2103   fixes X Y :: "nat \<Rightarrow> 'a::real_normed_vector"
  2117   fixes X Y :: "nat \<Rightarrow> 'a::topological_group_add"
  2104   assumes "convergent (\<lambda>n. X n)"
  2118   assumes "convergent (\<lambda>n. X n)"
  2105   assumes "convergent (\<lambda>n. Y n)"
  2119   assumes "convergent (\<lambda>n. Y n)"
  2106   shows "convergent (\<lambda>n. X n - Y n)"
  2120   shows "convergent (\<lambda>n. X n - Y n)"
  2107   using assms unfolding convergent_def by (blast intro: tendsto_diff)
  2121   using assms unfolding convergent_def by (blast intro: tendsto_diff)
  2108 
  2122 
  2121 lemma convergent_of_real:
  2135 lemma convergent_of_real:
  2122   "convergent f \<Longrightarrow> convergent (\<lambda>n. of_real (f n) :: 'a::real_normed_algebra_1)"
  2136   "convergent f \<Longrightarrow> convergent (\<lambda>n. of_real (f n) :: 'a::real_normed_algebra_1)"
  2123   unfolding convergent_def by (blast intro!: tendsto_of_real)
  2137   unfolding convergent_def by (blast intro!: tendsto_of_real)
  2124 
  2138 
  2125 lemma convergent_add_const_iff:
  2139 lemma convergent_add_const_iff:
  2126   "convergent (\<lambda>n. c + f n :: 'a::real_normed_vector) \<longleftrightarrow> convergent f"
  2140   "convergent (\<lambda>n. c + f n :: 'a::topological_ab_group_add) \<longleftrightarrow> convergent f"
  2127 proof
  2141 proof
  2128   assume "convergent (\<lambda>n. c + f n)"
  2142   assume "convergent (\<lambda>n. c + f n)"
  2129   from convergent_diff[OF this convergent_const[of c]] show "convergent f"
  2143   from convergent_diff[OF this convergent_const[of c]] show "convergent f"
  2130     by simp
  2144     by simp
  2131 next
  2145 next
  2133   from convergent_add[OF convergent_const[of c] this] show "convergent (\<lambda>n. c + f n)"
  2147   from convergent_add[OF convergent_const[of c] this] show "convergent (\<lambda>n. c + f n)"
  2134     by simp
  2148     by simp
  2135 qed
  2149 qed
  2136 
  2150 
  2137 lemma convergent_add_const_right_iff:
  2151 lemma convergent_add_const_right_iff:
  2138   "convergent (\<lambda>n. f n + c :: 'a::real_normed_vector) \<longleftrightarrow> convergent f"
  2152   "convergent (\<lambda>n. f n + c :: 'a::topological_ab_group_add) \<longleftrightarrow> convergent f"
  2139   using convergent_add_const_iff[of c f] by (simp add: add_ac)
  2153   using convergent_add_const_iff[of c f] by (simp add: add_ac)
  2140 
  2154 
  2141 lemma convergent_diff_const_right_iff:
  2155 lemma convergent_diff_const_right_iff:
  2142   "convergent (\<lambda>n. f n - c :: 'a::real_normed_vector) \<longleftrightarrow> convergent f"
  2156   "convergent (\<lambda>n. f n - c :: 'a::topological_ab_group_add) \<longleftrightarrow> convergent f"
  2143   using convergent_add_const_right_iff[of f "-c"] by (simp add: add_ac)
  2157   using convergent_add_const_right_iff[of f "-c"] by (simp add: add_ac)
  2144 
  2158 
  2145 lemma convergent_mult:
  2159 lemma convergent_mult:
  2146   fixes X Y :: "nat \<Rightarrow> 'a::real_normed_field"
  2160   fixes X Y :: "nat \<Rightarrow> 'a::topological_semigroup_mult"
  2147   assumes "convergent (\<lambda>n. X n)"
  2161   assumes "convergent (\<lambda>n. X n)"
  2148     and "convergent (\<lambda>n. Y n)"
  2162     and "convergent (\<lambda>n. Y n)"
  2149   shows "convergent (\<lambda>n. X n * Y n)"
  2163   shows "convergent (\<lambda>n. X n * Y n)"
  2150   using assms unfolding convergent_def by (blast intro: tendsto_mult)
  2164   using assms unfolding convergent_def by (blast intro: tendsto_mult)
  2151 
  2165 
  2152 lemma convergent_mult_const_iff:
  2166 lemma convergent_mult_const_iff:
  2153   assumes "c \<noteq> 0"
  2167   assumes "c \<noteq> 0"
  2154   shows "convergent (\<lambda>n. c * f n :: 'a::real_normed_field) \<longleftrightarrow> convergent f"
  2168   shows "convergent (\<lambda>n. c * f n :: 'a::{field,topological_semigroup_mult}) \<longleftrightarrow> convergent f"
  2155 proof
  2169 proof
  2156   assume "convergent (\<lambda>n. c * f n)"
  2170   assume "convergent (\<lambda>n. c * f n)"
  2157   from assms convergent_mult[OF this convergent_const[of "inverse c"]]
  2171   from assms convergent_mult[OF this convergent_const[of "inverse c"]]
  2158     show "convergent f" by (simp add: field_simps)
  2172     show "convergent f" by (simp add: field_simps)
  2159 next
  2173 next
  2161   from convergent_mult[OF convergent_const[of c] this] show "convergent (\<lambda>n. c * f n)"
  2175   from convergent_mult[OF convergent_const[of c] this] show "convergent (\<lambda>n. c * f n)"
  2162     by simp
  2176     by simp
  2163 qed
  2177 qed
  2164 
  2178 
  2165 lemma convergent_mult_const_right_iff:
  2179 lemma convergent_mult_const_right_iff:
  2166   fixes c :: "'a::real_normed_field"
  2180   fixes c :: "'a::{field,topological_semigroup_mult}"
  2167   assumes "c \<noteq> 0"
  2181   assumes "c \<noteq> 0"
  2168   shows "convergent (\<lambda>n. f n * c) \<longleftrightarrow> convergent f"
  2182   shows "convergent (\<lambda>n. f n * c) \<longleftrightarrow> convergent f"
  2169   using convergent_mult_const_iff[OF assms, of f] by (simp add: mult_ac)
  2183   using convergent_mult_const_iff[OF assms, of f] by (simp add: mult_ac)
  2170 
  2184 
  2171 lemma convergent_imp_Bseq: "convergent f \<Longrightarrow> Bseq f"
  2185 lemma convergent_imp_Bseq: "convergent f \<Longrightarrow> Bseq f"