src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy
changeset 44647 e4de7750cdeb
parent 44632 076a45f65e12
child 44648 897f32a827f2
equal deleted inserted replaced
44646:a6047ddd9377 44647:e4de7750cdeb
  3330   using continuous_transform_within [of d x UNIV f g] assms
  3330   using continuous_transform_within [of d x UNIV f g] assms
  3331   by (simp add: within_UNIV)
  3331   by (simp add: within_UNIV)
  3332 
  3332 
  3333 text{* Combination results for pointwise continuity. *}
  3333 text{* Combination results for pointwise continuity. *}
  3334 
  3334 
  3335 lemma continuous_const: "continuous net (\<lambda>x. c)"
  3335 lemma continuous_within_id: "continuous (at a within s) (\<lambda>x. x)"
  3336   by (auto simp add: continuous_def tendsto_const)
  3336   unfolding continuous_within by (rule tendsto_ident_at_within)
  3337 
  3337 
  3338 lemma continuous_cmul:
  3338 lemma continuous_at_id: "continuous (at a) (\<lambda>x. x)"
  3339   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3339   unfolding continuous_at by (rule tendsto_ident_at)
  3340   shows "continuous net f ==> continuous net (\<lambda>x. c *\<^sub>R f x)"
  3340 
  3341   by (auto simp add: continuous_def intro: tendsto_intros)
  3341 lemma continuous_const: "continuous F (\<lambda>x. c)"
  3342 
  3342   unfolding continuous_def by (rule tendsto_const)
  3343 lemma continuous_neg:
  3343 
  3344   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3344 lemma continuous_dist:
  3345   shows "continuous net f ==> continuous net (\<lambda>x. -(f x))"
  3345   assumes "continuous F f" and "continuous F g"
  3346   by (auto simp add: continuous_def tendsto_minus)
  3346   shows "continuous F (\<lambda>x. dist (f x) (g x))"
       
  3347   using assms unfolding continuous_def by (rule tendsto_dist)
       
  3348 
       
  3349 lemma continuous_norm:
       
  3350   shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. norm (f x))"
       
  3351   unfolding continuous_def by (rule tendsto_norm)
       
  3352 
       
  3353 lemma continuous_infnorm:
       
  3354   shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. infnorm (f x))"
       
  3355   unfolding continuous_def by (rule tendsto_infnorm)
  3347 
  3356 
  3348 lemma continuous_add:
  3357 lemma continuous_add:
  3349   fixes f g :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3358   fixes f g :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3350   shows "continuous net f \<Longrightarrow> continuous net g \<Longrightarrow> continuous net (\<lambda>x. f x + g x)"
  3359   shows "\<lbrakk>continuous F f; continuous F g\<rbrakk> \<Longrightarrow> continuous F (\<lambda>x. f x + g x)"
  3351   by (auto simp add: continuous_def tendsto_add)
  3360   unfolding continuous_def by (rule tendsto_add)
  3352 
  3361 
  3353 lemma continuous_sub:
  3362 lemma continuous_minus:
       
  3363   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
       
  3364   shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. - f x)"
       
  3365   unfolding continuous_def by (rule tendsto_minus)
       
  3366 
       
  3367 lemma continuous_diff:
  3354   fixes f g :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3368   fixes f g :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
  3355   shows "continuous net f \<Longrightarrow> continuous net g \<Longrightarrow> continuous net (\<lambda>x. f x - g x)"
  3369   shows "\<lbrakk>continuous F f; continuous F g\<rbrakk> \<Longrightarrow> continuous F (\<lambda>x. f x - g x)"
  3356   by (auto simp add: continuous_def tendsto_diff)
  3370   unfolding continuous_def by (rule tendsto_diff)
  3357 
  3371 
       
  3372 lemma continuous_scaleR:
       
  3373   fixes g :: "'a::t2_space \<Rightarrow> 'b::real_normed_vector"
       
  3374   shows "\<lbrakk>continuous F f; continuous F g\<rbrakk> \<Longrightarrow> continuous F (\<lambda>x. f x *\<^sub>R g x)"
       
  3375   unfolding continuous_def by (rule tendsto_scaleR)
       
  3376 
       
  3377 lemma continuous_mult:
       
  3378   fixes f g :: "'a::t2_space \<Rightarrow> 'b::real_normed_algebra"
       
  3379   shows "\<lbrakk>continuous F f; continuous F g\<rbrakk> \<Longrightarrow> continuous F (\<lambda>x. f x * g x)"
       
  3380   unfolding continuous_def by (rule tendsto_mult)
       
  3381 
       
  3382 lemma continuous_inner:
       
  3383   assumes "continuous F f" and "continuous F g"
       
  3384   shows "continuous F (\<lambda>x. inner (f x) (g x))"
       
  3385   using assms unfolding continuous_def by (rule tendsto_inner)
       
  3386 
       
  3387 lemma continuous_euclidean_component:
       
  3388   shows "continuous F f \<Longrightarrow> continuous F (\<lambda>x. f x $$ i)"
       
  3389   unfolding continuous_def by (rule tendsto_euclidean_component)
       
  3390 
       
  3391 lemma continuous_inverse:
       
  3392   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_div_algebra"
       
  3393   assumes "continuous F f" and "f (netlimit F) \<noteq> 0"
       
  3394   shows "continuous F (\<lambda>x. inverse (f x))"
       
  3395   using assms unfolding continuous_def by (rule tendsto_inverse)
       
  3396 
       
  3397 lemma continuous_at_within_inverse:
       
  3398   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_div_algebra"
       
  3399   assumes "continuous (at a within s) f" and "f a \<noteq> 0"
       
  3400   shows "continuous (at a within s) (\<lambda>x. inverse (f x))"
       
  3401   using assms unfolding continuous_within by (rule tendsto_inverse)
       
  3402 
       
  3403 lemma continuous_at_inverse:
       
  3404   fixes f :: "'a::t2_space \<Rightarrow> 'b::real_normed_div_algebra"
       
  3405   assumes "continuous (at a) f" and "f a \<noteq> 0"
       
  3406   shows "continuous (at a) (\<lambda>x. inverse (f x))"
       
  3407   using assms unfolding continuous_at by (rule tendsto_inverse)
       
  3408 
       
  3409 lemmas continuous_intros = continuous_at_id continuous_within_id
       
  3410   continuous_const continuous_dist continuous_norm continuous_infnorm
       
  3411   continuous_add continuous_minus continuous_diff
       
  3412   continuous_scaleR continuous_mult
       
  3413   continuous_inner continuous_euclidean_component
       
  3414   continuous_at_inverse continuous_at_within_inverse
  3358 
  3415 
  3359 text{* Same thing for setwise continuity. *}
  3416 text{* Same thing for setwise continuity. *}
       
  3417 
       
  3418 lemma continuous_on_id: "continuous_on s (\<lambda>x. x)"
       
  3419   unfolding continuous_on_def by (fast intro: tendsto_ident_at_within)
  3360 
  3420 
  3361 lemma continuous_on_const: "continuous_on s (\<lambda>x. c)"
  3421 lemma continuous_on_const: "continuous_on s (\<lambda>x. c)"
  3362   unfolding continuous_on_def by (auto intro: tendsto_intros)
  3422   unfolding continuous_on_def by (auto intro: tendsto_intros)
       
  3423 
       
  3424 lemma continuous_on_norm:
       
  3425   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. norm (f x))"
       
  3426   unfolding continuous_on_def by (fast intro: tendsto_norm)
       
  3427 
       
  3428 lemma continuous_on_infnorm:
       
  3429   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. infnorm (f x))"
       
  3430   unfolding continuous_on by (fast intro: tendsto_infnorm)
  3363 
  3431 
  3364 lemma continuous_on_minus:
  3432 lemma continuous_on_minus:
  3365   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  3433   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_vector"
  3366   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. - f x)"
  3434   shows "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. - f x)"
  3367   unfolding continuous_on_def by (auto intro: tendsto_intros)
  3435   unfolding continuous_on_def by (auto intro: tendsto_intros)
  3410 lemma continuous_on_euclidean_component:
  3478 lemma continuous_on_euclidean_component:
  3411   "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. f x $$ i)"
  3479   "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. f x $$ i)"
  3412   using bounded_linear_euclidean_component
  3480   using bounded_linear_euclidean_component
  3413   by (rule bounded_linear.continuous_on)
  3481   by (rule bounded_linear.continuous_on)
  3414 
  3482 
       
  3483 lemma continuous_on_inverse:
       
  3484   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_div_algebra"
       
  3485   assumes "continuous_on s f" and "\<forall>x\<in>s. f x \<noteq> 0"
       
  3486   shows "continuous_on s (\<lambda>x. inverse (f x))"
       
  3487   using assms unfolding continuous_on by (fast intro: tendsto_inverse)
       
  3488 
  3415 text{* Same thing for uniform continuity, using sequential formulations. *}
  3489 text{* Same thing for uniform continuity, using sequential formulations. *}
       
  3490 
       
  3491 lemma uniformly_continuous_on_id:
       
  3492  "uniformly_continuous_on s (\<lambda>x. x)"
       
  3493   unfolding uniformly_continuous_on_def by auto
  3416 
  3494 
  3417 lemma uniformly_continuous_on_const:
  3495 lemma uniformly_continuous_on_const:
  3418  "uniformly_continuous_on s (\<lambda>x. c)"
  3496  "uniformly_continuous_on s (\<lambda>x. c)"
  3419   unfolding uniformly_continuous_on_def by simp
  3497   unfolding uniformly_continuous_on_def by simp
  3420 
  3498 
  3463            ==> uniformly_continuous_on s  (\<lambda>x. f x - g x)"
  3541            ==> uniformly_continuous_on s  (\<lambda>x. f x - g x)"
  3464   unfolding ab_diff_minus
  3542   unfolding ab_diff_minus
  3465   using uniformly_continuous_on_add[of s f "\<lambda>x. - g x"]
  3543   using uniformly_continuous_on_add[of s f "\<lambda>x. - g x"]
  3466   using uniformly_continuous_on_neg[of s g] by auto
  3544   using uniformly_continuous_on_neg[of s g] by auto
  3467 
  3545 
  3468 text{* Identity function is continuous in every sense. *}
       
  3469 
       
  3470 lemma continuous_within_id:
       
  3471  "continuous (at a within s) (\<lambda>x. x)"
       
  3472   unfolding continuous_within by (rule Lim_at_within [OF tendsto_ident_at])
       
  3473 
       
  3474 lemma continuous_at_id:
       
  3475  "continuous (at a) (\<lambda>x. x)"
       
  3476   unfolding continuous_at by (rule tendsto_ident_at)
       
  3477 
       
  3478 lemma continuous_on_id:
       
  3479  "continuous_on s (\<lambda>x. x)"
       
  3480   unfolding continuous_on_def by (auto intro: tendsto_ident_at_within)
       
  3481 
       
  3482 lemma uniformly_continuous_on_id:
       
  3483  "uniformly_continuous_on s (\<lambda>x. x)"
       
  3484   unfolding uniformly_continuous_on_def by auto
       
  3485 
       
  3486 text{* Continuity of all kinds is preserved under composition. *}
  3546 text{* Continuity of all kinds is preserved under composition. *}
  3487 
  3547 
  3488 lemma continuous_within_topological:
  3548 lemma continuous_within_topological:
  3489   "continuous (at x within s) f \<longleftrightarrow>
  3549   "continuous (at x within s) f \<longleftrightarrow>
  3490     (\<forall>B. open B \<longrightarrow> f x \<in> B \<longrightarrow>
  3550     (\<forall>B. open B \<longrightarrow> f x \<in> B \<longrightarrow>
  3519     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
  3579     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
  3520     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
  3580     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
  3521     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  }
  3581     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  }
  3522   thus ?thesis using assms unfolding uniformly_continuous_on_def by auto
  3582   thus ?thesis using assms unfolding uniformly_continuous_on_def by auto
  3523 qed
  3583 qed
       
  3584 
       
  3585 lemmas continuous_on_intros = continuous_on_id continuous_on_const
       
  3586   continuous_on_compose continuous_on_norm continuous_on_infnorm
       
  3587   continuous_on_add continuous_on_minus continuous_on_diff
       
  3588   continuous_on_scaleR continuous_on_mult continuous_on_inverse
       
  3589   continuous_on_inner continuous_on_euclidean_component
       
  3590   uniformly_continuous_on_add uniformly_continuous_on_const
       
  3591   uniformly_continuous_on_id uniformly_continuous_on_compose
       
  3592   uniformly_continuous_on_cmul uniformly_continuous_on_neg
       
  3593   uniformly_continuous_on_sub
  3524 
  3594 
  3525 text{* Continuity in terms of open preimages. *}
  3595 text{* Continuity in terms of open preimages. *}
  3526 
  3596 
  3527 lemma continuous_at_open:
  3597 lemma continuous_at_open:
  3528   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)))"
  3598   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)))"
  3802 
  3872 
  3803 lemma open_translation:
  3873 lemma open_translation:
  3804   fixes s :: "'a::real_normed_vector set"
  3874   fixes s :: "'a::real_normed_vector set"
  3805   assumes "open s"  shows "open((\<lambda>x. a + x) ` s)"
  3875   assumes "open s"  shows "open((\<lambda>x. a + x) ` s)"
  3806 proof-
  3876 proof-
  3807   { fix x have "continuous (at x) (\<lambda>x. x - a)" using continuous_sub[of "at x" "\<lambda>x. x" "\<lambda>x. a"] continuous_at_id[of x] continuous_const[of "at x" a] by auto  }
  3877   { fix x have "continuous (at x) (\<lambda>x. x - a)"
  3808   moreover have "{x. x - a \<in> s}  = op + a ` s" apply auto unfolding image_iff apply(rule_tac x="x - a" in bexI) by auto
  3878       by (intro continuous_diff continuous_at_id continuous_const) }
       
  3879   moreover have "{x. x - a \<in> s} = op + a ` s" by force
  3809   ultimately show ?thesis using continuous_open_preimage_univ[of "\<lambda>x. x - a" s] using assms by auto
  3880   ultimately show ?thesis using continuous_open_preimage_univ[of "\<lambda>x. x - a" s] using assms by auto
  3810 qed
  3881 qed
  3811 
  3882 
  3812 lemma open_affinity:
  3883 lemma open_affinity:
  3813   fixes s :: "'a::real_normed_vector set"
  3884   fixes s :: "'a::real_normed_vector set"
  3836     hence "z \<in> op + a ` s" unfolding image_iff by(auto intro!: bexI[where x="z - a"])  }
  3907     hence "z \<in> op + a ` s" unfolding image_iff by(auto intro!: bexI[where x="z - a"])  }
  3837   hence "ball x e \<subseteq> op + a ` s" unfolding subset_eq by auto
  3908   hence "ball x e \<subseteq> op + a ` s" unfolding subset_eq by auto
  3838   thus "x \<in> interior (op + a ` s)" unfolding mem_interior using `e>0` by auto
  3909   thus "x \<in> interior (op + a ` s)" unfolding mem_interior using `e>0` by auto
  3839 qed
  3910 qed
  3840 
  3911 
  3841 text {* We can now extend limit compositions to consider the scalar multiplier. *}
       
  3842 
       
  3843 lemma continuous_vmul:
       
  3844   fixes c :: "'a::metric_space \<Rightarrow> real" and v :: "'b::real_normed_vector"
       
  3845   shows "continuous net c ==> continuous net (\<lambda>x. c(x) *\<^sub>R v)"
       
  3846   unfolding continuous_def by (intro tendsto_intros)
       
  3847 
       
  3848 lemma continuous_mul:
       
  3849   fixes c :: "'a::metric_space \<Rightarrow> real"
       
  3850   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_vector"
       
  3851   shows "continuous net c \<Longrightarrow> continuous net f
       
  3852              ==> continuous net (\<lambda>x. c(x) *\<^sub>R f x) "
       
  3853   unfolding continuous_def by (intro tendsto_intros)
       
  3854 
       
  3855 lemmas continuous_intros = continuous_add continuous_vmul continuous_cmul
       
  3856   continuous_const continuous_sub continuous_at_id continuous_within_id continuous_mul
       
  3857 
       
  3858 lemmas continuous_on_intros = continuous_on_add continuous_on_const
       
  3859   continuous_on_id continuous_on_compose continuous_on_minus
       
  3860   continuous_on_diff continuous_on_scaleR continuous_on_mult
       
  3861   continuous_on_inner continuous_on_euclidean_component
       
  3862   uniformly_continuous_on_add uniformly_continuous_on_const
       
  3863   uniformly_continuous_on_id uniformly_continuous_on_compose
       
  3864   uniformly_continuous_on_cmul uniformly_continuous_on_neg
       
  3865   uniformly_continuous_on_sub
       
  3866 
       
  3867 text {* And so we have continuity of inverse. *}
       
  3868 
       
  3869 lemma continuous_inv:
       
  3870   fixes f :: "'a::metric_space \<Rightarrow> real"
       
  3871   shows "continuous net f \<Longrightarrow> f(netlimit net) \<noteq> 0
       
  3872            ==> continuous net (inverse o f)"
       
  3873   unfolding continuous_def using Lim_inv by auto
       
  3874 
       
  3875 lemma continuous_at_within_inv:
       
  3876   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_field"
       
  3877   assumes "continuous (at a within s) f" "f a \<noteq> 0"
       
  3878   shows "continuous (at a within s) (inverse o f)"
       
  3879   using assms unfolding continuous_within o_def
       
  3880   by (intro tendsto_intros)
       
  3881 
       
  3882 lemma continuous_at_inv:
       
  3883   fixes f :: "'a::metric_space \<Rightarrow> 'b::real_normed_field"
       
  3884   shows "continuous (at a) f \<Longrightarrow> f a \<noteq> 0
       
  3885          ==> continuous (at a) (inverse o f) "
       
  3886   using within_UNIV[THEN sym, of "at a"] using continuous_at_within_inv[of a UNIV] by auto
       
  3887 
       
  3888 text {* Topological properties of linear functions. *}
  3912 text {* Topological properties of linear functions. *}
  3889 
  3913 
  3890 lemma linear_lim_0:
  3914 lemma linear_lim_0:
  3891   assumes "bounded_linear f" shows "(f ---> 0) (at (0))"
  3915   assumes "bounded_linear f" shows "(f ---> 0) (at (0))"
  3892 proof-
  3916 proof-
  3997   thus ?thesis unfolding uniformly_continuous_on_def by auto
  4021   thus ?thesis unfolding uniformly_continuous_on_def by auto
  3998 qed
  4022 qed
  3999 
  4023 
  4000 text{* Continuity of inverse function on compact domain. *}
  4024 text{* Continuity of inverse function on compact domain. *}
  4001 
  4025 
  4002 lemma continuous_on_inverse:
  4026 lemma continuous_on_inv:
  4003   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  4027   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  4004     (* TODO: can this be generalized more? *)
  4028     (* TODO: can this be generalized more? *)
  4005   assumes "continuous_on s f"  "compact s"  "\<forall>x \<in> s. g (f x) = x"
  4029   assumes "continuous_on s f"  "compact s"  "\<forall>x \<in> s. g (f x) = x"
  4006   shows "continuous_on (f ` s) g"
  4030   shows "continuous_on (f ` s) g"
  4007 proof-
  4031 proof-
  4087 
  4111 
  4088 lemma continuous_on_real_range:
  4112 lemma continuous_on_real_range:
  4089   fixes f :: "'a::real_normed_vector \<Rightarrow> real"
  4113   fixes f :: "'a::real_normed_vector \<Rightarrow> real"
  4090   shows "continuous_on s f \<longleftrightarrow> (\<forall>x \<in> s. \<forall>e>0. \<exists>d>0. (\<forall>x' \<in> s. norm(x' - x) < d --> abs(f x' - f x) < e))"
  4114   shows "continuous_on s f \<longleftrightarrow> (\<forall>x \<in> s. \<forall>e>0. \<exists>d>0. (\<forall>x' \<in> s. norm(x' - x) < d --> abs(f x' - f x) < e))"
  4091   unfolding continuous_on_iff dist_norm by simp
  4115   unfolding continuous_on_iff dist_norm by simp
  4092 
       
  4093 lemma continuous_at_norm: "continuous (at x) norm"
       
  4094   unfolding continuous_at by (intro tendsto_intros)
       
  4095 
       
  4096 lemma continuous_on_norm: "continuous_on s norm"
       
  4097 unfolding continuous_on by (intro ballI tendsto_intros)
       
  4098 
       
  4099 lemma continuous_at_infnorm: "continuous (at x) infnorm"
       
  4100   unfolding continuous_at Lim_at o_def unfolding dist_norm
       
  4101   apply auto apply (rule_tac x=e in exI) apply auto
       
  4102   using order_trans[OF real_abs_sub_infnorm infnorm_le_norm, of _ x] by (metis xt1(7))
       
  4103 
  4116 
  4104 text {* Hence some handy theorems on distance, diameter etc. of/from a set. *}
  4117 text {* Hence some handy theorems on distance, diameter etc. of/from a set. *}
  4105 
  4118 
  4106 lemma compact_attains_sup:
  4119 lemma compact_attains_sup:
  4107   fixes s :: "real set"
  4120   fixes s :: "real set"
  5217 
  5230 
  5218 text {* Relatively weak hypotheses if a set is compact. *}
  5231 text {* Relatively weak hypotheses if a set is compact. *}
  5219 
  5232 
  5220 lemma homeomorphism_compact:
  5233 lemma homeomorphism_compact:
  5221   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  5234   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  5222     (* class constraint due to continuous_on_inverse *)
  5235     (* class constraint due to continuous_on_inv *)
  5223   assumes "compact s" "continuous_on s f"  "f ` s = t"  "inj_on f s"
  5236   assumes "compact s" "continuous_on s f"  "f ` s = t"  "inj_on f s"
  5224   shows "\<exists>g. homeomorphism s t f g"
  5237   shows "\<exists>g. homeomorphism s t f g"
  5225 proof-
  5238 proof-
  5226   def g \<equiv> "\<lambda>x. SOME y. y\<in>s \<and> f y = x"
  5239   def g \<equiv> "\<lambda>x. SOME y. y\<in>s \<and> f y = x"
  5227   have g:"\<forall>x\<in>s. g (f x) = x" using assms(3) assms(4)[unfolded inj_on_def] unfolding g_def by auto
  5240   have g:"\<forall>x\<in>s. g (f x) = x" using assms(3) assms(4)[unfolded inj_on_def] unfolding g_def by auto
  5240       hence "x \<in> s" unfolding g_def using someI2[of "\<lambda>b. b\<in>s \<and> f b = y" x' "\<lambda>x. x\<in>s"] unfolding y(2)[THEN sym] and g_def by auto }
  5253       hence "x \<in> s" unfolding g_def using someI2[of "\<lambda>b. b\<in>s \<and> f b = y" x' "\<lambda>x. x\<in>s"] unfolding y(2)[THEN sym] and g_def by auto }
  5241     ultimately have "x\<in>s \<longleftrightarrow> x \<in> g ` t" ..  }
  5254     ultimately have "x\<in>s \<longleftrightarrow> x \<in> g ` t" ..  }
  5242   hence "g ` t = s" by auto
  5255   hence "g ` t = s" by auto
  5243   ultimately
  5256   ultimately
  5244   show ?thesis unfolding homeomorphism_def homeomorphic_def
  5257   show ?thesis unfolding homeomorphism_def homeomorphic_def
  5245     apply(rule_tac x=g in exI) using g and assms(3) and continuous_on_inverse[OF assms(2,1), of g, unfolded assms(3)] and assms(2) by auto
  5258     apply(rule_tac x=g in exI) using g and assms(3) and continuous_on_inv[OF assms(2,1), of g, unfolded assms(3)] and assms(2) by auto
  5246 qed
  5259 qed
  5247 
  5260 
  5248 lemma homeomorphic_compact:
  5261 lemma homeomorphic_compact:
  5249   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  5262   fixes f :: "'a::heine_borel \<Rightarrow> 'b::heine_borel"
  5250     (* class constraint due to continuous_on_inverse *)
  5263     (* class constraint due to continuous_on_inv *)
  5251   shows "compact s \<Longrightarrow> continuous_on s f \<Longrightarrow> (f ` s = t) \<Longrightarrow> inj_on f s
  5264   shows "compact s \<Longrightarrow> continuous_on s f \<Longrightarrow> (f ` s = t) \<Longrightarrow> inj_on f s
  5252           \<Longrightarrow> s homeomorphic t"
  5265           \<Longrightarrow> s homeomorphic t"
  5253   unfolding homeomorphic_def by (metis homeomorphism_compact)
  5266   unfolding homeomorphic_def by (metis homeomorphism_compact)
  5254 
  5267 
  5255 text{* Preservation of topological properties.                                   *}
  5268 text{* Preservation of topological properties.                                   *}