1269 using linear_continuous_on linear_conv_bounded_linear by blast |
1269 using linear_continuous_on linear_conv_bounded_linear by blast |
1270 have [simp]: "g ` f ` S = S" |
1270 have [simp]: "g ` f ` S = S" |
1271 using g by (simp add: image_comp) |
1271 using g by (simp add: image_comp) |
1272 have cgf: "closed (g ` f ` S)" |
1272 have cgf: "closed (g ` f ` S)" |
1273 by (simp add: \<open>g \<circ> f = id\<close> S image_comp) |
1273 by (simp add: \<open>g \<circ> f = id\<close> S image_comp) |
1274 have [simp]: "{x \<in> range f. g x \<in> S} = f ` S" |
1274 have [simp]: "(range f \<inter> g -` S) = f ` S" |
1275 using g by (simp add: o_def id_def image_def) metis |
1275 using g unfolding o_def id_def image_def by auto metis+ |
1276 show ?thesis |
1276 show ?thesis |
1277 apply (rule closedin_closed_trans [of "range f"]) |
1277 proof (rule closedin_closed_trans [of "range f"]) |
1278 apply (rule continuous_closedin_preimage [OF confg cgf, simplified]) |
1278 show "closedin (subtopology euclidean (range f)) (f ` S)" |
1279 apply (rule closed_injective_image_subspace) |
1279 using continuous_closedin_preimage [OF confg cgf] by simp |
1280 using f |
1280 show "closed (range f)" |
1281 apply (auto simp: linear_linear linear_injective_0) |
1281 apply (rule closed_injective_image_subspace) |
1282 done |
1282 using f apply (auto simp: linear_linear linear_injective_0) |
|
1283 done |
|
1284 qed |
1283 qed |
1285 qed |
1284 |
1286 |
1285 lemma closed_injective_linear_image_eq: |
1287 lemma closed_injective_linear_image_eq: |
1286 fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" |
1288 fixes f :: "'a::euclidean_space \<Rightarrow> 'b::euclidean_space" |
1287 assumes f: "linear f" "inj f" |
1289 assumes f: "linear f" "inj f" |
2372 |
2374 |
2373 corollary connected_UNIV[intro]: "connected (UNIV :: 'a::real_normed_vector set)" |
2375 corollary connected_UNIV[intro]: "connected (UNIV :: 'a::real_normed_vector set)" |
2374 by(simp add: convex_connected) |
2376 by(simp add: convex_connected) |
2375 |
2377 |
2376 proposition clopen: |
2378 proposition clopen: |
2377 fixes s :: "'a :: real_normed_vector set" |
2379 fixes S :: "'a :: real_normed_vector set" |
2378 shows "closed s \<and> open s \<longleftrightarrow> s = {} \<or> s = UNIV" |
2380 shows "closed S \<and> open S \<longleftrightarrow> S = {} \<or> S = UNIV" |
2379 apply (rule iffI) |
2381 by (force intro!: connected_UNIV [unfolded connected_clopen, rule_format]) |
2380 apply (rule connected_UNIV [unfolded connected_clopen, rule_format]) |
|
2381 apply (force simp add: closed_closedin, force) |
|
2382 done |
|
2383 |
2382 |
2384 corollary compact_open: |
2383 corollary compact_open: |
2385 fixes s :: "'a :: euclidean_space set" |
2384 fixes S :: "'a :: euclidean_space set" |
2386 shows "compact s \<and> open s \<longleftrightarrow> s = {}" |
2385 shows "compact S \<and> open S \<longleftrightarrow> S = {}" |
2387 by (auto simp: compact_eq_bounded_closed clopen) |
2386 by (auto simp: compact_eq_bounded_closed clopen) |
2388 |
2387 |
2389 corollary finite_imp_not_open: |
2388 corollary finite_imp_not_open: |
2390 fixes S :: "'a::{real_normed_vector, perfect_space} set" |
2389 fixes S :: "'a::{real_normed_vector, perfect_space} set" |
2391 shows "\<lbrakk>finite S; open S\<rbrakk> \<Longrightarrow> S={}" |
2390 shows "\<lbrakk>finite S; open S\<rbrakk> \<Longrightarrow> S={}" |