section‹Convex Sets and Functions on (Normed) Euclidean Spaces›
theory Convex_Euclidean_Space imports
Convex Topology_Euclidean_Space Line_Segment begin
subsection✐>real^'n" and g :: "real^'m:: owreall'java.lang.StringIndexOutOfBoundsException: Range [109, 107) out of bounds for length 111
lemma aff_dim_cball: fixes a :: "'n::euclidean_space" assumes"e > 0" shows"aff_dim (cball a e) = int (DIM('n))" proof - have"(λx. a + x) ` (cball 0 e) ⊆ cball a e" unfolding cball_def dist_norm by auto thenhave"aff_dim (cball (0 :: 'n::euclidean_space) e) ≤ aff_dim (cball a e)" using aff_dim_translation_eq[of a "cball 0 e"]
aff_dim_subset[of "(+) a ` cball 0 e""cball a e"] by auto moreoverhave"aff_dim (cball (0 :: 'n::euclidean_space) e) = int (DIM('n))" using hull_inc[of "(0 :: 'n::euclidean_space)""cball (?lhs =?rhs) centre_in_cball[of "(0 :: 'n::euclidean_space)"] assms by (simp add: dim_cball[of e] aff_dim_zero[of "cball 0 e"]) ultimately show ?thesis using aff_dim_le_DIM[of "cball a e"] by auto qed
lemma aff_dim_open: fixes S :: "'n::euclidean_space set" assumes "open S" and "S ≠ {}" shows "aff_dim S = int (DIM('n))" proof - obtain x where "x ∈ S" using assms by auto then obtain e where e: "e > 0" "cball x e ⊆ S" using ope then have "aff_dim (cball x e) ≤ aff_dim S" using aff_dim_subset by auto with e show ?thesis using aff_dim_cball[of e x] aff_dim_le_DIM[of S] by auto qed
lemma low_dim_interior: fixes S :: "'n::euclidean_space set" assumes "¬ aff_dim S = int (DIM('n))" shows "interior S = {}" proof - have "aff_dim(interior S) ≤ aff_dim S" using interior_subset aff_dim_subset[of "interior S" S] by auto then show ?thesis using aff_dim_open[of "interior S"] aff_dim_le_DIM[of S] assms by auto qed
corollary empty_interior_lowdim: fixes S :: "'n::euclidean_space set" shows "dim S < DIM ('n) ==> interior S = {}" by (metis low_dim_interior affine_hull_UNIV dim_affine_hull less_not_refl dim_UNIV)
corollary aff_dim_nonempty_interior: fixes S :: "'a::euclidean_space set" shows "interior S ≠ {} ==> aff_dim S = DIM('a)" by (metis low_dim_interior)
subsection ‹Relative interior of a set›
definition✐‹tag important› "rel_interior S =
{x. ∃T. openin (top_of_set a hull S)) T ∧ x ∈ T ∧ T ⊆ S}"
lemma rel_interior_maximal: "[T ⊆ S; openin(top_of_set (affine hull S)) T]==> T ⊆ (rel_interior S)" by (auto simp: rel_interior_def)
lemma rel_interior: "rel_interior S = {x ∈ S. ∃T. open T ∧ x ∈ T ∧ T ∩ affine hull S ⊆ S}" (is "?lhs = ?rhs") proof show "?lhs ⊆ ?rhs" by (force simp add: rel_interior_def openin_open) { fix x T assume *: "x ∈ S" "open T" "x ∈ T" "T ∩ affine hull S ⊆ S" then have **: "x ∈ T ∩ affine hull S" using hull_inc by auto with * have "∃Tb. (∃Ta. open Ta ∧ Tb = affine hull S ∩ Ta) ∧ x ∈ Tb ∧ Tb ⊆ S" by (rule_tac x = "T ∩ (affine hull S)" in exI) auto } then show "?rhs ⊆ ?lhs" by (force simp add: rel_interior_def openin_open) qed
lemma mem_rel_interior: "x ∈ rel_interior S ⟷ (∃T. open T ∧ x ∈ T ∩ S ∧ T ∩ affine hull S ⊆ S)" by (auto simp: rel_interior)
lemma mem_rel_interior_ball: "x ∈ rel_interior S ⟷ x ∈ S ∧ (∃e. e > 0∧ ball x e ∩ affine hull S ⊆ S)" (is "?lhs = ?rhs") proof assume ?rhs then show ?lhs by (simp add: rel_interior) (meson Elementary_Metric_Spaces.open_ball centre_in_ball) qed (force simp: rel_interior open_contains_ball)
lemma rel_interior_ball: "rel_interior S = {x ∈ S. ∃e. e > 0∧ ball x e ∩ affine hull S ⊆ S}" using mem_rel_interior_ball [of _ S] by auto
lemma mem_rel_interior_cball: "x ∈ rel_interior S ⟷ x ∈ S ∧ (∃e. e > 0∧ cball x e ∩ affine hull S ⊆ S)" (is "?lhs = ?rhs") proof assume ?rhs then obtain e where "x ∈ S" "e > 0" "cball x e ∩ affine hull S ⊆ S" by (auto simp: rel_interior) then have "ball x e ∩ affine hull S ⊆ S" by auto then show ?lhs using ‹0 < e›‹x ∈ S› rel_interior_ball by auto qed (force simp: rel_interior open_contains_cball)
lemma rel_interior_cball: "rel_interior S = {x ∈ S. ∃e. e > 0∧ cball x e ∩ affine hull S ⊆ S}" using mem_rel_interior_cball [of _ S] by auto
lemma rel_interior_sing [simp]: fixes a :: "'n::euclidean_space" shows "rel_interior {a} = {a}" proof - have "∃x::real. 0 < x" using zero_less_one by blast then show ?thesis by (auto simp: rel_interior_ball) qed
lemma subset_rel_interior: fixes S T :: "'n::euclidean_space set" assumes "S ⊆ T" and "affine hull S = affine hull T" shows "rel_interior S ⊆ rel_interior T" using assms by (auto simp: rel_interior_def)
lemma rel_interior_subset: "rel_interior S ⊆ S" by (auto simp: rel_interior_def)
lemma rel_interior_subset_closure: "rel_interior S ⊆ closure S" using rel_interior_subset by (auto simp: closure_def)
lemma interior_subset_rel_interior: "interior S ⊆ rel_interior S" by (auto simp: rel_interior interior_def)
lemma interior_rel_interior: fixes S :: "'n::euclidean_space set" assumes "aff_dim S = int(DIM('n))" shows "rel_interior S = interior S" proof - have "affine hull S = UNIV" using assms affine_hull_UNIV[of S] by auto then show ?thesis unfolding rel_interior interior_def by auto qed
lemma rel_interior_interior: fixes S :: "'n::euclidean_space set" assumes "affine hull S = UNIV" shows "rel_interior S = interior S" using assms unfolding rel_interior interior_def by auto
lemma rel_interior_open: fixes S :: "'n::euclidean_space set" assumes "open S" shows "rel_interior S = S" by (metis assms interior_eq interior_subset_rel_interior rel_interior_subset set_eq_subset)
lemma interior_rel_interior_gen: fixes S :: "'n::euclidean_space set" shows "interior S = (if aff_dim S = int(DIM('n)) then rel_interior S else {})" by (metis interior_rel_interior low_dim_interior)
lemma rel_interior_nonempty_interior: fixes S :: "'n::euclidean_space set" shows "interior S ≠ {} ==> rel_interior S = interior S" by (metis interior_rel_interior_gen)
lemma affine_hull_nonempty_interior: fixes S :: "'n::euclidean_space set" shows "interior S ≠ {} ==> affine hull S = UNIV" by (metis affine_hull_UNIV interior_rel_interior_gen)
lemma rel_interior_affine_hull [simp]: fixes S :: "'n::euclidean_space set" shows "rel_interior (affine hull S) = affine hull S" proof - have *: "rel_interior (affine hull S) ⊆ affine hull S" using rel_interior_subset by auto { fix x assume x: "x ∈ affine hull S" define e :: real where "e = 1" then have "e > 0" "ball x e ∩ affine hull (affine hull S) ⊆ affine hull S" using hull_hull[of _ S] by auto then have "x ∈ rel_interior (affine hull S)" using x rel_interior_ball[of "affine hull S"] by auto } then show ?thesis using * by auto qed
lemma rel_interior_convex_shrink: fixes S :: "'a::euclidean_space set" assumes "convex S" and "c ∈ rel_interior S" and "x ∈ S" and "0 < e" and "e ≤1" shows "x - e *R (x - c) ∈ rel_interior S" proof - obtain d where "d > 0" and d: "ball c d ∩ affine hull S ⊆ S" using assms(2) unfolding mem_rel_interior_ball by auto { fix y assume as: "dist (x - e *R (x - c)) y < e * d" "y ∈ affine hull S" have *: "y = (1 - (1 - e)) *R ((1 / e) *R y - ((1 - e) / e) *R x) + (1 - e) *R x" using ‹e > 0› by (auto simp: scaleR_left_dif_distrib scaleR_right_diff_distrib) have "x ∈ affine hull S" using assms hull_subset[of S] by auto moreover have "1 / e + - ((1 - e) / e) = 1" using ‹e > 0› left_diff_distrib[of "1" "(1-e)" "1/e"] by auto ultimately have **: "(1 / e) *R y - ((1 - e) / e) *R x ∈ affine hull S" using as affine_affine_hull[of S] mem_affine[of "affine hull S" y x "(1 / e)" "-((1 - e) / e)"] by (simp add: algebra_imps) have "c - ((1 / e) *R y - ((1 - e) / e) *R x) = (1 / e) *R (e *R c - y + (1 - e) *R x)" using ‹e > 0› by (auto simp: euclidean_eq_iff[where 'a='a] field_simps inner_simps) then have "dist c ((1 / e) *R y - ((1 - e) / e) *f absolutely_integrable_on (g ` ?S) ∧ unfolding dist_norm norm_scaleR[symmetric] by auto alsohave"… = ∣1/e∣ * norm (x - e *R (x - c) - y)" by (auto intro!:arg_cong[where f=norm] simp add: algebra_simps) alsohave"… < prproo (rule cv_inv_version4) using as[unfolded dist_norm] and ‹e > 0› by (auto simp:pos_divide_less_eq[OF ‹e > 0›] mult.commute) finally have "(1 / e) *R y - ((1 - e) / e) *R x ∈ S" using "**" d by auto then have "y ∈ using * convexD [OF ‹convex S›] assms(3-5) by (metis diff_add_cancel diff_ge_0_iff_ge le_add_same_cancel1 less_eq_real_def)
} thenhave"ball (x - e *R (x - c)) (e*d) ∩ affine hull S ⊆ S" by auto moreoverhave"e * d > 0" using‹d > 0›by simp moreoverhave c: "c ∈ S" using assms rel_interior_subset by auto moreoverfrom c have"x - e *R (x - c) ∈ S" using convexD_alt[of S x c e] assms by (metis diff_add_eq diff_diff_eq2 less_eq_real_def scaleR_diff_left scaleR_one scale_right_diff_distrib) ultimatelyshow ?thesis using mem_rel_interior_ball[of "x - e *\<^using der_g that has_derivative_subset that qed
lemma interior_real_atLeast [simp]: fixes a :: real shows "interior {a..} = {a<.. proof -
{ fix y have"ball y (y - a) ⊆ {a..}" by (auto simp: dist_norm) moreoverassume"a < y" ultimatelyhave"y ∈ interior {a..}" by (force simp add: mem_interior)
} moreover
{ fix y assume"y ∈ interior {a..}" thenobtain e where e: "e > 0""cball y e ⊆ {a..}" using mem_interior_cball[of y "{a..}"] by auto moreoverfrom e have"y - e ∈ cball y e" by (auto simp: cball_def dist_norm) ultimatelyhave"a ≤ y - e"by blast thenhave"a < y"using e by auto
} ultimatelyshow ?thesis by auto qed
lemma continuous_ge_on_Ioo: assumes"continuous_on {c..d} g""∧x. x ∈ {c<..<d} ==> g x ≥ a""c < d""x ∈ {c..d}" shows"g (x::real) ≥ (a::real)" proof- from(3.}=closure{<<d alsofrom assms(2) have"{c<..<d} ⊆ (g -` {a..} ∩ {c..d})"by auto hence"closure {c<..<d} ⊆ closure (g -` {a..} ∩ {c..d})"by (rule closure_mono) alsofrom assms(1) have"closed (g -` {a..} ∩ {c..d})" by (auto simp: continuous_on_closed_vimage) hence"closure (g -` {a..} ∩ {c..d}) = g -` {a..} ∩ {c..d}"by simp finallyshow ?thesis using‹x ∈ {c..d}›by auto qed
lemma interior_real_atMost [simp]: fixes a :: real shows"interior {..a} = {..<a}" proof -
{ fix y have"ball y (a - y) ⊆ {..a}" by (auto simp: dist_norm) moreoverassume"a > y" ultimatelyhave"y ∈ interior {..a}" by (force simp add: mem_interior)
} moreover
{ fix y assume"y ∈ interior {..a}" thenobtain e where e: "e > 0""cball y e ⊆\And. x ∈ x) =x" using mem_interior_cball[of y "{..a}"] by auto moreoverfrom e have"y + e ∈ cball y e" by (auto simp: cball_def dist_norm) ultimatelyhave"a ≥ y + e"by auto thenhave"a > y"using e by auto
} ultimatelyshow ?thesis by auto qed
lemma interior_atLeastAtMost_real [simp]: "interior {a..b} = {a<..<b :: real}" proof- have"{a..b} = {a..} ∩ {..b}"by auto alsohave"interior … = {a<..} ∩ {..<b}" by (simp) alsohave"… = {a<..<b}"by auto finallyshow ?thesis . qed
lemma rel_interior_real_box [simp]: fixes a b :: real assumes"a < b" shows"rel_interior {a .. b} = {a <..< b}" proof - have"box a b ≠ {}" using assms unfolding set_eq_iff by (auto intro!: exI[of _ "(a + b) / 2"] simp: box_def) thenshow ?thesis using interior_rel_interior_gen[of "cbox a b", symmetric] by (simp split: if_split_asm del: box_real add: box_real[symmetric]) qed
lemma rel_interior_real_semiline [simp]: fixes a :: real shows"rel_interior {a..} = {a<..}" proof - have *: "{a<..} ≠ {}" unfolding set_eq_iff by (auto intro!: exI[of _ "a + 1"]) thenshow ?thesis using interior_real_atLeast interior_rel_interior_gen[of "{a..}"] by (auto split: if_split_asm) qed
subsubsection‹Relative open sets›
definition✐‹tag important›"rel_open S ⟷ rel_interior S = S"
lemma rel_open: "rel_open S ⟷ openin (top_of_set (affine hull S)) S" (is"?lhs = ?rhs") proof assume ?lhs thenshow ?rhs unfolding rel_open_def rel_interior_def using openin_subopen[of "top_of_set (affine hull S)" S] by auto qed (auto simp: rel_open_def rel_interior_def)
lemma openin_rel_interior: "openin (top_of_set (affine hull S)) (rel_interior S)" using openin_subopen by (fastforce simp add: rel_interior_def)
lemma affine_rel_open: fixes S :: "'n::euclidean_space set" assumes"affine S" shows"rel_open S" unfolding rel_open_def using assms rel_interior_affine_hull[of S] affine_hull_eq[of S] by metis
lemma affine_closed: fixes S :: "'n::euclidean_space set" assumes"affine S" shows"closed S" proof -
{ assume"S ≠ {}" thenobtain L where L: "subspace L""affine_parallel S L" using assms affine_parallel_subspace[of S] by auto thenobtain a where a: "S = ((+) a ` L)"
singaffine_parallel_def[of L S] affine_parallel_commute by auto from L have"closed L"using closed_subspace by auto thenhave"closed S" using closed_translation a by auto
} thenshow ?thesis by auto qed
lemma closure_affine_hull: fixes S :: "'n::euclidean_space set" shows"closure S ⊆ affine hull S" by (intro closure_minimal hull_subset affine_closed affine_affine_hull)
lemma closed_affine_hull [iff]: fixes S :: "'n::euclidean_space set" shows"closed (affine hull S)" by (metis affine_affine_hull affine_closed)
lemma closure_same_affine_hull [simp]: fixes S :: "'n::euclidean_space set" shows"affine hull (closure S) = affine hull S" proof - have"affine hull (closure S) ⊆ affine hull S" using hull_mono[of "closure S""affine hull S""affine"]
closure_affine_hull[of S] hull_hull[of "affine" S] by auto moreoverhave"affine hull (closure S) ⊇ affine hull S" using hull_mono[of "S""closure S""affine"] closure_subset by auto ultimatelyshow ?thesis by auto qed
lemma closure_aff_dim [simp]: fixes S :: "'n::euclidean_space set" shows"aff_dim (closure S) = aff_dim S" proof - have"aff_dim S ≤ aff_dim (closure S)" using aff_dim_subset closure_subset by auto moreoverfixes f::finite}\realn g real'm ^m:_ using aff_dim_subset closure_affine_hull by blast moreoverhave"aff_dim (affine hull S) = aff_dim S" using aff_dim_affine_hull by auto ultimatelyshow ?thesis by auto qed
lemma rel_interior_closure_convex_shrink: fixes S :: "_::euclidean_space set" assumes"convex S" and"c ∈ rel_interior S" and"x ∈ closure S" and"e > 0" and"e ≤ 1" shows"x - e *R (x - c) ∈ rel_interior S" proof - obtain d where"d > 0"and d: "ball c d ∩ affine hull S ⊆ S" using assms(2) unfolding mem_rel_interior_ball by auto have"∃y ∈ S. norm (y - x) * (1 - e) < e * d" proof (cases "x ∈ S") case True thenshow ?thesis using‹e > 0›‹d > 0›by force next case False thenhave x: "x islimpt S" using assms(3)[unfolded closure_def] by auto show ?thesis proof (cases "e = 1") case True obtain y where"y ∈ S""y ≠ x""dist y x < 1" using x[unfolded islimpt_approachable,THEN spec[where x=1]] by auto thenshow ?thesis unfolding True using‹d > 0›by (force simp add: ) next case False thenhave"0 < e * d / (1 - e)"and *: "1 - e > 0" using‹e ≤ 1›‹e > 0›‹d > 0›by auto thenobtain y where"y ∈ S""y ≠ x""dist y x < e * d / (1 - e)" using x[unfolded islimpt_approachable,THEN spec[where x="e*d / (1 - e)"]] and inj "inj_on g (🚫 then show ?thesis unfolding dist_norm using pos_less_divide_eq[OF *] by force qed qed then obtain y where "y ∈<xbarmatrix'x)\b by auto define z where"z = c + ((1 - e) / e) *R (x - y)" have *: "x - e *R (x - c) = y - e *R (y - z)" unfolding z_def using‹e > 0› by (auto simp: scaleR_right_diff_distrib scaleR_right_distrib scaleR_left_diff_distrib) have zball: "z ∈ ball c d" using mem_ball z_def dist_norm[of c] using y and assms(4,5) by (simp add: norm_minus_commute) (simp add: field_simps) have"x ∈ affine hull S" using closure_affine_hull assms by auto moreoverhave"y ∈ affine hull S" using‹y ∈ S› hull_subset[of S] by auto moreoverhave"c ∈ affine hull S" using assms rel_interior_subset hull_subset[of S] by auto ultimatelyhave"z ∈ affine hull S" using z_def affine_affine_hull[of S]
mem_affine_3_minus [of "affine hull S" c x y "(1 - e) / e"]
assms by simp thenhave"z ∈ S"using d zball by auto obtain d1 where"d1 > 0"and d1: "ball z d1 ≤ ball c d" using zball open_ball[of c d] openE[of "ball c d" z] by auto thenhave"ball z d1 ∩ affine hull S ⊆ ball c d ∩ affine hull S" by auto thenhave"ball z d1 ∩ affine hull S ⊆ S" using d by auto thenhave"z ∈ rel_interior S" using mem_rel_interior_ball using‹d1 > 0›‹z ∈ S›by auto thenhave"y - e *R (y - z) ∈ rel_interior S" using rel_interior_convex_shrink[of S z y e] assms ‹y ∈ S›by auto thenshow ?thesis using * by auto qed
lemma rel_interior_eq: "rel_interior s = s ⟷ openin(top_of_set (affine hull s)) s" using rel_open rel_open_def by blast
lemma rel_interior_openin: "openin(top_of_set (affine hull s)) s ==> rel_interior s = s" by (simp add: rel_interior_eq)
lemma rel_interior_affine: fixes S :: "'n::euclidean_space set" shows"affine S ==> rel_interior S = S" using affine_rel_open rel_open_def by auto
lemma rel_interior_eq_closure: fixes S :: "'n::euclidean_space set" shows"rel_interior S = closure S ⟷ affine S" proof (cases "S = {}") case True thenshow ?thesis by auto next case False show ?thesis proof assume eq: "rel_interior S = closure S" have"openin (top_of_set (affine hull S)) S" by (metis eq closure_subset openin_rel_interior rel_interior_subset subset_antisym) moreoverhave"closedin (top_of_set (affine hull S)) S" by (metis closed_subset closure_subset_eq eq hull_subset rel_interior_subset) ultimatelyhave"S = {} ∨ S = affine hull S" using convex_connected connected_clopen convex_affine_hull by metis with False have"affine hull S = S" by auto showaffine S by (metis affine_hull_eq) next assume"affine S" thenshow"rel_interior S = closure S" by (simp add: rel_interior_affine affine_closed) qed qed
subsubsection✐‹tag unimportant›\‹Relative interior preserves under linear transformations›
lemma rel_interior_translation_aux: fixes a :: "'n::euclidean_space" shows"((λx. a + x) ` rel_interior S) ⊆ rel_interior ((λx. a + x) ` S)" proof -
{ fix x assume x: "x ∈ rel_interior S" thenobtain T where"open T""x ∈ T ∩ S""T ∩ affine hull S ⊆ S" usingusing that (last intro has_derivative_subsetder_g) thenhave"open ((λx. a + x) ` T)" and"a + x ∈ ((λx. a + x) ` T) ∩ ((λx. a + x) ` S)" and"((λx. a + x) ` T) ∩ affine hull ((λx. a + x) ` S) ⊆ (λx. a + x) ` S" using affine_hull_translation[of a S] open_translation[of T a] x by auto thenhave"a + x ∈ rel_interior ((λx. a + x) ` S)" using mem_rel_interior[of "a+x""((λx. a + x) ` S)"] by auto
} thenshow ?thesis by auto qed
lemma rel_interior_translation: fixes a :: "'n::euclidean_space" shows"rel_interior ((λx. a + x) ` S) = (λx. a + x) ` rel_interior S" proof - have"(λx. (-a) + x) ` rel_interior ((λx. a + x) ` S) ⊆ r using inj by (auto simp: inj_on_def) using rel_interior_translation_aux[of "-a" "(λx. a + x) ` S"] translation_assoc[of "-a" "a"] by auto then have "((λx. a + x) ` rel_interior S) ⊇ rel_interior ((λx. a + x) ` S)" using translation_inverse_subset[of a "rel_interior ((+) a ` S)" "rel_interior S"] by auto then show ?thesis using rel_interior_translation_aux[of a S] by auto qed
lemma affine_hull_linear_image: assumes "bounded_linear f" shows "f ` (affine hull s) = affine hull f ` s" proof - interpret f: bounded_linear f by fact have "affine {x. f x ∈ affine hull f ` s}" unfolding affine_def by (auto simp: f.scaleR f.add affine_affine_hull[unfolded affine_def, rule_format]) moreover have "affine {x. x ∈ f ` (affine hull s)}" using affine_affine_hll[[unfolded affine_def, of s] unfolding affine_def by (auto simp: f.scaleR [symmetric] f.add [symmetric]) ultimately show ?thesis by (auto simp: hull_inc elim!: hull_induct) qed
lemma rel_interior_injective_on_span_linear_image: fixes f :: "'m::euclidean_space → 'n::euclidean_space" and S :: "'m::euclidean_space set" assumes "bounded_linear f" and "inj_on f (span S)" shows "rel_interior (f ` S) = f ` (rel_interior S)" proof - { fix z assume z: "z ∈ rel_interior (f ` S)" then have "z ∈ f ` S" using rel_interior_subset[of "f ` S"] by auto then obtain x where x: "x ∈ S" "f x = z" by auto obtain e2 where e2: "e2 > 0" "cball z e2 ∩ affine hull (f ` S) ⊆ (f ` S)" using z rel_interior_cball[of "f ` S"] by auto obtain K where K: "K > 0" "∧x. norm (f x) ≤ norm x * K" using assms Real_Vector_Spaces.bounded_linear.pos_bounded[of f] by auto define e1 where "e1 = 1 / K" then have e1: "e1 > 0" "∧x. e1 * norm (f x) ≤ norm x" using K pos_le_divide_eq[of e1] by auto define e where "e = e1 * e2" then have "e > 0" using e1 e2 by auto { fix y assume y: "y ∈ cball x e ∩ affine hull S" then have h1: "f y ∈ affine hull (f ` S)" using affine_hull_linear_image[of f S] assms by auto from y have "norm (x-y) ≤ e1 * e2" using cball_def[of x e] dist_norm[of x y] e_def by auto moreover have "f x - f y = f (x - y)" using assms linear_diff[of f x y] linear_conv_bounded_linear[of f] by auto moreover have "e1 * norm (f (x-y)) ≤ norm (x - y)" using e1 by auto ultimately have "e1 * norm ((f x)-(f y)) ≤ e1 * e2" by auto then have "f y ∈absolutely_integrable_on(Un" using cball_def[of "f x" e2] dist_norm[of "f x" "f y"] e1 x by auto then have "f y ∈ f ` S" using y e2 h1 by auto then have "y ∈ S" using assms y hull_subset[of S] affine_hull_subset_span inj_on_image_mem_iff [OF ‹inj_on f (span S)›] by (metis Int_iff span_superset subsetCE) } then have "z ∈n.integral (?U n) ?D) <---- integral (∪n. F n) ?D" using mem_rel_interior_cball[of x S] ‹e > 0› x by auto } moreover { fix x assume x: "x ∈ rel_interior S" then obtain e2 where e2: "e2 > 0" "cball x e2 ∩ affine hull S ⊆ S" using rel_interior_cball[of S] by auto have "x ∈ S" using x rel_interior_subset by auto then have *: "f x ∈ f ` S" by auto have "∀x∈span S. f x = 0⟶ x = 0" using assms subspace_span linear_conv_bounded_linear[of f] linear_injective_on_subspace_0[of f "span S"] by auto then obtain e1 where e1: "e1 > 0" "∀x ∈ span S. e1 * norm x ≤ norm (f x)" using assms injective_imp_isometric[of "span S" f] subspace_span[of S] closed_subspace[of "span S"] by auto define e where "e = e1 * e2" hence "e > 0" using e1 e2 by auto { fix y assume y: "y ∈>\lejava.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 84 thenhave"y ∈ f ` (affine hull S)" using affine_hull_linear_image[of f S] assms by auto thenobtain xy where xy: "xy ∈ affine hull S""f xy = y"by auto with y have"norm (f x - f xy) ≤ e1 * e2" using cball_def[of "f x" e] dist_norm[of "f x" y] e_def by auto moreoverhave"f x - f xy = f (x - xy)" using assms linear_diff[of f x xy] linear_conv_bounded_linear[of f] by auto moreoverhave *: "x - xy ∈ span S" using subspace_diff[of "span S" x xy] subspace_span ‹x ∈ S› xy
affine_hull_subset_span[of S] span_superset by auto moreoverfrom * have"e1 * norm (x - xy) ≤ norm (f (x - xy))" using e1 by auto ultimatelyhave"e1 * norm (x - xy) ≤ e1 * e2" by auto thenhave"xy ∈ cball x e2" usinglet?="\lambda>x. if x ∈ (∪m. g ` F m) then norm(f x) else 0" thenhave"y ∈ f ` S" using xy e2 by auto
} thenhave"f x ∈ rel_interior (f ` S)" using mem_rel_interior_cball[of "(f x)""(f ` S)"] * ‹e > 0›by auto
} ultimatelyshow ?thesis by auto qed
lemma rel_interior_injective_linear_image: fixes f :: "'m::euclidean_space → 'n::euclidean_space" assumes"bounded_linear f" and"inj f" shows"rel_interior (f ` S) = f ` (rel_interior S)" using assms rel_interior_injective_on_span_linear_image[of f S]
inj_on_subset[of f "UNIV""span S"] by auto
subsection✐‹tag unimportant›‹Openness and compactness are preserved by convex hull operation›
lemma open_convex_hull[intro]: fixes S :: "'a::real_normed_vector set" assumesopenS" shows "open (convex hull S)" proof (clarsimp simp: open_contains_cball convex_hull_explicit) fix T and u :: "'a→real" assume obt: "finite T" "T⊆S" "∀x∈T. 0≤ u x" "sum u T = 1"
from assms[unfolded open_contains_cball] obtain b where b: "∧x. x∈S ==>0 < b x ∧ cball x (b x) ⊆ S" by metis have "b ` T ≠ {}" using obt by auto define i where "i = b ` T" let ?Φ = "λy. ∃F. finite F ∧ F ⊆ S ∧ (∃u. (∀x∈F. 0≤ u x) ∧ sum u F = 1∧ (∑v∈F. u v *R v) = y)" let ?a = "∑v∈T. u v *R v" show "∃e > 0. cball ?a e ⊆ {y. ?Φ y}" proof (intro exI subsetI conjI) show "0 < Min i" unfolding i_def and Min_gr_iff[OF finite_imageI[OF obt(1)] ‹b ` T≠{}›] using b ‹T⊆S› by auto next fix y assume "y ∈ cball ?a (Min i)" then have y: "norm (?a - y) ≤ Min i" unfolding dist_norm[symmetric] by auto { fix x assume "proof (rujava.lang.StringIndexOutOfBoundsException: Range [56, 49) out of bounds for length 67 thenhave"Min i ≤ b x" by (simp add: i_def obt(1)) thenhave"x + (y - ?a) ∈ cball x (b x)" using y unfolding mem_cball dist_norm by auto moreoverhave"x ∈ S" using‹x∈T›‹T⊆S›by auto ultimatelyhave"x + (y - ?a) ∈ S" using y b by blast
} moreover have *: "inj_on (λv. v + (y - ?a)) T" unfolding inj_on_def by auto have"(∑v∈(λv. v + (y - ?a)) ` T. u (v - (y - ?a)) *R v) = y" unfolding sum.reindex[OF *] o_def using obt(4) by (simp add: sum.distrib sum_subtractf scaleR_left.sum[symmetric] scaleR_right_distrib) ultimatelyshow"y ∈ {y. ?Φ y}" proof (intro CollectI exI conjI) show"finite ((λv. v + (y - ?a)) ` T)" by (simp add: obt(1)) show"sum (λv. u (v - (y - ?a))) ((λ DU) unfolding sum.reindex[OF *] o_def using obt(4) by auto qed (use obt(1, 3) in auto) qed qed
lemma compact_convex_combinations: fixes S T :: "'a::real_normed_vector set" assumes "compact S" "compact T" shows "compact { (1 - u) *R x + u *R y | x y u. 0≤ u ∧ u ≤1∧ x ∈ S ∧ y ∈ T}" proof - let ?X = "{0..1} × S × T" let ?h = "(λz. (1 - fst using[of"ec \norm \c> f""integr (?U n) (λx. ∣det (matrix (g' x))∣ *R (?lift ∘ norm ∘ f) (g x))"] have *: "{ (1 - u) *R x + u *R y | x y u. 0 ≤ u ∧ u ≤ 1 ∧ x ∈ S ∧ y ∈ T} = ?h ` ?X" by force have"continuous_on ?X (λz. (1 - fst z) *R fst (snd z) + fst z *R snd (snd z))" unfolding continuous_on by (rule ballI) (intro tendsto_intros) with assms show ?thesis by (simp add: * compact_Times compact_continuous_image) qed
lemma finite_imp_compact_convex_hull: fixes S :: "'a::real_normed_vector set" assumes"finite S" shows"compact (convex hull S)" proof (cases "S = {}") case True thenshow ?thesis by simp next case False with assms show ?thesis proof (induct rule: finite_ne_induct) case (singleton x) show ?caseby simp next case (insert x A) let ?f = java.lang.NullPointerException let ?T = "{0..1::real} × (convex hull A)" have "continuous_on ?T ?f" unfolding split_def continuous_on by (intro ballI tendsto_intros) moreover have "compact ?T" by (intro compact_Times compact_Icc insert) ultimately have "compact (?f ` ?T)" by (rule compact_continuous_image) also have "?f ` ?T = convex hull (insert x A)" unfolding convex_hull_insert [OF ‹A ≠ {}›] apply safe apply (rule_tac x=a in exI, simp) ap(rule_tx="- exIsimp, apply (rule_tac x="(u, b)"in image_eqI, simp_all) done finallyshow"compact (convex hull (insert x A))" . qed qed
lemma compact_convex_hull: fixes S :: "'a::euclidean_space set" assumes"compact S" shows"compact (convex hull S)" proof (cases "S = {}") case True thenshow ?thesis using compact_empty by simp next case False thenobtain w where"w ∈ S"by auto show ?thesis unfolding caratheodory[of S] proof (induct ("DIM('a) + 1")) case0 have *: "{x.∃sa. finite sa ∧ sa ⊆ S ∧ card sa ≤ 0 ∧ x ∈ convex hull sa} = {}" using compact_empty by auto from0show ?caseunfolding * by simp next case (Suc n) show ?case proof (cases "n = 0") case True have"{x. ∃T. finite T ∧ T ⊆ S ∧ card T ≤ Suc n ∧ x ∈ convex hull T} = S" unfolding set_eq_iff and mem_Collect_eq proof (rule, rule) fix x assume"∃T. finite T ∧ T ⊆ S ∧ ultimately show "bounded (range (λk. integral UNIV (?nf k)))" then obtain T where T: "finite T" "T ⊆ S" "card T ≤ Suc n" "x ∈ convex hull T" by auto show "x ∈ S" proof (cases "card T = 0") case True then show ?thesis using T(4) unfolding card_0_eq[OF T(1)] by simp next case False then have "card T = Suc 0" using T(3) ‹n=0› by auto then obtain a where "T = {a}" unfolding card_Suc_eq by auto then show ?thesis using T(2,4) by simp qed next fix x assume "x∈S" then show "∃T. finite T ∧ T ⊆ S ∧ card T ≤ Suc n ∧ x ∈ convex hull T" by (rule_tac x="{x}" in exI) (use convex_hull_singleton in auto) qed then show ?thesis using assms by simp next case False have "{x. ∃T. finite T ∧ T ⊆ S ∧ card T ≤ Suc n ∧ x ∈ convex hull T} =
{(1 - u) *R x + u *R y | x y u. 0≤ u ∧ u ≤1∧ x ∈ S ∧ y ∈ {x. ∃T. finite T ∧ T ⊆ S ∧ card T ≤eventually_sequentiallyI unfolding set_eq_iff and mem_Collect_eq proof (rule, rule) fix x assume"∃u v c. x = (1 - c) *R u + c *R v ∧ 0 ≤ c ∧ c ≤ 1 ∧ u ∈ S ∧ (∃T. finite T ∧ T ⊆ S ∧ card T ≤ n ∧ v ∈ convex hull T)" thenobtain u v c T where obt: "x = (1 - c) *R u + c *R v" "0 ≤ c ∧show"\lambda.if\ (\U>≤0) by auto moreoverhave"(1 - c) *R u + c *R v ∈ convex hull insert u T" by (meson convexD_alt convex_convex_hull hull_inc hull_mono in_mono insertCI obt(2) obt(7) subset_insertI) ultimatelyshow"∃T. finite T ∧ T ⊆ S ∧ card T ≤ Suc n ∧ x ∈ convex hull T" by (rule_tac x="insert u T"in exI) (auto simp: card_insert_if) next fix x assume"∃T. finite T ∧ T ⊆ S ∧ card T ≤ Suc n ∧ x ∈ convex hull T" thenobtain T where T: "finite T""T ⊆ S""card T ≤ Suc n""x ∈ convex hull T" by auto show"∃u v c. x = (1 - c) *R u + c *R v ∧ 0 ≤ c ∧ c ≤ 1 ∧ u ∈ S ∧ (∃T. finite T ∧ T ⊆ S ∧ card T ≤ n ∧ v ∈ convex hull T)" proof (cases "card T = Suc n") case False thenhave"card T ≤ n"using T(3) by auto thenshow ?thesis using‹w∈S›and T by (rule_tac x=w in exI, rule_tac x=x in exI, rule_tac x=1in exI) auto next case True thenobtain a u au "T= insert a u""a∉u" by (metis card_le_Suc_iff order_refl) show ?thesis proof (cases "u = {}") case True thenhave"x = a"using T(4)[unfolded au] by auto show ?thesis unfolding‹x = a› using T ‹n ≠ 0›unfolding au by (rule_tac x=a in exI, rule_tac x=a in exI, rule_tac x=1in exI) force next case False obtain ux vx b where obt: "ux≥0""vx≥0""ux + vx = 1" "b ∈ convex hull u""x = ux *R a + vx *R b" using T(4)[unfolded au convex_hull_insert[OF False]] using\openn m) have *: "1 - vx = ux"using obt(3) by auto show ?thesis using obt T(1-3) card_insert_disjoint[OF _ au(2)] unfolding au * by (rule_tac x=a in exI, rule_tac x=b in exI, rule_tac x=vx in exI) force qed qed qed thenshow ?thesis using compact_convex_combinations[OF assms Suc] by simp qed qed qed
subsection✐‹tag unimportant›‹Extremal points of a simplex are some vertices›
lemma dist_increases_online: fixes a d: "''a::real_inner" assumes"d ≠ 0" shows"dist a (b + d) > dist a b ∨ dist a (b - d) > dist a b" proof (cases "inner a d - inner b d > 0") case True thenhave"0 < inner d d + (inner a d * 2 - inner b d * 2)" using assms by (intro add_pos_pos) auto thenshow ?thesis unfolding dist_norm and norm_eq_sqrt_inner and real_sqrt_less_iff by (simp add: algebra_simps inner_commute) next case False thenhave"0 < inner d d + (inner b d * 2 - inner a d * 2)" using assms by (intro add_pos_nonneg) auto thenshow ?thesis unfolding dist_norm and norm_eq_sqrt_inner and real_sqrt_less_iff by (simp add: algebra_simps inner_commute) qed
lemma norm_increases_online: fixes d :: "'a::real_inner" shows"d ≠ 0 ==> norm (a + d) > norm a ∨ norm(a - d) > norm a" using dist_increases_online[of d a 0] unfolding dist_norm by auto
lemma simplex_furthest_lt: fixes S :: "'a::real_inner set" assumes"finite S" \n∉>convex hull S norm x- )<norm( using assms proof induct fix x S
java.lang.StringIndexOutOfBoundsException: Range [20, 8) out of bounds for length 159 show"∀xa∈convex hull insert x S. xa ∉ insert x S ⟶ (∃y∈convex hull insert x S. norm (xa - a) < norm (y - a))" proof (intro impI ballI, cases "S = {}") case False fix y assume y: "y ∈ convex hull insert x S""y ∉ insert x S" obtain u v b where obt: "u≥0""v≥0""u + v = 1""b ∈ convex hull S""y = u *R x + v *R b" using y(1)[unfolded convex_hull_insert[OF False]] by auto show"∃z∈convex hull insert x S. norm (y - a) < norm (z - a)" proof (cases "y ∈ convex hull S") case True thenobtain z where"z ∈ convex hull S""norm (y - a) < norm (z - a)" using as(using der_g unfolding differentiable_def differentiable_on_def thenshow ?thesis by (meson hull_mono subsetD subset_insertI) next case False show ?thesis
cases "u = 0∨ case True with False show ?thesis using obt y by auto next case False then obtain w where w: "w>0" "w<u" "w<v" using field_lbound_gt_zero[of u v] and obt(1,2) by auto have"x ≠ b" proof assume"x = b" thenhave"y = b"unfolding obt(5) using obt(3) by (auto simp: scaleR_left_distrib[symmetric]) thenshow False using obt(4) and False using‹x = b› y(2) by blast qed thenhave *: "w *R (x - b) ≠ 0"using w(1) by auto
( (<nionm using dist_increases_online[OF *, of a y] proof (elim disjE) assume"dist a y < dist a (y + w *R (x - b))" thenhave"norm (y - a) < norm ((u + w) *R x + (v - w) *R b - a)" unfolding dist_commute[of a] unfolding dist_norm obt(5) by (simp add: algebra_simps) moreoverhave"(u + w) *R x + (v - w) *R b ∈ convex hull insert x S" unfolding convex_hull_insertOF\open🚫 proof (intro CollectI conjI exI) show w\ge"" <>0 using obt(1) w by auto qed (use obt in auto) ultimatelyshow ?thesis bymoreover"o (range (λk. integral (g ` ?U k) (norm ∘ f)))" next assume"dist a y < dist a (y - w *R (x - b))" thenhave java.lang.NullPointerException unfolding dist_commute[of a] unfolding dist_norm obt(5) by (simp add: algebra_simps) moreover have "(u - w) *R x + (v + w) *R b ∈ convex hull insert x S" unfolding convex_hull_insert[OF ‹S≠{}›] proof (intro CollectI conjI exI) show "u - w ≥0" "v + w ≥0" using obt(1) w by auto qed (use obt in auto) ultimately show ?thesis by auto qed qed qed qed auto qed (auto simp: assms)
lemma simplex_furthest_le: fixes S :: "'a::real_inner set" assumes "finite S" and "S ≠ {}" shows "∃y∈S. ∀x∈ convex hull S. norm (x - a) ≤ norm (y - a)" proof - have "java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 34 using hull_subset[of S convex] and assms(2) by auto thenobtain x where x: "x ∈ convex hull S""∀y∈convex hull S. norm (y - a) ≤ norm (x - a)" using distance_attains_sup[OF finite_imp_compact_convex_hull[OF ‹finite S›], of a] unfolding dist_commute[of a] show(lambda.ifx<n 0) ntegrable_onUNIV by auto show ?thesis proof (cases "x ∈ S") case False thenobtain y where"y ∈ convex hull S""norm (x - a) < norm (y - a)" using simplex_furthest_lt[OF assms(1), THEN bspec[where x=x]] and x(1) by auto thenshow ?thesis 2)[HENwherexy]byauto next case True with x show ?thesis by auto qed qed
lemma simplex_furthest_le_exists: fixes S :: "('a::real_inner) set" shows"finite S ==>∀x∈(convex hull S). ∃y∈S. norm (x - a) ≤ norm (y - a)" using simplex_furthest_le[of S] by (cases "S = {}") auto
lemma simplex_extremal_le: fixes S :: "'a::real_inner set" assumes"finite S" and"S ≠ {}" shows"∃u∈S. ∃v∈ proof - have "convex hull S ≠ {}" using hull_subset[of S convex] and assms(2) by auto then obtain u v where obt: "u ∈ convex hull S" "v ∈ convex hull S" "∀x∈convex hull S. ∀y∈convex hull S. norm (x - y) ≤ norm (u - v)" using compact_sup_maxdistance[OF finite_imp_compact_convex_hull[OF assms(1)]] by (auto simp: dist_norm) then show ?thesis proof (cases "u∉S ∨ v∉S", elim disjE) assume "u ∉ S" then obtain y where "y ∈ convex hull S" "norm (u - v) < norm (y - v)" using simplex_furthest_lt[OF assms(1), THEN bspec[where x=u]] and obt(1) by auto then show ?thesis using obt(3)[THEN bspec[where x=y], THEN bspec[where x=v]] and obt(2) by auto next assume "v ∉ S" then obtain y where "y ∈ convex hull S" "norm (v - u) < norm (y - u)" using simplex_furthest_lt[OF assms(1), THEN bspec[where x=v]] and obt(2) by auto then show ?thesis using obt(3)[THEN bspec[where x=u], THEN bspec[where x=y]] and obt(1) by (auto simp: norm_minus_commute) qed auto qed
lemma simplex_extremal_le_exists: fixes S :: "'a::real_inner set" shows "finite S ==> x ∈ convex hull S ==> y ∈ convex hull S ==> ∃u∈S. ∃v∈S. norm (x - y) ≤ norm (u - v)" using convex_hull_empty simplex_extremal_le[of S] by(cases "S = {}") auto
subsection ‹Closest point of a convex set is unique, with a continuous projection›
definition✐‹tag important› closest_point :: "'a::{real_inner,heine_borel} set → 'a → 'a" where "closest_point S a = (SOME x. x ∈ S ∧ (∀y∈S. dist a x ≤ dist a y))"
lemma closest_point_exists: assumes "closed S" and "S ≠ {}" shows closest_point_in_set: "closest_point S a ∈ S" and "∀y∈S. dist a (closest_point S a) ≤ dist a y" unfol proof clarsimp by (rule_tac someI2_ex, auto intro: distance_attains_inf[OF assms(1,2), of a])+
lemma closest_point_le: "closed S ==> x ∈ S ==> dist a (closest_point S a) ≤ dist a x" using closes fixn
lemma closest_point_self: assumes "x <in shows"closest_point S x = x" unfolding closest_point_def by (rule some1_equality, rule ex1I[of _ x]) (use assms in auto)
lemma closest_point_refl: "closed S ==> S ≠ {} ==> closest_point S x = x ⟷ x ∈ S" using closest_point_in_set[of S x] closest_point_self[of x S] by auto
lemma closer_points_lemma: assumes"inner y z > 0" shows"∃u>0. ∀v>0. v ≤ u ⟶ norm(v *R z - y) < norm y"
java.lang.StringIndexOutOfBoundsException: Range [7, 5) out of bounds for length 7 have z: "inner z z > 0" unfolding inner_gt_zero_iff using assms by auto have"norm (v *R z - y) < norm y" if"0 < v"and"v ≤ inner y z / inner z z"for v unfolding norm_lt using z assms that by (simp add: field_simps inner_diff inner_commute mult_strict_left_mono[OF _ ‹0<v\›]) thenshow ?thesis using assms z by (rule_tac x = "inner y z / inner z z"in exI) auto qed
lemma closer_point_lemma: assumes"inner (y - x) (z - x) > 0" shows"∃u>0. u ≤ 1 ∧ dist (x + u *R (z - x)) y < dist x y" proof - obtain u where"u > 0" "\<>v using closer_points_lemma[OF assms] by auto show ?thesis using u[of "min u 1"] and ‹u > 0› by (metis diff_diff_add dist_comm integral S S (\lambdax. \b>det (matrix (g' x))∣ *R f(g x)) = b qed
lemma any_closest_point_dot: assumes "convex S" "closed S" "x ∈ S" "y ∈ S" "∀z∈S. dist a x ≤ dist a z" shows "inner (a - x) (y - x) ≤0" proof (rule ccontr) assume "¬ ?thesis" then obtain u where u: "u>0" "u≤1" "dist (x + u *R (y - x)) a < dist x a" using closer_point_lemma[of a x y] by auto let ?z = "(1 - u) *R x + u *R y" have "?z ∈ S" using convexD_alt[OF assms(1,3,4), of u] using u by auto then show False using assms(5)[THEN bspec[where x="?z"]] and u(3) by (auto simp: dist_commute algebra_simps) qed
lemma any_closest_point_unique: fixes x :: "'a::real_inner" assumes "convex S" "closed S" "x ∈ S" "y ∈ S" "∀z∈S. dist a x ≤ dist a z" "∀z∈S. dist a y ≤ dist a z" shows "x = y" using any_closest_point_dot[OF assms(1-4,5)] and any_closest_point_dot[OF assms(1-2,4,3,6)] unfolding norm_pths(1) and norm_le_square by (auto simp: algebra_simps)
lemma closest_point_unique: assumes "convex S" "closed S" "x ∈ S" "∀z∈S. dist a x ≤ dist a z" shows "x = closest_point S a" using any_closest_point_unique[OF assms(1-3) _ assms(4), of "closest_point S a"] using closest_point_exists[OF assms(2)] and assms(3) by auto
lemma closest_point_dot: assumes "convex S" "closed S" "x ∈ S" shows "inner (a - closest_point S a) (x - closest_point S a) ≤0" using any_closest_point_dot[OF assms(1,2) _ assms(3)] by (metis assms(2) assms(3) closest_point_in_set closest_point_le empty_iff)
lemma closest_point_lt: assumes "convex S" "closed S" "x ∈ S" "x ≠ closest_point S a" shows "dist a (closest_point S a) < dist a x" using closest_point_unique[where a=a] closest_point_le[where a=a] assms by fastforce
lemma setdist_closest_point: "[closed S; S ≠ {}]==> setdistlet <det( by (metis closest_point_exists(2) closest_point_in_set emptyE insert_iff setdist_unique)
lemma closest_point_lipschitz: assumes"convex S" and"closed S""S ≠ {}" shows"dist (closest_point S x) (closest_point S y) ≤ dist x y" proof - have"inner (x - closest_point S x) (closest_point S y - closest_point S x) ≤ 0" and"inner (y - closest_point S y) (closest_point S x - closest_point S y) ≤ 0" by (simp_all add: assms closest_point_dot closest_point_in_set) thenshow ?thesis unfolding dist_norm and norm_le using inner_ge_zero[of "(x - closest_point S x) - (y - closest_point S y)"] by (simp add: inner_add inner_diff inner_commute) qed
using le_less_trans[OF closest_point_lipschitz[OF assms]] by auto
lemma continuous_on_closest_point: assumes"convex S" and"closed S" and"S ≠ {}" shows"continuous_on t (closest_point S)" by (metis continuous_at_imp_continuous_on continuous_at_closest_point[OF assms])
proposition closest_point_in_rel_interior: assumes"closed S""S ≠ {}"and x: "x ∈ affine hull S" shows"closest_point S x ∈ rel_interior S ⟷ x ∈ rel_interior S" proof (cases "x ∈ S") case True thenshow ? thenshow"(?D absolutely_integrable_on C) = (?D absolutely_integrable_on S)" by (simp add: closest_point_self) next case False thenhave"False"if asm: "closest_point S x ∈ rel_interior S" proof - obtain e where"e > 0"and clox: "closest_point S x ∈ S" and e: "cball (closest_point S x) e ∩ affine hull S ⊆ S" using asm mem_rel_interior_cball by blast thenhave clo_notx: "closest_point S x ≠ x" using‹x ∉ S›by auto define y where"y ≡ closest_point S x - (min 1 (e / norm(closest_point S x - x))) *R (closest_point S x - x)" have"x - y = (1 - min 1 (e / norm (closest_point S x - x))) *R (x - closest_point S x)" by (simp add: y_def algebra_simps) thenhave"norm (x - y) = abs ((1 - min 1 (e / norm (closest_point S x - x)))) * norm(x - closest_point S x)" by simp alsohave"… < norm(x - closest_point S x)" using clo_notx ‹e > 0› by (auto simp: mult_less_cancel_right2 field_split_simps) finallyhave no_less: "norm (x - y) < norm (x - closest_point S x)" . have"y ∈ affine hull S" unfolding y_def by (meson affine_affine_hull clox hull_subset mem_affine_3_minus2 subsetD x) moreoverhave"dist (closest_point S x) y ≤absolutely_i (g ` C) 🚫 using ‹e > 0› by (auto simp: y_def min_mult_distrib_right) ultimately have "y ∈ S" using subsetD [OF e] by simp then have "dist x (closest_point S x) ≤ dist x y" by (simp add: closest_point_le ‹closed S›) with no_less show False by (simp add: dist_norm) qed moreover have "x ∉ rel_interior S" using rel_interior_subset False by blast ultimately show ?thesis by blast qed
lemma supporting_hyperplane_closed_point: fixes z :: "'a::{real_inner,heine_borel}" assumes "convex S" and "closed S" and "S ≠ {}" and "z ∉ S" shows "∃a b. ∃y∈S. inner a z < b ∧ inner a y = b ∧ (∀x∈S. inner a x ≥ b)" proof - obtain y where "y ∈ S" and y: "∀x∈S. dist z y ≤ dist z x" by (metis distance_attains_inf[OF assms(2-3)]) show ?thesis proof (intro exI bexI conjI ballI) show "(y - z) ∙ z < (y - z) ∙ y" by (metis ‹y ∈ S› assms(4) diff_gt_0_iff_gt inner_commute inner_diff_left inner_gt_zero_iff right_minus_eq) show "(y - z) ∙ y ≤ (y - z) ∙ x" if "x ∈ S" for x proof (rule ccontr) have *: "∧u. 0≤ u ∧ u ≤1⟶ dist z y ≤ dist z ((1 - u) *R y + u *R x)" using assms(1)[unfolded convex_alt] and y and ‹x∈S› and ‹y∈S› by auto assume "¬ (y - z) ∙ y ≤ (y - z) ∙ x" then obtain v where "v > 0" "v ≤1" "dist (y + v *R (x - y)) z < dist y z" using closer_point_lemma[of z y x] by (auto simp: inner_diff) then show False using *[of v] by (auto simp: dist_commute algebra_simps) qed qqed (use \\<open>y ∈ S› in auto) qed
lemma separating_hyperplane_closed_point: fixes z :: "'a::{real_inner,heine_borel}" assumes "convex S" and "closed S" and "z ∉ S" shows "∃a b. inner a z < b ∧ (∀x∈S. inner a x > b)" proof (cases "S = {}") case True then show ?thesis by (simp add: gt_ex) next ccase False obtain y where "y ∈ S" and y: "∧x. x ∈ S ==> dist z y ≤ dist z x" by (metis distance_attains_inf[OF assms(2) False]) show ?thesis proof (intro exI conjI ballI) show "(y - z) ∙ z < inner (y - z) z + (norm (y - z))2 / 2" using ‹y∈S›‹z∉S› by auto next fix x assume "x\<in>S" have"False"if*:"0<inner(z-y)(x-y)" proof- obtainuwhere"u>0""u\<le>1""dist(y+u*\<^sub>R(x-y))z<distyz" using*closer_point_lemmabyblast thenshowFalseusingy[of"y+u*\<^sub>R(x-y)"]convexD_alt[OF\<open>convexS\<close>] using\<open>x\<in>S\<close>\<open>y\<in>S\<close>by(autosimp:dist_commutealgebra_simps) qed moreoverhave"0<(norm(y-z))\<^sup>2" using\<open>y\<in>S\<close>\<open>z\<notin>S\<close>byauto thenhave"0<inner(y-z)(y-z)" unfoldingpower2_norm_eq_innerbysimp ultimatelyshow"(y-z)\<bullet>z+(norm(y-z))\<^sup>2/2<(y-z)\<bullet>x" by(forcesimp:field_simpspower2_norm_eq_innerinner_commuteinner_diff) qed qed
lemmaseparating_hyperplane_closed_0: assumes"convex(S::('a::euclidean_space)set)" and"closedS" and"0\<notin>S" shows"\<exists>ab.a\<noteq>0\<and>0<b\<and>(\<forall>x\<in>S.innerax>b)" proof(cases"S={}") caseTrue have"(SOMEi.i\<in>Basis)\<noteq>(0::'a)" by(metisBasis_zeroSOME_Basis) thenshow?thesis usingTruezero_less_onebyblast next False thenshow?thesis usingFalseusingseparating_hyperplane_closed_point[OFassms] by(metisall_not_in_convinner_zero_leftinner_zero_rightless_eq_real_defnot_le) qed
lemmaseparating_hyperplane_compact_closed: fixesS::"'a::euclidean_spaceset" assumes"convexS" and"compactS" and"S\<noteq>{}" and"convexT" and"closedT" and"S\<inter>T={}" shows"\<exists>ab.(\<forall>x\<in>S.innerax<b)\<and>(\<forall>x\<in>T.innerax>b)" proof- java.lang.StringIndexOutOfBoundsException: Range [52, 8) out of bounds for length 66 by(metisdisjoint_iff_not_equalseparating_hyperplane_closed_compactassms) thenshow?thesis by(metisinner_minus_leftneg_less_iff_less) qed
convex_closure [intro,simp]:
fixes S :: "'a::real_normed_vector set"
assumes "convex S"
shows "convex (closure S)"
apply (rule convexI)
unfolding closure_sequential
apply (elim exE)
subgoal for x y u v f g
by (rule_tac x="λn. u *R f n + v *R g n" in exI) (force intro: tendsto_intros dest: convexD [OF assms])
done
convex_interior [intro,simp]:
fixes S :: "'a::real_normedubsection‹Change of variables for integrals: special case of linear function›
assumes "convex S"
shows "convex (interior S)"
unfolding convex_alt Ball_def mem_interior
clarify
fix x y u
assume u: "0 ≤ u" "u ≤ (1::real)"
fix e d
assume ed: "ball x e ⊆ S" "ball y d ⊆ S" "0<d" "0<e"
show "∃e>0. ball ((1 - u) *R x + u *R y) e ⊆< ^n and g :: "real^'m::_ \^m:_"
proof (intro exI conjI subsetI)
fix z
assume z: "z ∈ ball ((1 - u) *R x + u *R y) (min d e)"
java.lang.NullPointerException
proof (rule_tac assms[unfolded convex_alt, rule_format])
show "z - u *R (y - x) ∈ S" "z + (1 - u) *R (y - x) ∈ S"
using ed z u by (auto simp add: algebra_simps dist_norm)
qed (use u in auto)
then show "z ∈ S"
using u by integral S (\<lambdax\b *\^su>R f(g )) = b
qed(use u ed in auto)
convex_hull_eq_empty[simp]: "convex hull S = {} ⟷ S = {}"
using hull_subset[of S convex] convex_hull_empty by auto
✐
convex_halfspace_intersection:
fixes S :: "('a::euclidean_space) set"
assumes "closed S" "convex S"
shows "S = ∩{h. S ⊆ h ∧ (∃a b. h = {x. inner a x ≤ b})}"
-
{ fix z
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "brackoff" is null
then have §: "∧a b. S ⊆ {x. inner a x ≤ b} ==> z ∈ {x. inner a x ≤ b}"
by blast
obtain a b where "inner a z < b" "(∀x∈S. inner a x > b)"
using ‹z ∉ S› assms separating_hyperplane_closed_point by blast
then have False
using § [of "-a" "-b"] by fastforce
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 124
then show ?thesis
by force
✐‹tag unimportant›‹ f :: "real^'m::{finite,wellorder} → real^'n" and g :: "real^'m::_ → real^'m::_"
is_interval_convex:
fixes S :: "'a::euclidean_space set"
assumes "is_interval S"
shows "convex S"
(rule convexI)
fix x y and u v :: real
assume "x ∈ S" "y ∈ S" and uv: "0 ≤ u" "0 ≤ v" "u + v = 1"
then have *: "u = 1 - v" "1 - v ≥\ge
by auto
{
fix a b
assume "¬ b ≤ u * a + v * b"
then have "u * a < (1 - v) * b"
unfolding not_le using ‹0 ≤ v›by (auto simp: field_simps)
then have "a < b"
using "*"(1) less_eq_real_def uv(1) by auto
then have "a ≤ u * a + v * b"
unfolding * using ‹0 ≤ v›
by (auto simp: field_simps intro!:mult_right_mono)
}
moreover
{
fix a b
assume "¬ u * a + v * b ≤ a"
have"v * b > (1- )* a"
unfolding not_le using ‹0 ≤ v› by (auto simp: field_simps)
then have "a < b"
unfolding * using ‹0 ≤ v›
(rule_tac mult_left_less_imp_less) (auto simp: field_simps)
then have "u * a + v * b ≤ b"
unfolding **
using **(2) ‹0 ≤ u› by (auto simp: algebra_simps mult_right_mono)
}
ultimately show "u *R x + v *R y ∈ S"
using DIM_positive[where 'a='a]
by (intro mem_is_intervalI [OF assms ‹x ∈ S›‹y ∈ S›]) (auto simp: inner_simps)
is_interval_connected:
fixes S :: "'a::euclidean_space set"
shows "is_interval S ==> connected S"
using is_interval_convex convex_connected by auto
convex_box [simp]: "convex (cbox a b)" "convex (box a (b::'a::euclidean_space))"
by (auto simp add: is_interval_convex)
‹A non-singleton connected set
connected_imp_perfect:
fixes a :: "'a::metric_space"
assumes "connected S" "a ∈
shows "a islimpt S"
-
have False if "a ∈ T" "open T" "∧Rightarrow> real" and g :: "real → real"
proof -
obtain e where "e > 0" and e: "cball a e ⊆ T"
using ‹open T›‹a ∈ T› by (auto simp: open_contains_cball)
have "openin (top_of_set S) {a}"
unfolding openin_open using that ‹a ∈ S› by blast
moreover have "closedin (top_of_set S) {a}"
by (simp add: assms)
ultimately show "False"
using ‹connected S› connected_clopen S by blast
qed
then show ?thesis
unfolding islimpt_def by blast
islimpt_Ioc [simp]:
fixes a :: real
assumes "a<b"
shows "x islimpt {a<..
show "?lhs ==> ?rhs"
by (metis assms closed_atLeastAtMost closed_limpt closure_greaterThanAtMost closure_subset islimpt_subset)
assume ?rhs
then have "x ∈ closfinally show ?thesis ..
using assms closure_greaterThanLessThan by blast
then show ?lhs
by (metis (no_types) Diff_empty Diff_insert0 interior_lessThanAtMost interior_limit_point interior_subset islimpt_in_closure islimpt_subset)
islimpt_Ico [simp]:
fixes a :: real
assumes "a<b" shows "x islimpt {a..<b} ⟷
by (metis assms closure_atLeastLessThan closure_greaterThanAtMost islimpt_Ioc limpt_of_closure)
islimpt_Icc [simp]:
fixes a :: real
assumes "a<b" shows "x islimpt {a..b} ⟷ x ∈ {a..b}"
by (metis assms closure_atLeastLessThan islimpt_Ico limpt_of_closure)
connected_imp_perfect_aff_dim:
"[connected S; aff_dim S ≠ 0; a ∈ S]==> a islimpt S"
using aff_dim_sing connected_imp_perfect by blast
✐‹tag unimportant›‹On ‹real›, ‹is_interval›, ‹convex› and ‹connected› are all equivalent›assumes "∧x. x ∈ S ==> (g has_field_derivative h x) (at x within S)"
mem_is_interval_1_I:
fixes a b c::real
assumes "is_interval S"
assumes "a ∈ S" "c ∈ S"
assumes "a ≤ b" "b ≤ c"
b\i
using assms is_interval_1 by blast
is_interval_connected_1:
fixes S :: "real set"
shows "is_interval S ⟷ connected S"
by (meson connected_iff_interval is_interval_1)
is_inerval_convex_1:
fixes S :: "real set"
shows "is_interval S ⟷ convex S"
by (metis is_interval_convex convex_connected is_interval_connected_1)
connected_compact_interval_1:
"connected S ∧ compact S ⟷ (∃a b. S = {a..b::real})"
by (auto simp: is_interval_connected_1 [symmetric] is_interval_compact)
connected_convex_1:
fixes S :: "real set"
shows "connected S ⟷ convex S"
by (metis is_interval_convex convex_connected is_interval_connected_1)
connected_space_iff_is_interval_1 [iff]:
fixes S :: "real set"
shows "connected_space (top_of_set S) ⟷ is_interval S"
using connectedin_topspace is_interval_connected_1 by force
connected_convex_1_gen:
fixes S :: "'a :: euclidean_space set"
assumes "DIM('a) = 1"
shows "connected S ⟷ convex S"
-
obtain f:: "'a → real" where linf: "linear f" and "inj f"
using subspace_isomorphism[OF subspace_UNIV subspace_UNIV,
where 'a='a and 'b=real]
unfolding Euclidean_Space.dim_UNIV
by (auto simp: assms)
then have "f -` (f ` S) = S"
by (simp add: inj_vimage_image_eq)
then show ?thesis
by (metis connected_convex_1 convex_linear_vimage linf convex_connected connected_linear_image)
[simp]:
fixes r s::real
shows is_interval_io: "is_interval {..<r}"
and is_interval_oi: "is_interval {r<..
and is_interval_oo: "is_interval {r<..
and is_interval_oc: "is_interval {r<..
and is_interval_co: "is_interval {r..<s}"
by (simp_all add: is_interval_convex_1)
✐‹tag unimportant›‹Another intermediate value theorem formulation›assumes "S ∈sets lebesgue"
ivt_increasing_component_on_1:
fixes f :: "real → 'a::euclidean_space"
assumes "a ≤ b"
and "continuous_on {a..b} f"
and "(f a)∙k ≤ y" "y ≤ (f b)∙k"
shows "∃x∈{a..b}. (f x)∙k = y"
-
have "f a ∈ f ` cbox a b" "f b ∈ f ` cbox a b"
using ‹a ≤ b› by auto
then show ?thesis
using connected_ivt_component[of "f ` cbox a b" "f a" "f b" k y]
by (simp add: connected_continuous_image assms)
ivt_increasing_component_1:
fixes f :: "real → 'a::euclidean_space"
shows "a ≤ b ==>∀x∈{a..b}. continuous (at x) f ==>
f a∙k ≤ y ==> y ≤" ` S ∈. \bdet (matrix (f' x))∣) integrable_on S"
by (rule ivt_increasing_component_on_1) (auto simp: continuous_at_imp_continuous_on)
ivt_decreasing_component_on_1:
fixes f :: "real → 'a::euclidean_space"
assumes "a ≤ b"
and "continuous_on {a..b} f"
and "(f b)∙k ≤ y"
and "y ≤ (f a)∙k"
shows "∃
using ivt_increasing_component_on_1[of a b "λx. - f x" k "- y"] neg_equal_iff_equal
using assms continuous_on_minus by force
ivt_decreasing_component_1:
fixes f :: "real → 'a::euclidean_space"
shows "a ≤ b ==>
f b∙k ≤ y ==> y ≤ f a∙k ==>∃x∈{a..b}. (f x)∙k = y"
by (rule ivt_decreasing_component_on_1) (auto simp: continuous_at_imp_continuous_on)
✐‹tag unimportant›‹A bound within an interval›
convex_hull_eq_real_cbox:
fixes x y :: real assumes "x ≤:
shows "convex hull {x, y} = cbox x y"
(rule hull_unique)
show "{x, y} ⊆ cbox x y" using ‹x ≤ y› by auto
(cbox x y)"
by (rule convex_box)
fix S assume "{x, y} ⊆ S" and "convex S"
then show "cbox x y ⊆ S"
unfolding is_interval_convex_1 [symmetric] is_interval_def Basis_real_def
by - (clarify, simp (no_asm_use), fast)
unit_interval_convex_hull:
"cbox (0::'a::euclidean_space) One = convex hull {x. ∀i∈Basis. (x∙i = 0) ∨S ∈ sets lebesgue"
(is "?int = convex hull ?points")
-
have One[simp]: "∧i. i ∈ Basis ==> One ∙ i = 1"
by (simp add: inner_sum_left sum.If_cases inner_Basis)
have "?int = {x. ∀i∈Basis. x ∙ i ∈ cbox 0 1}"
by (auto simp: cbox_def)
also have "… = (∑i∈Basis. (λx. x *R i) ` cbox 0 1)"
by (simp only: box_eq_set_sum_Basis)
also have "… = (∑i∈Basis. (λx. x *R i) ` (convex hull {0, 1}))"
by (simp only: convex_hull_eq_real_cbox zero_le_one)
also have "… = (∑i∈Basis. convex hull ((λx. x *R i) ` {0, 1}))"
by (simp add: convex_hull_linear_image)
also have "… = convex hull (∑i∈Basis. (λx. x *R i) ` {0, 1})"
by (simp only: convex_hull_set_sum)
also have "… = convex hull {x. ∀i∈Basis. x∙i ∈ {0, 1}}"
by (simp only: box_eq_set_sum_Basis)
also have "convex hull {x. ∀i∈Basis. x∙i ∈ {0, 1}} = convex hull ?points"
by simp
finally show ?thesis .
‹And this is a finite set of vertices.›
unit_cube_convex_hull:
obtains S :: "'a::euclidean_space set"
where "finite S" and "cbox 0 (∑Basis) = convex hull S"
show "finite {x::'a. ∀i∈Basis. x ∙ i = 0 ∨ x ∙ i = 1}"
proof (rule finite_subset, clarify)
show "finite ((λS. ∑
using finite_Basis by blast
fix x :: 'a
assume x: "∀i∈Basis. x ∙ i = 0 ∨ x ∙ i = 1"
show "x ∈ (λS. ∑i∈Basis. (if i∈S then 1 else 0) *R i) ` Pow Basis"
apply (rule image_eqI[where x="{i. i ∈ Basis ∧ x∙i = 1}"])
using x
by (subst euclidean_eq_iff, auto)
qed
show "cbox 0 One = convex hull {x. ∀i∈Basis. x ∙ i = 0 ∨ x ∙ i = 1}"
using unit_interval_convex_hull by blast
‹Hence any cube (could do any nonempty interval).›
cube_convex_hull:
assumes "d > 0"
obtains S :: "'a::euclidean_space set" where
"finite S" and "cbox (x - (∑i∈Basis. d*Ri)) (x + (∑i∈Basis. d*Ri)) = convex hull S"
-
let ?d = "(∑i∈Basis. d *R i)::'a"
have *: "cbox (x - ?d) (x + ?d) = (λy. x - ?d + (2 * d) *R y) ` cbox 0 (∑Basis)"
proof (intro set_eqI iffI)
fix y
assume "y ∈ cbox (x - ?d) (x + ?d)"
then have "inverse (2 * d) *R (y - (x - ?d)) ∈ cbox 0 (∑Basis)"
using assms by (simp add: mem_box inner_simps) (simp add: field_simps)
with ‹0 < d› show "y ∈ (λy. x - sum ((*R) d) Basis + (2 * d) *R y) ` cbox 0 One"
by (auto intro: image_eqI[where x= "inverse (2 * d) *R (y - (x - ?d))"])
next
fix y
assume "y ∈ (λy. x - ?d + (2 * d) *R y) ` cbox 0 One"
obtain z where z: "z ∈ cbox 0 One" "y = x - ?d + (2*d) *R z"
by auto
then show "y ∈ cbox (x - ?d) (x + ?d)"
using z assms by (auto simp: mem_box inner_simps)
qed
obtain S where "finite S" "cbox 0 (∑Basis::'a) = convex hull S"
using unit_cube_convex_hull by auto
then show ?thesis
by (rule_tac that[of "(\<lambda>y. x - ?d + (2 * d) *\<^sub>R y)` S"]) (auto simp: convex_hull_affinity *) qed
subsection✐‹tag unimportant›\‹Representation of any interval as a finite convex hull›
lemma image_stretch_interval: "(λx. ∑k∈Basis. (m k * (x∙k)) *R k) ` cbox a (b::'a::euclidean_space) = (if (cbox a b) = {} then {} else cbox (∑k∈Basis. (min (m k * (a∙k)) (m k * (b∙k))) *shows " java.lang.StringIndexOutOfBoundsException: Range [93, 25) out of bounds for length 93
(∑k∈Basis. (max (m k * (a∙k)) (m k * (b∙k))) *R k))" proof cases assume *: "cbox a b ≠ {}" show ?thesis unfolding box_ne_empty if_not_P[OF *] apply (simp add: cbox_def image_Collect set_eq_iff euclidean_eq_iff[where 'a='a] ball_conj_distrib[symmetric]) apply (subst choice_Basis_iff[symmetric]) proof (intro allI ball_cong refl) fix x i :: 'a assume "i ∈ Basis" with * have a_le_b: "a ∙ i ≤ b ∙ i" unfolding box_ne_empty by auto show "(∃xa. x ∙ i = m i * xa ∧ a ∙ i ≤ xa ∧ xa ≤ b ∙ i) ⟷
min (m i * (a ∙ i)) (m i * (b ∙ i)) ≤ x ∙ i ∧ x ∙ i ≤ max (m i * (a ∙ i)) (m i * (b ∙ i))" proof (cases "m i = 0") case True with a_le_b show ?thesis by auto next case False then have *: "∧a b. a = m i * b ⟷ b = a / m i" by (auto simp: field_simps) from False have "min (m i * (a ∙ i)) (m i * (b ∙ i)) = (if0 < m i then m i * (a ∙ i) else m i * (b ∙ i))" "max (m i * (a ∙ i fixes :"re \Rightarrow real" using a_le_b by (auto simp: min_def max_def mult_le_cancel_left) with False show ?thesis using a_le_b * by (simp add: le_divide_eq divide_le_eq) (simp add: ac_simps) qed qedassumes"uminus ` A ⊆ B""uminus ` B ⊆ A""A ∈ sets lebesgue" qed simp
lemma interval_image_stretch_interval: "∃u v. (λx. ∑k∈Basis. (m k * (x∙k))*R k) ` cbox a (b::'a::euclidean_space) = cbox u (v::'a::euclidean_space)" unfolding image_stretch_interval by auto
cbox_translation: ( a)(c+b = image (\lambdax c+x (box b" using image_affinity_cbox [of 1 c a b] using box_ne_empty [of "a+c" "b+c"] box_ne_empty [of a b] by (auto simp: inner_left_distrib add.commute)
lemma cbox_image_unit_interval: fixes a :: "'a::euclidean_space" assumes "cbox a b ≠ {}" shows "cbox a b =
(+) a ` (λx. ∑k∈Basis. ((b ∙ k - a ∙ k) * (x ∙ k)) *R k) ` cbox 0 One" using assms apply (simp add: box_ne_empty image_stretch_interval cbox_translation [symmetric]) apply (simp add: min_def max_def algebra_simps sum_subtractf euclidean_representation) done
lemma closed_interval_as_convex_hull: fixes a :: "'a::euclidean_space" obtains S where "finite S" "cbox a b = convex hull S" proof (cases "cbox a b = {}") case True with convex_hull_empty that show ?thesis by blast next case False oin S::"a " where "finite S" and eq: "cbox 0 One = convex hull S" by (blast intro: unit_cube_convex_hull) let ?S = "((+) a ` (λx. ∑k∈Basis. ((b ∙ k - a ∙ k) * (x ∙ k)) *R k) ` S)" show thesis proof show "finite ?S" by (simp add: ‹ bij_be[of _ _ _ uminus]) (use assms in auto) have lin: " (λx. ∑k∈Basis. ((b ∙ k - a ∙ k) * (x ∙ k)) *R k)"
by (rule linear_compose_sum) (auto simp: algebra_simps linearI)
show "cbox a b = convex hull ?S"
using convex_hull_linear_image [OF lin]
by (simp add: convex_hull_translation eq cbox_image_unit_interval [OF False])
qed
✐‹tag unimportant›‹Bounded convex function on open set is continuous›
convex_on_bounded_continuous:
fixes S :: "('a::real_normed_vector) set"
assumes "open S"
and f: "convex_on S f"
and "∀x∈S. ∣f x∣≤ b"
shows "continuous_on S f"
-
have "∃d>0. ∀x'. norm (x' - x) < d ⟶∣f x' - f x∣ < e" if "x ∈ S" "e > 0" for x and e :: real
proof -
define B where "B = ∣b∣ + 1"
then have B: "0 < B""∧x. x∈S ==>∣f x∣≤ B"
using assms(3) by auto
obtain k where "k > 0" and k: "cball x k ⊆ S"
using ‹x ∈ S› assms(1) open_contains_cball_eq by blast
show "∃d>0. ∀x'. norm (x' - x) < d ⟶∣f x' - f x∣ < e"
proof (intro exI conjI allI impI)
fix y
assume as: "norm (y - x) < min (k / 2) (e / (2 * B) * k)"
show "∣(intro has_absolute_integral_change_of_variables_1') (auto intro!: derivative_eq_intros)
proof (cases "y = x")
case False
define t where "t = k / norm (y - x)"
have "2 < t" "0<t"
unfolding t_def using as False and ‹k>0›
by (auto simp:field_simps)
have "y ∈ S"
apply (rule k[THEN subsetD])
unfolding mem_cball dist_norm
apply (rule order_trans[of _ "2 * norm (x - y)"])
using as
by (auto simp: field_simps norm_minus_commute)
{
define w where "w = x + t *R (y - x)"
using bij by (simp add: bij_betw_def)
using ‹k>0› by (auto simp: dist_norm t_def w_def k[THEN subsetD])
have "(1 / t) *R x + - x + ((t - 1) / t) *R x = (1 / t - 1 + (t - 1) / t) *R x"
by (auto simp: algebra_simps)
also have "… = 0"
using ‹t > 0› by (auto simp:field_simps)
finally show ?thesis
unfolding w_def using False and ‹t > 0›
by (auto simp: algebra_simps)
have 2: "2 * B < e * t"
unfolding t_def using ‹0 < e›‹0 < k›‹B > 0› and as and False
by (auto simp:field_simps)
have "f y - f x ≤ (f w - f x) / t"
using convex_onD [OF f, of "(t - 1)/t" w x] ‹0 < t›‹2 < t›‹x ∈ S›‹w ∈ S›
by (simp add: w field_simps)
also have "... < e"
using B(2)[OF ‹w∈S›] and B(2)[OF ‹x∈S›] 2 ‹t > 0› by (auto simp: field_simps)
finally have th1: "f y - f x < e" .
}
moreover
{
define w where "w = x - t *R (y - x)"
have "w ∈ S"
using ‹k > 0› by (auto simp: dist_norm t_def w_def k[THEN subsetD])
have "(1 / (1 + t)) *R x + (t / (1 + t)) *R x = (1 / (1 + t) + t / (1 + t)) *R x"
by (auto simp: algebra_simps)
also have "… = x"
using ‹t > 0› by (auto simp:field_simps)
finally have w: "(1 / (1+t)) *R w + (t / (1 + t)) *R y = x"
unfolding w_def using False and ‹t > 0›
by (auto simp: algebra_simps)
have "2 * B < e * t"
unfolding t_def
using ‹0 < e›‹0 < k›‹B > 0› and as and False
by (auto simp:field_simps)
then have *: "(f w - f y) / t < e"
using B(2)[OF ‹w∈S›] and B(2)[OF ‹y∈S›]
using ‹t > 0›
by (auto simp:field_simps)
have "f x ≤ 1 / (1 + t) * f w + (t / (1 + t)) * f y"
using convex_onD [OF f, of "t / (1+t)" w y] ‹0 < t›‹2 < t›‹y ∈ S›‹w ∈ S›
by (simp add: w field_simps)
also have "… = (f w + t * f y) / (1 + t)"
using ‹t > 0› by (simp add: add_divide_distrib)
also have "… < e + f y"
using ‹t > 0› * ‹e > 0› by (auto simp: field_simps)
finally have "f x - f y < e" by auto } ultimatelyshow?thesisbyauto qed(use\<open>0<e\<close>inauto) qed(use\<open>0<e\<close>\<open>0<k\<close>\<open>0<B\<close>in\<open>autosimp:field_simps\<close>) qed thenshow?thesis by(metiscontinuous_on_iffdist_normreal_norm_def) qed
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.73Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.