src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy
changeset 51362 dac3f564a98d
parent 51361 21e5b6efb317
child 51364 8ee377823518
equal deleted inserted replaced
51361:21e5b6efb317 51362:dac3f564a98d
  4255   shows "continuous (at a) (\<lambda>x. inverse (f x))"
  4255   shows "continuous (at a) (\<lambda>x. inverse (f x))"
  4256   using assms unfolding continuous_at by (rule tendsto_inverse)
  4256   using assms unfolding continuous_at by (rule tendsto_inverse)
  4257 
  4257 
  4258 subsubsection {* Structural rules for setwise continuity *}
  4258 subsubsection {* Structural rules for setwise continuity *}
  4259 
  4259 
  4260 lemma continuous_on_id: "continuous_on s (\<lambda>x. x)"
  4260 ML {*
       
  4261 
       
  4262 structure Continuous_On_Intros = Named_Thms
       
  4263 (
       
  4264   val name = @{binding continuous_on_intros}
       
  4265   val description = "Structural introduction rules for setwise continuity"
       
  4266 )
       
  4267 
       
  4268 *}
       
  4269 
       
  4270 setup Continuous_On_Intros.setup
       
  4271 
       
  4272 lemma continuous_on_id[continuous_on_intros]: "continuous_on s (\<lambda>x. x)"
  4261   unfolding continuous_on_def by (fast intro: tendsto_ident_at_within)
  4273   unfolding continuous_on_def by (fast intro: tendsto_ident_at_within)
  4262 
  4274 
  4263 lemma continuous_on_const: "continuous_on s (\<lambda>x. c)"
  4275 lemma continuous_on_const[continuous_on_intros]: "continuous_on s (\<lambda>x. c)"
  4264   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4276   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4265 
  4277 
  4266 lemma continuous_on_norm:
  4278 lemma continuous_on_norm[continuous_on_intros]:
  4267   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. norm (f x))"
  4279   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. norm (f x))"
  4268   unfolding continuous_on_def by (fast intro: tendsto_norm)
  4280   unfolding continuous_on_def by (fast intro: tendsto_norm)
  4269 
  4281 
  4270 lemma continuous_on_infnorm:
  4282 lemma continuous_on_infnorm[continuous_on_intros]:
  4271   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. infnorm (f x))"
  4283   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. infnorm (f x))"
  4272   unfolding continuous_on by (fast intro: tendsto_infnorm)
  4284   unfolding continuous_on by (fast intro: tendsto_infnorm)
  4273 
  4285 
  4274 lemma continuous_on_minus:
  4286 lemma continuous_on_minus[continuous_on_intros]:
  4275   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4287   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4276   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. - f x)"
  4288   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. - f x)"
  4277   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4289   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4278 
  4290 
  4279 lemma continuous_on_add:
  4291 lemma continuous_on_add[continuous_on_intros]:
  4280   fixes f g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4292   fixes f g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4281   shows "continuous_on s f \<Longrightarrow> continuous_on s g
  4293   shows "continuous_on s f \<Longrightarrow> continuous_on s g
  4282            \<Longrightarrow> continuous_on s (\<lambda>x. f x + g x)"
  4294            \<Longrightarrow> continuous_on s (\<lambda>x. f x + g x)"
  4283   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4295   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4284 
  4296 
  4285 lemma continuous_on_diff:
  4297 lemma continuous_on_diff[continuous_on_intros]:
  4286   fixes f g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4298   fixes f g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4287   shows "continuous_on s f \<Longrightarrow> continuous_on s g
  4299   shows "continuous_on s f \<Longrightarrow> continuous_on s g
  4288            \<Longrightarrow> continuous_on s (\<lambda>x. f x - g x)"
  4300            \<Longrightarrow> continuous_on s (\<lambda>x. f x - g x)"
  4289   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4301   unfolding continuous_on_def by (auto intro: tendsto_intros)
  4290 
  4302 
  4291 lemma (in bounded_linear) continuous_on:
  4303 lemma (in bounded_linear) continuous_on[continuous_on_intros]:
  4292   "continuous_on s g \<Longrightarrow> continuous_on s (\<lambda>x. f (g x))"
  4304   "continuous_on s g \<Longrightarrow> continuous_on s (\<lambda>x. f (g x))"
  4293   unfolding continuous_on_def by (fast intro: tendsto)
  4305   unfolding continuous_on_def by (fast intro: tendsto)
  4294 
  4306 
  4295 lemma (in bounded_bilinear) continuous_on:
  4307 lemma (in bounded_bilinear) continuous_on[continuous_on_intros]:
  4296   "\<lbrakk>continuous_on s f; continuous_on s g\<rbrakk> \<Longrightarrow> continuous_on s (\<lambda>x. f x ** g x)"
  4308   "\<lbrakk>continuous_on s f; continuous_on s g\<rbrakk> \<Longrightarrow> continuous_on s (\<lambda>x. f x ** g x)"
  4297   unfolding continuous_on_def by (fast intro: tendsto)
  4309   unfolding continuous_on_def by (fast intro: tendsto)
  4298 
  4310 
  4299 lemma continuous_on_scaleR:
  4311 lemma continuous_on_scaleR[continuous_on_intros]:
  4300   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4312   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  4301   assumes "continuous_on s f" and "continuous_on s g"
  4313   assumes "continuous_on s f" and "continuous_on s g"
  4302   shows "continuous_on s (\<lambda>x. f x *\<^sub>R g x)"
  4314   shows "continuous_on s (\<lambda>x. f x *\<^sub>R g x)"
  4303   using bounded_bilinear_scaleR assms
  4315   using bounded_bilinear_scaleR assms
  4304   by (rule bounded_bilinear.continuous_on)
  4316   by (rule bounded_bilinear.continuous_on)
  4305 
  4317 
  4306 lemma continuous_on_mult:
  4318 lemma continuous_on_mult[continuous_on_intros]:
  4307   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra"
  4319   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra"
  4308   assumes "continuous_on s f" and "continuous_on s g"
  4320   assumes "continuous_on s f" and "continuous_on s g"
  4309   shows "continuous_on s (\<lambda>x. f x * g x)"
  4321   shows "continuous_on s (\<lambda>x. f x * g x)"
  4310   using bounded_bilinear_mult assms
  4322   using bounded_bilinear_mult assms
  4311   by (rule bounded_bilinear.continuous_on)
  4323   by (rule bounded_bilinear.continuous_on)
  4312 
  4324 
  4313 lemma continuous_on_inner:
  4325 lemma continuous_on_inner[continuous_on_intros]:
  4314   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_inner"
  4326   fixes g :: "'a::topological_space \<Rightarrow> 'b::real_inner"
  4315   assumes "continuous_on s f" and "continuous_on s g"
  4327   assumes "continuous_on s f" and "continuous_on s g"
  4316   shows "continuous_on s (\<lambda>x. inner (f x) (g x))"
  4328   shows "continuous_on s (\<lambda>x. inner (f x) (g x))"
  4317   using bounded_bilinear_inner assms
  4329   using bounded_bilinear_inner assms
  4318   by (rule bounded_bilinear.continuous_on)
  4330   by (rule bounded_bilinear.continuous_on)
  4319 
  4331 
  4320 lemma continuous_on_inverse:
  4332 lemma continuous_on_inverse[continuous_on_intros]:
  4321   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_div_algebra"
  4333   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_div_algebra"
  4322   assumes "continuous_on s f" and "\<forall>x\<in>s. f x \<noteq> 0"
  4334   assumes "continuous_on s f" and "\<forall>x\<in>s. f x \<noteq> 0"
  4323   shows "continuous_on s (\<lambda>x. inverse (f x))"
  4335   shows "continuous_on s (\<lambda>x. inverse (f x))"
  4324   using assms unfolding continuous_on by (fast intro: tendsto_inverse)
  4336   using assms unfolding continuous_on by (fast intro: tendsto_inverse)
  4325 
  4337 
  4326 subsubsection {* Structural rules for uniform continuity *}
  4338 subsubsection {* Structural rules for uniform continuity *}
  4327 
  4339 
  4328 lemma uniformly_continuous_on_id:
  4340 lemma uniformly_continuous_on_id[continuous_on_intros]:
  4329   shows "uniformly_continuous_on s (\<lambda>x. x)"
  4341   shows "uniformly_continuous_on s (\<lambda>x. x)"
  4330   unfolding uniformly_continuous_on_def by auto
  4342   unfolding uniformly_continuous_on_def by auto
  4331 
  4343 
  4332 lemma uniformly_continuous_on_const:
  4344 lemma uniformly_continuous_on_const[continuous_on_intros]:
  4333   shows "uniformly_continuous_on s (\<lambda>x. c)"
  4345   shows "uniformly_continuous_on s (\<lambda>x. c)"
  4334   unfolding uniformly_continuous_on_def by simp
  4346   unfolding uniformly_continuous_on_def by simp
  4335 
  4347 
  4336 lemma uniformly_continuous_on_dist:
  4348 lemma uniformly_continuous_on_dist[continuous_on_intros]:
  4337   fixes f g :: "'a::metric_space \<Rightarrow> 'b::metric_space"
  4349   fixes f g :: "'a::metric_space \<Rightarrow> 'b::metric_space"
  4338   assumes "uniformly_continuous_on s f"
  4350   assumes "uniformly_continuous_on s f"
  4339   assumes "uniformly_continuous_on s g"
  4351   assumes "uniformly_continuous_on s g"
  4340   shows "uniformly_continuous_on s (\<lambda>x. dist (f x) (g x))"
  4352   shows "uniformly_continuous_on s (\<lambda>x. dist (f x) (g x))"
  4341 proof -
  4353 proof -
  4353   }
  4365   }
  4354   thus ?thesis using assms unfolding uniformly_continuous_on_sequentially
  4366   thus ?thesis using assms unfolding uniformly_continuous_on_sequentially
  4355     unfolding dist_real_def by simp
  4367     unfolding dist_real_def by simp
  4356 qed
  4368 qed
  4357 
  4369 
  4358 lemma uniformly_continuous_on_norm:
  4370 lemma uniformly_continuous_on_norm[continuous_on_intros]:
  4359   assumes "uniformly_continuous_on s f"
  4371   assumes "uniformly_continuous_on s f"
  4360   shows "uniformly_continuous_on s (\<lambda>x. norm (f x))"
  4372   shows "uniformly_continuous_on s (\<lambda>x. norm (f x))"
  4361   unfolding norm_conv_dist using assms
  4373   unfolding norm_conv_dist using assms
  4362   by (intro uniformly_continuous_on_dist uniformly_continuous_on_const)
  4374   by (intro uniformly_continuous_on_dist uniformly_continuous_on_const)
  4363 
  4375 
  4364 lemma (in bounded_linear) uniformly_continuous_on:
  4376 lemma (in bounded_linear) uniformly_continuous_on[continuous_on_intros]:
  4365   assumes "uniformly_continuous_on s g"
  4377   assumes "uniformly_continuous_on s g"
  4366   shows "uniformly_continuous_on s (\<lambda>x. f (g x))"
  4378   shows "uniformly_continuous_on s (\<lambda>x. f (g x))"
  4367   using assms unfolding uniformly_continuous_on_sequentially
  4379   using assms unfolding uniformly_continuous_on_sequentially
  4368   unfolding dist_norm tendsto_norm_zero_iff diff[symmetric]
  4380   unfolding dist_norm tendsto_norm_zero_iff diff[symmetric]
  4369   by (auto intro: tendsto_zero)
  4381   by (auto intro: tendsto_zero)
  4370 
  4382 
  4371 lemma uniformly_continuous_on_cmul:
  4383 lemma uniformly_continuous_on_cmul[continuous_on_intros]:
  4372   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4384   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4373   assumes "uniformly_continuous_on s f"
  4385   assumes "uniformly_continuous_on s f"
  4374   shows "uniformly_continuous_on s (\<lambda>x. c *\<^sub>R f(x))"
  4386   shows "uniformly_continuous_on s (\<lambda>x. c *\<^sub>R f(x))"
  4375   using bounded_linear_scaleR_right assms
  4387   using bounded_linear_scaleR_right assms
  4376   by (rule bounded_linear.uniformly_continuous_on)
  4388   by (rule bounded_linear.uniformly_continuous_on)
  4378 lemma dist_minus:
  4390 lemma dist_minus:
  4379   fixes x y :: "'a::real_normed_vector"
  4391   fixes x y :: "'a::real_normed_vector"
  4380   shows "dist (- x) (- y) = dist x y"
  4392   shows "dist (- x) (- y) = dist x y"
  4381   unfolding dist_norm minus_diff_minus norm_minus_cancel ..
  4393   unfolding dist_norm minus_diff_minus norm_minus_cancel ..
  4382 
  4394 
  4383 lemma uniformly_continuous_on_minus:
  4395 lemma uniformly_continuous_on_minus[continuous_on_intros]:
  4384   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4396   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4385   shows "uniformly_continuous_on s f \<Longrightarrow> uniformly_continuous_on s (\<lambda>x. - f x)"
  4397   shows "uniformly_continuous_on s f \<Longrightarrow> uniformly_continuous_on s (\<lambda>x. - f x)"
  4386   unfolding uniformly_continuous_on_def dist_minus .
  4398   unfolding uniformly_continuous_on_def dist_minus .
  4387 
  4399 
  4388 lemma uniformly_continuous_on_add:
  4400 lemma uniformly_continuous_on_add[continuous_on_intros]:
  4389   fixes f g :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4401   fixes f g :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4390   assumes "uniformly_continuous_on s f"
  4402   assumes "uniformly_continuous_on s f"
  4391   assumes "uniformly_continuous_on s g"
  4403   assumes "uniformly_continuous_on s g"
  4392   shows "uniformly_continuous_on s (\<lambda>x. f x + g x)"
  4404   shows "uniformly_continuous_on s (\<lambda>x. f x + g x)"
  4393   using assms unfolding uniformly_continuous_on_sequentially
  4405   using assms unfolding uniformly_continuous_on_sequentially
  4394   unfolding dist_norm tendsto_norm_zero_iff add_diff_add
  4406   unfolding dist_norm tendsto_norm_zero_iff add_diff_add
  4395   by (auto intro: tendsto_add_zero)
  4407   by (auto intro: tendsto_add_zero)
  4396 
  4408 
  4397 lemma uniformly_continuous_on_diff:
  4409 lemma uniformly_continuous_on_diff[continuous_on_intros]:
  4398   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4410   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
  4399   assumes "uniformly_continuous_on s f" and "uniformly_continuous_on s g"
  4411   assumes "uniformly_continuous_on s f" and "uniformly_continuous_on s g"
  4400   shows "uniformly_continuous_on s (\<lambda>x. f x - g x)"
  4412   shows "uniformly_continuous_on s (\<lambda>x. f x - g x)"
  4401   unfolding ab_diff_minus using assms
  4413   unfolding ab_diff_minus using assms
  4402   by (intro uniformly_continuous_on_add uniformly_continuous_on_minus)
  4414   by (intro uniformly_continuous_on_add uniformly_continuous_on_minus)
  4409       (\<exists>A. open A \<and> x \<in> A \<and> (\<forall>y\<in>s. y \<in> A \<longrightarrow> f y \<in> B)))"
  4421       (\<exists>A. open A \<and> x \<in> A \<and> (\<forall>y\<in>s. y \<in> A \<longrightarrow> f y \<in> B)))"
  4410 unfolding continuous_within
  4422 unfolding continuous_within
  4411 unfolding tendsto_def Limits.eventually_within eventually_at_topological
  4423 unfolding tendsto_def Limits.eventually_within eventually_at_topological
  4412 by (intro ball_cong [OF refl] all_cong imp_cong ex_cong conj_cong refl) auto
  4424 by (intro ball_cong [OF refl] all_cong imp_cong ex_cong conj_cong refl) auto
  4413 
  4425 
  4414 lemma continuous_within_compose:
  4426 lemma continuous_within_compose[continuous_intros]:
  4415   assumes "continuous (at x within s) f"
  4427   assumes "continuous (at x within s) f"
  4416   assumes "continuous (at (f x) within f ` s) g"
  4428   assumes "continuous (at (f x) within f ` s) g"
  4417   shows "continuous (at x within s) (g o f)"
  4429   shows "continuous (at x within s) (g o f)"
  4418 using assms unfolding continuous_within_topological by simp metis
  4430 using assms unfolding continuous_within_topological by simp metis
  4419 
  4431 
  4420 lemma continuous_at_compose:
  4432 lemma continuous_at_compose[continuous_intros]:
  4421   assumes "continuous (at x) f" and "continuous (at (f x)) g"
  4433   assumes "continuous (at x) f" and "continuous (at (f x)) g"
  4422   shows "continuous (at x) (g o f)"
  4434   shows "continuous (at x) (g o f)"
  4423 proof-
  4435 proof-
  4424   have "continuous (at (f x) within range f) g" using assms(2)
  4436   have "continuous (at (f x) within range f) g" using assms(2)
  4425     using continuous_within_subset[of "f x" UNIV g "range f"] by simp
  4437     using continuous_within_subset[of "f x" UNIV g "range f"] by simp
  4426   thus ?thesis using assms(1)
  4438   thus ?thesis using assms(1)
  4427     using continuous_within_compose[of x UNIV f g] by simp
  4439     using continuous_within_compose[of x UNIV f g] by simp
  4428 qed
  4440 qed
  4429 
  4441 
  4430 lemma continuous_on_compose:
  4442 lemma continuous_on_compose[continuous_on_intros]:
  4431   "continuous_on s f \<Longrightarrow> continuous_on (f ` s) g \<Longrightarrow> continuous_on s (g o f)"
  4443   "continuous_on s f \<Longrightarrow> continuous_on (f ` s) g \<Longrightarrow> continuous_on s (g o f)"
  4432   unfolding continuous_on_topological by simp metis
  4444   unfolding continuous_on_topological by simp metis
  4433 
  4445 
  4434 lemma uniformly_continuous_on_compose:
  4446 lemma uniformly_continuous_on_compose[continuous_on_intros]:
  4435   assumes "uniformly_continuous_on s f"  "uniformly_continuous_on (f ` s) g"
  4447   assumes "uniformly_continuous_on s f"  "uniformly_continuous_on (f ` s) g"
  4436   shows "uniformly_continuous_on s (g o f)"
  4448   shows "uniformly_continuous_on s (g o f)"
  4437 proof-
  4449 proof-
  4438   { fix e::real assume "e>0"
  4450   { fix e::real assume "e>0"
  4439     then obtain d where "d>0" and d:"\<forall>x\<in>f ` s. \<forall>x'\<in>f ` s. dist x' x < d \<longrightarrow> dist (g x') (g x) < e" using assms(2) unfolding uniformly_continuous_on_def by auto
  4451     then obtain d where "d>0" and d:"\<forall>x\<in>f ` s. \<forall>x'\<in>f ` s. dist x' x < d \<longrightarrow> dist (g x') (g x) < e" using assms(2) unfolding uniformly_continuous_on_def by auto
  4440     obtain d' where "d'>0" "\<forall>x\<in>s. \<forall>x'\<in>s. dist x' x < d' \<longrightarrow> dist (f x') (f x) < d" using `d>0` using assms(1) unfolding uniformly_continuous_on_def by auto
  4452     obtain d' where "d'>0" "\<forall>x\<in>s. \<forall>x'\<in>s. dist x' x < d' \<longrightarrow> dist (f x') (f x) < d" using `d>0` using assms(1) unfolding uniformly_continuous_on_def by auto
  4441     hence "\<exists>d>0. \<forall>x\<in>s. \<forall>x'\<in>s. dist x' x < d \<longrightarrow> dist ((g \<circ> f) x') ((g \<circ> f) x) < e" using `d>0` using d by auto  }
  4453     hence "\<exists>d>0. \<forall>x\<in>s. \<forall>x'\<in>s. dist x' x < d \<longrightarrow> dist ((g \<circ> f) x') ((g \<circ> f) x) < e" using `d>0` using d by auto  }
  4442   thus ?thesis using assms unfolding uniformly_continuous_on_def by auto
  4454   thus ?thesis using assms unfolding uniformly_continuous_on_def by auto
  4443 qed
  4455 qed
  4444 
       
  4445 lemmas continuous_on_intros = continuous_on_id continuous_on_const
       
  4446   continuous_on_compose continuous_on_norm continuous_on_infnorm
       
  4447   continuous_on_add continuous_on_minus continuous_on_diff
       
  4448   continuous_on_scaleR continuous_on_mult continuous_on_inverse
       
  4449   continuous_on_inner
       
  4450   uniformly_continuous_on_id uniformly_continuous_on_const
       
  4451   uniformly_continuous_on_dist uniformly_continuous_on_norm
       
  4452   uniformly_continuous_on_compose uniformly_continuous_on_add
       
  4453   uniformly_continuous_on_minus uniformly_continuous_on_diff
       
  4454   uniformly_continuous_on_cmul
       
  4455 
  4456 
  4456 text{* Continuity in terms of open preimages. *}
  4457 text{* Continuity in terms of open preimages. *}
  4457 
  4458 
  4458 lemma continuous_at_open:
  4459 lemma continuous_at_open:
  4459   shows "continuous (at x) f \<longleftrightarrow> (\<forall>t. open t \<and> f x \<in> t --> (\<exists>s. open s \<and> x \<in> s \<and> (\<forall>x' \<in> s. (f x') \<in> t)))"
  4460   shows "continuous (at x) f \<longleftrightarrow> (\<forall>t. open t \<and> f x \<in> t --> (\<exists>s. open s \<and> x \<in> s \<and> (\<forall>x' \<in> s. (f x') \<in> t)))"