# HG changeset patch # User paulson # Date 1443794861 -3600 # Node ID 9dd394c866fc2079be4f1d6f634f2bac6513a846 # Parent 12378df46752af0a72a5620bf8fe97287945f45f New theorems about connected sets. And pairwise moved to Set.thy. diff -r 12378df46752 -r 9dd394c866fc src/HOL/Multivariate_Analysis/Linear_Algebra.thy --- a/src/HOL/Multivariate_Analysis/Linear_Algebra.thy Thu Oct 01 23:26:31 2015 +0200 +++ b/src/HOL/Multivariate_Analysis/Linear_Algebra.thy Fri Oct 02 15:07:41 2015 +0100 @@ -1908,9 +1908,6 @@ text \Picking an orthogonal replacement for a spanning set.\ -(* FIXME : Move to some general theory ?*) -definition "pairwise R S \ (\x \ S. \y\ S. x\y \ R x y)" - lemma vector_sub_project_orthogonal: fixes b x :: "'a::euclidean_space" shows "b \ (x - ((b \ x) / (b \ b)) *\<^sub>R b) = 0" diff -r 12378df46752 -r 9dd394c866fc src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Thu Oct 01 23:26:31 2015 +0200 +++ b/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Fri Oct 02 15:07:41 2015 +0100 @@ -710,7 +710,68 @@ from 1 2 show ?lhs unfolding openin_open open_dist by fast qed - + +lemma connected_open_in: + "connected s \ + ~(\e1 e2. openin (subtopology euclidean s) e1 \ + openin (subtopology euclidean s) e2 \ + s \ e1 \ e2 \ e1 \ e2 = {} \ e1 \ {} \ e2 \ {})" + apply (simp add: connected_def openin_open, safe) + apply (simp_all, blast+) + done + +lemma connected_open_in_eq: + "connected s \ + ~(\e1 e2. openin (subtopology euclidean s) e1 \ + openin (subtopology euclidean s) e2 \ + e1 \ e2 = s \ e1 \ e2 = {} \ + e1 \ {} \ e2 \ {})" + apply (simp add: connected_open_in, safe) + apply blast + by (metis Int_lower1 Un_subset_iff openin_open subset_antisym) + +lemma connected_closed_in: + "connected s \ + ~(\e1 e2. + closedin (subtopology euclidean s) e1 \ + closedin (subtopology euclidean s) e2 \ + s \ e1 \ e2 \ e1 \ e2 = {} \ + e1 \ {} \ e2 \ {})" +proof - + { fix A B x x' + assume s_sub: "s \ A \ B" + and disj: "A \ B \ s = {}" + and x: "x \ s" "x \ B" and x': "x' \ s" "x' \ A" + and cl: "closed A" "closed B" + assume "\e1. (\T. closed T \ e1 \ s \ T) \ (\e2. e1 \ e2 = {} \ s \ e1 \ e2 \ (\T. closed T \ e2 \ s \ T) \ e1 = {} \ e2 = {})" + then have "\C D. s \ C = {} \ s \ D = {} \ s \ (C \ (s \ D)) \ {} \ \ s \ s \ (C \ D) \ \ closed C \ \ closed D" + by (metis (no_types) Int_Un_distrib Int_assoc) + moreover have "s \ (A \ B) = {}" "s \ (A \ B) = s" "s \ B \ {}" + using disj s_sub x by blast+ + ultimately have "s \ A = {}" + using cl by (metis inf.left_commute inf_bot_right order_refl) + then have False + using x' by blast + } note * = this + show ?thesis + apply (simp add: connected_closed closedin_closed) + apply (safe; simp) + apply blast + apply (blast intro: *) + done +qed + +lemma connected_closed_in_eq: + "connected s \ + ~(\e1 e2. + closedin (subtopology euclidean s) e1 \ + closedin (subtopology euclidean s) e2 \ + e1 \ e2 = s \ e1 \ e2 = {} \ + e1 \ {} \ e2 \ {})" + apply (simp add: connected_closed_in, safe) + apply blast + by (metis Int_lower1 Un_subset_iff closedin_closed subset_antisym) + text \These "transitivity" results are handy too\ lemma openin_trans[trans]: @@ -1316,7 +1377,6 @@ unfolding th0 th1 by simp qed - subsection\Limit points\ definition (in topological_space) islimpt:: "'a \ 'a set \ bool" (infixr "islimpt" 60) @@ -1707,6 +1767,368 @@ lemma islimpt_in_closure: "(x islimpt S) = (x:closure(S-{x}))" unfolding closure_def using islimpt_punctured by blast +lemma connected_imp_connected_closure: "connected s \ connected (closure s)" + by (rule connectedI) (meson closure_subset open_Int open_inter_closure_eq_empty subset_trans connectedD) + +lemma limpt_of_limpts: + fixes x :: "'a::metric_space" + shows "x islimpt {y. y islimpt s} \ x islimpt s" + apply (clarsimp simp add: islimpt_approachable) + apply (drule_tac x="e/2" in spec) + apply (auto simp: simp del: less_divide_eq_numeral1) + apply (drule_tac x="dist x' x" in spec) + apply (auto simp: zero_less_dist_iff simp del: less_divide_eq_numeral1) + apply (erule rev_bexI) + by (metis dist_commute dist_triangle_half_r less_trans less_irrefl) + +lemma closed_limpts: "closed {x::'a::metric_space. x islimpt s}" + using closed_limpt limpt_of_limpts by blast + +lemma limpt_of_closure: + fixes x :: "'a::metric_space" + shows "x islimpt closure s \ x islimpt s" + by (auto simp: closure_def islimpt_Un dest: limpt_of_limpts) + +lemma closed_in_limpt: + "closedin (subtopology euclidean t) s \ s \ t \ (\x. x islimpt s \ x \ t \ x \ s)" + apply (simp add: closedin_closed, safe) + apply (simp add: closed_limpt islimpt_subset) + apply (rule_tac x="closure s" in exI) + apply simp + apply (force simp: closure_def) + done + +subsection\Connected components, considered as a connectedness relation or a set\ + +definition + "connected_component s x y \ \t. connected t \ t \ s \ x \ t \ y \ t" + +abbreviation + "connected_component_set s x \ Collect (connected_component s x)" + +lemma connected_component_in: "connected_component s x y \ x \ s \ y \ s" + by (auto simp: connected_component_def) + +lemma connected_component_refl: "x \ s \ connected_component s x x" + apply (auto simp: connected_component_def) + using connected_sing by blast + +lemma connected_component_refl_eq [simp]: "connected_component s x x \ x \ s" + by (auto simp: connected_component_refl) (auto simp: connected_component_def) + +lemma connected_component_sym: "connected_component s x y \ connected_component s y x" + by (auto simp: connected_component_def) + +lemma connected_component_trans: + "\connected_component s x y; connected_component s y z\ \ connected_component s x z" + unfolding connected_component_def + by (metis Int_iff Un_iff Un_subset_iff equals0D connected_Un) + +lemma connected_component_of_subset: "\connected_component s x y; s \ t\ \ connected_component t x y" + by (auto simp: connected_component_def) + +lemma connected_component_Union: "connected_component_set s x = Union {t. connected t \ x \ t \ t \ s}" + by (auto simp: connected_component_def) + +lemma connected_connected_component [iff]: "connected (connected_component_set s x)" + by (auto simp: connected_component_Union intro: connected_Union) + +lemma connected_iff_eq_connected_component_set: "connected s \ (\x \ s. connected_component_set s x = s)" +proof (cases "s={}") + case True then show ?thesis by simp +next + case False + then obtain x where "x \ s" by auto + show ?thesis + proof + assume "connected s" + then show "\x \ s. connected_component_set s x = s" + by (force simp: connected_component_def) + next + assume "\x \ s. connected_component_set s x = s" + then show "connected s" + by (metis `x \ s` connected_connected_component) + qed +qed + +lemma connected_component_subset: "connected_component_set s x \ s" + using connected_component_in by blast + +lemma connected_component_eq_self: "\connected s; x \ s\ \ connected_component_set s x = s" + by (simp add: connected_iff_eq_connected_component_set) + +lemma connected_iff_connected_component: + "connected s \ (\x \ s. \y \ s. connected_component s x y)" + using connected_component_in by (auto simp: connected_iff_eq_connected_component_set) + +lemma connected_component_maximal: + "\x \ t; connected t; t \ s\ \ t \ (connected_component_set s x)" + using connected_component_eq_self connected_component_of_subset by blast + +lemma connected_component_mono: + "s \ t \ (connected_component_set s x) \ (connected_component_set t x)" + by (simp add: Collect_mono connected_component_of_subset) + +lemma connected_component_eq_empty [simp]: "connected_component_set s x = {} \ (x \ s)" + using connected_component_refl by (fastforce simp: connected_component_in) + +lemma connected_component_set_empty [simp]: "connected_component_set {} x = {}" + using connected_component_eq_empty by blast + +lemma connected_component_eq: + "y \ connected_component_set s x + \ (connected_component_set s y = connected_component_set s x)" + by (metis (no_types, lifting) Collect_cong connected_component_sym connected_component_trans mem_Collect_eq) + +lemma closed_connected_component: + assumes s: "closed s" shows "closed (connected_component_set s x)" +proof (cases "x \ s") + case False then show ?thesis + by (metis connected_component_eq_empty closed_empty) +next + case True + show ?thesis + unfolding closure_eq [symmetric] + proof + show "closure (connected_component_set s x) \ connected_component_set s x" + apply (rule connected_component_maximal) + apply (simp add: closure_def True) + apply (simp add: connected_imp_connected_closure) + apply (simp add: s closure_minimal connected_component_subset) + done + next + show "connected_component_set s x \ closure (connected_component_set s x)" + by (simp add: closure_subset) + qed +qed + +lemma connected_component_disjoint: + "(connected_component_set s a) \ (connected_component_set s b) = {} \ + a \ connected_component_set s b" +apply (auto simp: connected_component_eq) +using connected_component_eq connected_component_sym by blast + +lemma connected_component_nonoverlap: + "(connected_component_set s a) \ (connected_component_set s b) = {} \ + (a \ s \ b \ s \ connected_component_set s a \ connected_component_set s b)" + apply (auto simp: connected_component_in) + using connected_component_refl_eq apply blast + apply (metis connected_component_eq mem_Collect_eq) + apply (metis connected_component_eq mem_Collect_eq) + done + +lemma connected_component_overlap: + "(connected_component_set s a \ connected_component_set s b \ {}) = + (a \ s \ b \ s \ connected_component_set s a = connected_component_set s b)" + by (auto simp: connected_component_nonoverlap) + +lemma connected_component_sym_eq: "connected_component s x y \ connected_component s y x" + using connected_component_sym by blast + +lemma connected_component_eq_eq: + "connected_component_set s x = connected_component_set s y \ + x \ s \ y \ s \ x \ s \ y \ s \ connected_component s x y" + apply (case_tac "y \ s") + apply (simp add:) + apply (metis connected_component_eq connected_component_eq_empty connected_component_refl_eq mem_Collect_eq) + apply (case_tac "x \ s") + apply (simp add:) + apply (metis connected_component_eq_empty) + using connected_component_eq_empty by blast + +lemma connected_iff_connected_component_eq: + "connected s \ + (\x \ s. \y \ s. connected_component_set s x = connected_component_set s y)" + by (simp add: connected_component_eq_eq connected_iff_connected_component) + +lemma connected_component_idemp: + "connected_component_set (connected_component_set s x) x = connected_component_set s x" +apply (rule subset_antisym) +apply (simp add: connected_component_subset) +by (metis connected_component_eq_empty connected_component_maximal connected_component_refl_eq connected_connected_component mem_Collect_eq set_eq_subset) + +lemma connected_component_unique: + "\x \ c; c \ s; connected c; + \c'. x \ c' \ c' \ s \ connected c' + \ c' \ c\ + \ connected_component_set s x = c" +apply (rule subset_antisym) +apply (meson connected_component_maximal connected_component_subset connected_connected_component contra_subsetD) +by (simp add: connected_component_maximal) + +lemma joinable_connected_component_eq: + "\connected t; t \ s; + connected_component_set s x \ t \ {}; + connected_component_set s y \ t \ {}\ + \ connected_component_set s x = connected_component_set s y" +apply (simp add: ex_in_conv [symmetric]) +apply (rule connected_component_eq) +by (metis (no_types, hide_lams) connected_component_eq_eq connected_component_in connected_component_maximal subsetD mem_Collect_eq) + + +lemma Union_connected_component: "Union (connected_component_set s ` s) = s" + apply (rule subset_antisym) + apply (simp add: SUP_least connected_component_subset) + using connected_component_refl_eq + by force + + +lemma complement_connected_component_unions: + "s - connected_component_set s x = + Union (connected_component_set s ` s - {connected_component_set s x})" + apply (subst Union_connected_component [symmetric], auto) + apply (metis connected_component_eq_eq connected_component_in) + by (metis connected_component_eq mem_Collect_eq) + +lemma connected_component_intermediate_subset: + "\connected_component_set u a \ t; t \ u\ + \ connected_component_set t a = connected_component_set u a" + apply (case_tac "a \ u") + apply (simp add: connected_component_maximal connected_component_mono subset_antisym) + using connected_component_eq_empty by blast + +subsection\The set of connected components of a set\ + +definition components:: "'a::topological_space set \ 'a set set" where + "components s \ connected_component_set s ` s" + +lemma components_iff: "s \ components u \ (\x. x \ u \ s = connected_component_set u x)" + by (auto simp: components_def) + +lemma Union_components: "u = Union (components u)" + apply (rule subset_antisym) + apply (metis Union_connected_component components_def set_eq_subset) + using Union_connected_component components_def by fastforce + +lemma pairwise_disjoint_components: "pairwise (\X Y. X \ Y = {}) (components u)" + apply (simp add: pairwise_def) + apply (auto simp: components_iff) + apply (metis connected_component_eq_eq connected_component_in)+ + done + +lemma in_components_nonempty: "c \ components s \ c \ {}" + by (metis components_iff connected_component_eq_empty) + +lemma in_components_subset: "c \ components s \ c \ s" + using Union_components by blast + +lemma in_components_connected: "c \ components s \ connected c" + by (metis components_iff connected_connected_component) + +lemma in_components_maximal: + "c \ components s \ + (c \ {} \ c \ s \ connected c \ (\d. d \ {} \ c \ d \ d \ s \ connected d \ d = c))" + apply (rule iffI) + apply (simp add: in_components_nonempty in_components_connected) + apply (metis (full_types) components_iff connected_component_eq_self connected_component_intermediate_subset connected_component_refl in_components_subset mem_Collect_eq rev_subsetD) + by (metis bot.extremum_uniqueI components_iff connected_component_eq_empty connected_component_maximal connected_component_subset connected_connected_component subset_emptyI) + +lemma joinable_components_eq: + "connected t \ t \ s \ c1 \ components s \ c2 \ components s \ c1 \ t \ {} \ c2 \ t \ {} \ c1 = c2" + by (metis (full_types) components_iff joinable_connected_component_eq) + +lemma closed_components: "\closed s; c \ components s\ \ closed c" + by (metis closed_connected_component components_iff) + +lemma components_nonoverlap: + "\c \ components s; c' \ components s\ \ (c \ c' = {}) \ (c \ c')" + apply (auto simp: in_components_nonempty components_iff) + using connected_component_refl apply blast + apply (metis connected_component_eq_eq connected_component_in) + by (metis connected_component_eq mem_Collect_eq) + +lemma components_eq: "\c \ components s; c' \ components s\ \ (c = c' \ c \ c' \ {})" + by (metis components_nonoverlap) + +lemma components_eq_empty [simp]: "components s = {} \ s = {}" + by (simp add: components_def) + +lemma components_empty [simp]: "components {} = {}" + by simp + +lemma connected_eq_connected_components_eq: "connected s \ (\c \ components s. \c' \ components s. c = c')" + by (metis (no_types, hide_lams) components_iff connected_component_eq_eq connected_iff_connected_component) + +lemma components_eq_sing_iff: "components s = {s} \ connected s \ s \ {}" + apply (rule iffI) + using in_components_connected apply fastforce + apply safe + using Union_components apply fastforce + apply (metis components_iff connected_component_eq_self) + using in_components_maximal by auto + +lemma components_eq_sing_exists: "(\a. components s = {a}) \ connected s \ s \ {}" + apply (rule iffI) + using connected_eq_connected_components_eq apply fastforce + by (metis components_eq_sing_iff) + +lemma connected_eq_components_subset_sing: "connected s \ components s \ {s}" + by (metis Union_components components_empty components_eq_sing_iff connected_empty insert_subset order_refl subset_singletonD) + +lemma connected_eq_components_subset_sing_exists: "connected s \ (\a. components s \ {a})" + by (metis components_eq_sing_exists connected_eq_components_subset_sing empty_iff subset_iff subset_singletonD) + +lemma in_components_self: "s \ components s \ connected s \ s \ {}" + by (metis components_empty components_eq_sing_iff empty_iff in_components_connected insertI1) + +lemma components_maximal: "\c \ components s; connected t; t \ s; c \ t \ {}\ \ t \ c" + apply (simp add: components_def ex_in_conv [symmetric], clarify) + by (meson connected_component_def connected_component_trans) + +lemma exists_component_superset: "\t \ s; s \ {}; connected t\ \ \c. c \ components s \ t \ c" + apply (case_tac "t = {}") + apply force + by (metis components_def ex_in_conv connected_component_maximal contra_subsetD image_eqI) + +lemma components_intermediate_subset: "\s \ components u; s \ t; t \ u\ \ s \ components t" + apply (auto simp: components_iff) + by (metis connected_component_eq_empty connected_component_intermediate_subset) + +lemma in_components_unions_complement: "c \ components s \ s - c = Union(components s - {c})" + by (metis complement_connected_component_unions components_def components_iff) + +lemma connected_intermediate_closure: + assumes cs: "connected s" and st: "s \ t" and ts: "t \ closure s" + shows "connected t" +proof (rule connectedI) + fix A B + assume A: "open A" and B: "open B" and Alap: "A \ t \ {}" and Blap: "B \ t \ {}" + and disj: "A \ B \ t = {}" and cover: "t \ A \ B" + have disjs: "A \ B \ s = {}" + using disj st by auto + have "A \ closure s \ {}" + using Alap Int_absorb1 ts by blast + then have Alaps: "A \ s \ {}" + by (simp add: A open_inter_closure_eq_empty) + have "B \ closure s \ {}" + using Blap Int_absorb1 ts by blast + then have Blaps: "B \ s \ {}" + by (simp add: B open_inter_closure_eq_empty) + then show False + using cs [unfolded connected_def] A B disjs Alaps Blaps cover st + by blast +qed + +lemma closed_in_connected_component: "closedin (subtopology euclidean s) (connected_component_set s x)" +proof (cases "connected_component_set s x = {}") + case True then show ?thesis + by (metis closedin_empty) +next + case False + then obtain y where y: "connected_component s x y" + by blast + have 1: "connected_component_set s x \ s \ closure (connected_component_set s x)" + by (auto simp: closure_def connected_component_in) + have 2: "connected_component s x y \ s \ closure (connected_component_set s x) \ connected_component_set s x" + apply (rule connected_component_maximal) + apply (simp add:) + using closure_subset connected_component_in apply fastforce + using "1" connected_intermediate_closure apply blast+ + done + show ?thesis using y + apply (simp add: Topology_Euclidean_Space.closedin_closed) + using 1 2 by auto +qed subsection \Frontier (aka boundary)\ @@ -2884,12 +3306,9 @@ by (auto simp: bounded_imp_bdd_above sup_max cSup_insert_If) lemma Sup_insert_finite: - fixes S :: "real set" + fixes S :: "'a::conditionally_complete_linorder set" shows "finite S \ Sup (insert x S) = (if S = {} then x else max x (Sup S))" - apply (rule Sup_insert) - apply (rule finite_imp_bounded) - apply simp - done +by (simp add: cSup_insert sup_max) lemma bounded_has_Inf: fixes S :: "real set" @@ -2908,12 +3327,29 @@ by (auto simp: bounded_imp_bdd_below inf_min cInf_insert_If) lemma Inf_insert_finite: - fixes S :: "real set" + fixes S :: "'a::conditionally_complete_linorder set" shows "finite S \ Inf (insert x S) = (if S = {} then x else min x (Inf S))" - apply (rule Inf_insert) - apply (rule finite_imp_bounded) - apply simp - done +by (simp add: cInf_eq_Min) + +lemma finite_imp_less_Inf: + fixes a :: "'a::conditionally_complete_linorder" + shows "\finite X; x \ X; \x. x\X \ a < x\ \ a < Inf X" + by (induction X rule: finite_induct) (simp_all add: cInf_eq_Min Inf_insert_finite) + +lemma finite_less_Inf_iff: + fixes a :: "'a :: conditionally_complete_linorder" + shows "\finite X; X \ {}\ \ a < Inf X \ (\x \ X. a < x)" + by (auto simp: cInf_eq_Min) + +lemma finite_imp_Sup_less: + fixes a :: "'a::conditionally_complete_linorder" + shows "\finite X; x \ X; \x. x\X \ a > x\ \ a > Sup X" + by (induction X rule: finite_induct) (simp_all add: cSup_eq_Max Sup_insert_finite) + +lemma finite_Sup_less_iff: + fixes a :: "'a :: conditionally_complete_linorder" + shows "\finite X; X \ {}\ \ a > Sup X \ (\x \ X. a > x)" + by (auto simp: cSup_eq_Max) subsection \Compactness\ @@ -3853,6 +4289,11 @@ by auto qed +lemma compact_components: + fixes s :: "'a::heine_borel set" + shows "\compact s; c \ components s\ \ compact c" +by (meson bounded_subset closed_components in_components_subset compact_eq_bounded_closed) + (* TODO: is this lemma necessary? *) lemma bounded_increasing_convergent: fixes s :: "nat \ real" @@ -4614,7 +5055,7 @@ unfolding continuous_within Lim_within ball_def subset_eq apply (auto simp add: dist_commute) apply (erule_tac x=e in allE) - apply auto + apply auto done qed @@ -6320,6 +6761,22 @@ trivial_limit net \ (\S. open S \ l \ S \ eventually (\x. f x \ S) net)" unfolding tendsto_def trivial_limit_eq by auto +text \Continuity relative to a union.\ + +lemma continuous_on_union_local: + "\closedin (subtopology euclidean (s \ t)) s; closedin (subtopology euclidean (s \ t)) t; + continuous_on s f; continuous_on t f\ + \ continuous_on (s \ t) f" + unfolding continuous_on closed_in_limpt + by (metis Lim_trivial_limit Lim_within_union Un_iff trivial_limit_within) + +lemma continuous_on_cases_local: + "\closedin (subtopology euclidean (s \ t)) s; closedin (subtopology euclidean (s \ t)) t; + continuous_on s f; continuous_on t g; + \x. \x \ s \ ~P x \ x \ t \ P x\ \ f x = g x\ + \ continuous_on (s \ t) (\x. if P x then f x else g x)" + by (rule continuous_on_union_local) (auto intro: continuous_on_eq) + text\Some more convenient intermediate-value theorem formulations.\ lemma connected_ivt_hyperplane: diff -r 12378df46752 -r 9dd394c866fc src/HOL/Set.thy --- a/src/HOL/Set.thy Thu Oct 01 23:26:31 2015 +0200 +++ b/src/HOL/Set.thy Fri Oct 02 15:07:41 2015 +0100 @@ -1931,6 +1931,8 @@ text \Misc\ +definition "pairwise R S \ (\x \ S. \y\ S. x\y \ R x y)" + hide_const (open) member not_member lemmas equalityI = subset_antisym diff -r 12378df46752 -r 9dd394c866fc src/HOL/Topological_Spaces.thy --- a/src/HOL/Topological_Spaces.thy Thu Oct 01 23:26:31 2015 +0200 +++ b/src/HOL/Topological_Spaces.thy Fri Oct 02 15:07:41 2015 +0100 @@ -1826,7 +1826,10 @@ \ connected U" by (auto simp: connected_def) -lemma connected_empty[simp]: "connected {}" +lemma connected_empty [simp]: "connected {}" + by (auto intro!: connectedI) + +lemma connected_sing [simp]: "connected {x}" by (auto intro!: connectedI) lemma connectedD: @@ -1835,6 +1838,78 @@ end +lemma connected_closed: + "connected s \ + ~ (\A B. closed A \ closed B \ s \ A \ B \ A \ B \ s = {} \ A \ s \ {} \ B \ s \ {})" +apply (simp add: connected_def del: ex_simps, safe) +apply (drule_tac x="-A" in spec) +apply (drule_tac x="-B" in spec) +apply (fastforce simp add: closed_def [symmetric]) +apply (drule_tac x="-A" in spec) +apply (drule_tac x="-B" in spec) +apply (fastforce simp add: open_closed [symmetric]) +done + + +lemma connected_Union: + assumes cs: "\s. s \ S \ connected s" and ne: "\S \ {}" + shows "connected(\S)" +proof (rule connectedI) + fix A B + assume A: "open A" and B: "open B" and Alap: "A \ \S \ {}" and Blap: "B \ \S \ {}" + and disj: "A \ B \ \S = {}" and cover: "\S \ A \ B" + have disjs:"\s. s \ S \ A \ B \ s = {}" + using disj by auto + obtain sa where sa: "sa \ S" "A \ sa \ {}" + using Alap by auto + obtain sb where sb: "sb \ S" "B \ sb \ {}" + using Blap by auto + obtain x where x: "\s. s \ S \ x \ s" + using ne by auto + then have "x \ \S" + using `sa \ S` by blast + then have "x \ A \ x \ B" + using cover by auto + then show False + using cs [unfolded connected_def] + by (metis A B IntI Sup_upper sa sb disjs x cover empty_iff subset_trans) +qed + +lemma connected_Un: "\connected s; connected t; s \ t \ {}\ \ connected (s \ t)" + using connected_Union [of "{s,t}"] by auto + +lemma connected_diff_open_from_closed: + assumes st: "s \ t" and tu: "t \ u" and s: "open s" + and t: "closed t" and u: "connected u" and ts: "connected (t - s)" + shows "connected(u - s)" +proof (rule connectedI) + fix A B + assume AB: "open A" "open B" "A \ (u - s) \ {}" "B \ (u - s) \ {}" + and disj: "A \ B \ (u - s) = {}" and cover: "u - s \ A \ B" + then consider "A \ (t - s) = {}" | "B \ (t - s) = {}" + using st ts tu connectedD [of "t-s" "A" "B"] + by auto + then show False + proof cases + case 1 + then have "(A - t) \ (B \ s) \ u = {}" + using disj st by auto + moreover have "u \ (A - t) \ (B \ s)" using 1 cover by auto + ultimately show False + using connectedD [of u "A - t" "B \ s"] AB s t 1 u + by auto + next + case 2 + then have "(A \ s) \ (B - t) \ u = {}" + using disj st + by auto + moreover have "u \ (A \ s) \ (B - t)" using 2 cover by auto + ultimately show False + using connectedD [of u "A \ s" "B - t"] AB s t 2 u + by auto + qed +qed + lemma connected_iff_const: fixes S :: "'a::topological_space set" shows "connected S \ (\P::'a \ bool. continuous_on S P \ (\c. \s\S. P s = c))" @@ -1938,7 +2013,8 @@ by auto qed -section \Connectedness\ + +section \Linear Continuum Topologies\ class linear_continuum_topology = linorder_topology + linear_continuum begin