(* Author: L C Paulson, University of Cambridge Author: Amine Chaieb, University of Cambridge Author: Robert Himmelmann, TU Muenchen Author: Brian Huffman, Portland State University *)
chapter‹Vector Analysis›
theory Topology_Euclidean_Space imports
Elementary_Normed_Spaces
Linear_Algebra
Norm_Arith begin
section‹Elementary Topology in Euclidean Space›
lemma euclidean_dist_l2: fixes x y :: "'a :: euclidean_space" shows"dist x y = L2_set (λi. dist (x ∙ i) (y ∙ i)) Basis" unfolding dist_norm norm_eq_sqrt_inner L2_set_def by (subst euclidean_inner) (simp add: power2_eq_square inner_diff_left)
lemma representation_bound: fixes B :: "'N::real_inner set" assumes"finite B""independent B""b ∈ B"and orth: "pairwise orthogonal B" obtains m where"m > 0""∧x. x ∈ span B ==>∣representation B x b∣≤ m * norm x" proof fix x assume x: "x ∈ span B" have"b ≠ 0" using‹independent B›‹b ∈ B› dependent_zero by blast have [simp]: "b ∙ b' = (if b' = b then (norm b)🪙2 else 0)" if"b ∈ B""b' ∈ B"for b b' using orth by (simp add: orthogonal_def pairwise_def norm_eq_sqrt_inner that) have"norm x = norm (∑b∈B. representation B x b *🪙R b)" using real_vector.sum_representation_eq [OF ‹independent B› x ‹finite B› order_refl] by simp alsohave"… = sqrt ((∑b∈B. representation B x b *🪙R b) ∙ (∑b∈B. representation B x b *🪙R b))" by (simp add: norm_eq_sqrt_inner) alsohave"… = sqrt (∑b∈B. (representation B x b *🪙R b) ∙ (representation B x b *🪙R b))" using‹finite B› by (simp add: inner_sum_left inner_sum_right if_distrib [of "λx. _ * x"] cong: if_cong sum.cong_simp) alsohave"… = sqrt (∑b∈B. (norm (representation B x b *🪙R b))🪙2)" by (simp add: mult.commute mult.left_commute power2_eq_square) alsohave"… = sqrt (∑b∈B. (representation B x b)🪙2 * (norm b)🪙2)" by (simp add: norm_mult power_mult_distrib) finallyhave"norm x = sqrt (∑b∈B. (representation B x b)🪙2 * (norm b)🪙2)" . moreover have"sqrt ((representation B x b)🪙2 * (norm b)🪙2) ≤ sqrt (∑b∈B. (representation B x b)🪙2 * (norm b)🪙2)" using‹b ∈ B›‹finite B›by (auto intro: member_le_sum) thenhave"∣representation B x b∣≤ (1 / norm b) * sqrt (∑b∈B. (representation B x b)🪙2 * (norm b)🪙2)" using‹b ≠ 0›by (simp add: field_split_simps real_sqrt_mult del: real_sqrt_le_iff) ultimatelyshow"∣representation B x b∣≤ (1 / norm b) * norm x" by simp next show"0 < 1 / norm b" using‹independent B›‹b ∈ B› dependent_zero by auto qed
lemma continuous_on_representation: fixes B :: "'N::euclidean_space set" assumes"finite B""independent B""b ∈ B""pairwise orthogonal B" shows"continuous_on (span B) (λx. representation B x b)" proof show"∃d>0. ∀x'∈span B. dist x' x < d ⟶ dist (representation B x' b) (representation B x b) ≤ e" if"e > 0""x ∈ span B"for x e proof - obtain m where"m > 0"and m: "∧x. x ∈ span B ==>∣representation B x b∣≤ m * norm x" using assms representation_bound by blast show ?thesis unfolding dist_norm proof (intro exI conjI ballI impI) show"e/m > 0" by (simp add: ‹e > 0›‹m > 0›) show"norm (representation B x' b - representation B x b) ≤ e" if x': "x' ∈ span B"and less: "norm (x'-x) < e/m"for x' proof - have"∣representation B (x'-x) b∣≤ m * norm (x'-x)" using m [of "x'-x"] ‹x ∈ span B› span_diff x' by blast alsohave"… < e" by (metis ‹m > 0› less mult.commute pos_less_divide_eq) finallyhave"∣representation B (x'-x) b∣≤ e"by simp thenshow ?thesis by (simp add: ‹x ∈ span B›‹independent B› representation_diff x') qed qed qed qed
subsection🍋‹tag unimportant›\<open>Balls in Euclidean Space›
lemma cball_subset_cball_iff: fixes a :: "'a :: euclidean_space" shows"cball a r ⊆ cball a' r' ⟷ dist a a' + r ≤ r' ∨ r < 0"
(is"?lhs ⟷ ?rhs") proof assume ?lhs thenshow ?rhs proof (cases "r < 0") case True thenshow ?rhs by simp next case False thenhave [simp]: "r ≥ 0"by simp have"norm (a - a') + r ≤ r'" proof (cases "a = a'") case True thenshow ?thesis using subsetD [where c = "a + r *🪙R (SOME i. i ∈ Basis)", OF ‹?lhs›] subsetD [where c = a, OF ‹?lhs›] by (force simp: SOME_Basis dist_norm) next case False have"norm (a' - (a + (r / norm (a - a')) *🪙R (a - a'))) = norm ((-1 - (r / norm (a - a'))) *🪙R (a - a'))" by (simp add: algebra_simps) alsofrom‹a ≠ a'›have"... = ∣- norm (a - a') - r∣" by (simp add: divide_simps) finallyhave [simp]: "norm (a' - (a + (r / norm (a - a')) *🪙R (a - a'))) = ∣norm (a - a') + r∣" by linarith from‹a ≠ a'›show ?thesis using subsetD [where c = "a' + (1 + r / norm(a - a')) *🪙R (a - a')", OF ‹?lhs›] by (simp add: dist_norm scaleR_add_left) qed thenshow ?rhs by (simp add: dist_norm) qed qed metric
lemma cball_subset_ball_iff: "cball a r ⊆ ball a' r' ⟷ dist a a' + r < r' ∨ r < 0"
(is"?lhs ⟷ ?rhs") for a :: "'a::euclidean_space" proof assume ?lhs thenshow ?rhs proof (cases "r < 0") case True then show ?rhs by simp next case False thenhave [simp]: "r ≥ 0"by simp have"norm (a - a') + r < r'" proof (cases "a = a'") case True thenshow ?thesis using subsetD [where c = "a + r *🪙R (SOME i. i ∈ Basis)", OF ‹?lhs›] subsetD [where c = a, OF ‹?lhs›] by (force simp: SOME_Basis dist_norm) next case False have False if"norm (a - a') + r ≥ r'" proof - from that have"∣r' - norm (a - a')∣≤ r" by (smt (verit, best) ‹0 ≤ r›‹?lhs› ball_subset_cball cball_subset_cball_iff dist_norm order_trans) thenshow ?thesis using subsetD [where c = "a + (r' / norm(a - a') - 1) *🪙R (a - a')", OF ‹?lhs›] ‹a ≠ a'› apply (simp add: dist_norm) apply (simp add: scaleR_left_diff_distrib) apply (simp add: field_simps) done qed thenshow ?thesis by force qed thenshow ?rhs by (simp add: dist_norm) qed next assume ?rhs thenshow ?lhs by metric qed
lemma ball_subset_cball_iff: "ball a r ⊆ cball a' r' ⟷ dist a a' + r ≤ r' ∨ r ≤ 0"
(is"?lhs = ?rhs") for a :: "'a::euclidean_space" proof (cases "r ≤ 0") case True thenshow ?thesis by metric next case False show ?thesis proof assume ?lhs thenhave"(cball a r ⊆ cball a' r')" by (metis False closed_cball closure_ball closure_closed closure_mono not_less) with False show ?rhs by (fastforce iff: cball_subset_cball_iff) next assume ?rhs with False show ?lhs by metric qed qed
lemma ball_subset_ball_iff: fixes a :: "'a :: euclidean_space" shows"ball a r ⊆ ball a' r' ⟷ dist a a' + r ≤ r' ∨ r ≤ 0"
(is"?lhs = ?rhs") proof (cases "r ≤ 0") case True thenshow ?thesis by metric next case False show ?thesis proof assume ?lhs thenhave"0 < r'" using False by metric thenhave"cball a r ⊆ cball a' r'" by (metis False ‹?lhs› closure_ball closure_mono not_less) thenshow ?rhs using False cball_subset_cball_iff by fastforce qed metric qed
lemma ball_eq_ball_iff: fixes x :: "'a :: euclidean_space" shows"ball x d = ball y e ⟷ d ≤ 0 ∧ e ≤ 0 ∨ x=y ∧ d=e" by (smt (verit, del_insts) ball_empty ball_subset_cball_iff dist_norm norm_pths(2))
lemma cball_eq_cball_iff: fixes x :: "'a :: euclidean_space" shows"cball x d = cball y e ⟷ d < 0 ∧ e < 0 ∨ x=y ∧ d=e" by (smt (verit, ccfv_SIG) cball_empty cball_subset_cball_iff dist_norm norm_pths(2) zero_le_dist)
lemma ball_eq_cball_iff: fixes x :: "'a :: euclidean_space" shows"ball x d = cball y e ⟷ d ≤ 0 ∧ e < 0" (is"?lhs = ?rhs") by (smt (verit) ball_eq_empty ball_subset_cball_iff cball_eq_empty cball_subset_ball_iff order.refl)
lemma cball_eq_ball_iff: fixes x :: "'a :: euclidean_space" shows"cball x d = ball y e ⟷ d < 0 ∧ e ≤ 0" using ball_eq_cball_iff by blast
lemma finite_ball_avoid: fixes S :: "'a :: euclidean_space set" assumes"open S""finite X""p ∈ S" shows"∃e>0. ∀w∈ball p e. w∈S ∧ (w≠p ⟶ w∉X)" proof - obtain e1 where"0 < e1"and e1_b:"ball p e1 ⊆ S" using open_contains_ball_eq[OF ‹open S›] assms by auto obtain e2 where"0 < e2"and"∀x∈X. x ≠ p ⟶ e2 ≤ dist p x" using finite_set_avoid[OF ‹finite X›,of p] by auto hence"∀w∈ball p (min e1 e2). w∈S ∧ (w≠p ⟶ w∉X)"using e1_b by auto thus"∃e>0. ∀w∈ball p e. w ∈ S ∧ (w ≠ p ⟶ w ∉ X)" using‹e2>0›‹e1>0›by (rule_tac x="min e1 e2"in exI) auto qed
lemma finite_cball_avoid: fixes S :: "'a :: euclidean_space set" assumes"open S""finite X""p ∈ S" shows"∃e>0. ∀w∈cball p e. w∈S ∧ (w≠p ⟶ w∉X)" proof - obtain e1 where"e1>0"and e1: "∀w∈ball p e1. w∈S ∧ (w≠p ⟶ w∉X)" using finite_ball_avoid[OF assms] by auto
define e2 where"e2 ≡ e1/2" have"e2>0"and"e2 < e1"unfolding e2_def using‹e1>0›by auto thenhave"cball p e2 ⊆ ball p e1"by (subst cball_subset_ball_iff,auto) thenshow"∃e>0. ∀w∈cball p e. w ∈ S ∧ (w ≠ p ⟶ w ∉ X)"using‹e2>0› e1 by auto qed
lemma dim_cball: assumes"e > 0" shows"dim (cball (0 :: 'n::euclidean_space) e) = DIM('n)" proof -
{ fix x :: "'n::euclidean_space"
define y where"y = (e / norm x) *🪙R x" thenhave"y ∈ cball 0 e" using assms by auto moreoverhave *: "x = (norm x / e) *🪙R y" using y_def assms by simp moreoverfrom * have"x = (norm x/e) *🪙R y" by auto ultimatelyhave"x ∈ span (cball 0 e)" using span_scale[of y "cball 0 e""norm x/e"]
span_superset[of "cball 0 e"] by (simp add: span_base)
} thenhave"span (cball 0 e) = (UNIV :: 'n::euclidean_space set)" by auto thenshow ?thesis using dim_span[of "cball (0 :: 'n::euclidean_space) e"] by (auto) qed
subsection‹Boxes›
abbreviation🍋‹tag important› One :: "'a::euclidean_space"where "One ≡∑Basis"
lemma One_non_0: assumes"One = (0::'a::euclidean_space)"shows False proof - have"dependent (Basis :: 'a set)" apply (simp add: dependent_finite) apply (rule_tac x="λi. 1"in exI) using SOME_Basis apply (auto simp: assms) done with independent_Basis show False by force qed
corollary🍋‹tag unimportant› One_neq_0[iff]: "One ≠ 0" by (metis One_non_0)
corollary🍋‹tag unimportant› Zero_neq_One[iff]: "0 ≠ One" by (metis One_non_0)
definition🍋‹tag important› (in euclidean_space) eucl_less (infix‹🚫› 50) where "eucl_less a b ⟷ (∀i∈Basis. a ∙ i < b ∙ i)"
definition🍋‹tag important› box_eucl_less: "box a b = {x. a ∧ x definition🍋‹tag important›"cbox a b = {x. ∀i∈Basis. a ∙ i ≤ x ∙ i ∧ x ∙ i ≤ b ∙ i}"
lemma box_def: "box a b = {x. ∀i∈Basis. a ∙ i < x ∙ i ∧ x ∙ i < b ∙ i}" and in_box_eucl_less: "x ∈ box a b ⟷ a ∧ x and mem_box: "x ∈ box a b ⟷ (∀i∈Basis. a ∙ i < x ∙ i ∧ x ∙ i < b ∙ i)" "x ∈ cbox a b ⟷ (∀i∈Basis. a ∙ i ≤ x ∙ i ∧ x ∙ i ≤ b ∙ i)" by (auto simp: box_eucl_less eucl_less_def cbox_def)
lemma cbox_Pair_eq: "cbox (a, c) (b, d) = cbox a b × cbox c d" by (force simp: cbox_def Basis_prod_def)
lemma cbox_Pair_iff [iff]: "(x, y) ∈ cbox (a, c) (b, d) ⟷ x ∈ cbox a b ∧ y ∈ cbox c d" by (force simp: cbox_Pair_eq)
lemma cbox_Complex_eq: "cbox (Complex a c) (Complex b d) = (λ(x,y). Complex x y) ` (cbox a b × cbox c d)" by (force simp: cbox_def Basis_complex_def)
lemma cbox_Pair_eq_0: "cbox (a, c) (b, d) = {} ⟷ cbox a b = {} ∨ cbox c d = {}" by (force simp: cbox_Pair_eq)
lemma swap_cbox_Pair [simp]: "prod.swap ` cbox (c, a) (d, b) = cbox (a,c) (b,d)" by auto
lemma mem_box_real[simp]: "(x::real) ∈ box a b ⟷ a < x ∧ x < b" "(x::real) ∈ cbox a b ⟷ a ≤ x ∧ x ≤ b" by (auto simp: mem_box)
lemma box_real[simp]: fixes a b:: real shows"box a b = {a <..< b}""cbox a b = {a .. b}" by auto
lemma box_Int_box: fixes a :: "'a::euclidean_space" shows"box a b ∩ box c d = box (∑i∈Basis. max (a∙i) (c∙i) *🪙R i) (∑i∈Basis. min (b∙i) (d∙i) *🪙R i)" unfolding set_eq_iff and Int_iff and mem_box by auto
lemma cbox_prod: "cbox a b = cbox (fst a) (fst b) × cbox (snd a) (snd b)" by (cases a; cases b) auto
lemma box_prod: "box a b = box (fst a) (fst b) × box (snd a) (snd b)" by (cases a; cases b) (force simp: box_def Basis_prod_def)
lemma rational_boxes: fixes x :: "'a::euclidean_space" assumes"e > 0" shows"∃a b. (∀i∈Basis. a ∙ i ∈ℚ∧ b ∙ i ∈ℚ) ∧ x ∈ box a b ∧ box a b ⊆ ball x e" proof -
define e' where"e' = e / (2 * sqrt (real (DIM ('a))))" thenhave e: "e' > 0" using assms by (auto) have"∃y. y ∈ℚ∧ y < x ∙ i ∧ x ∙ i - y < e'"for i using Rats_dense_in_real[of "x ∙ i - e'""x ∙ i"] e by force thenobtain a where
a: "∧u. a u ∈ℚ∧ a u < x ∙ u ∧ x ∙ u - a u < e'"by metis have"∃y. y ∈ℚ∧ x ∙ i < y ∧ y - x ∙ i < e'"for i using Rats_dense_in_real[of "x ∙ i""x ∙ i + e'"] e by force thenobtain b where
b: "∧u. b u ∈ℚ∧ x ∙ u < b u ∧ b u - x ∙ u < e'"by metis let ?a = "∑i∈Basis. a i *🪙R i"and ?b = "∑i∈Basis. b i *🪙R i" show ?thesis proof (rule exI[of _ ?a], rule exI[of _ ?b], safe) fix y :: 'a assume *: "y ∈ box ?a ?b" have"dist x y = sqrt (∑i∈Basis. (dist (x ∙ i) (y ∙ i))🪙2)" unfolding L2_set_def[symmetric] by (rule euclidean_dist_l2) alsohave"… < sqrt (∑(i::'a)∈Basis. e^2 / real (DIM('a)))" proof (rule real_sqrt_less_mono, rule sum_strict_mono) fix i :: "'a" assume i: "i ∈ Basis" have"a i < y∙i ∧ y∙i < b i" using * i by (auto simp: box_def) moreoverhave"a i < x∙i""x∙i - a i < e'""x∙i < b i""b i - x∙i < e'" using a b by auto ultimatelyhave"∣x∙i - y∙i∣ < 2 * e'" by auto thenhave"dist (x ∙ i) (y ∙ i) < e/sqrt (real (DIM('a)))" unfolding e'_defby (auto simp: dist_real_def) thenhave"(dist (x ∙ i) (y ∙ i))🪙2 < (e/sqrt (real (DIM('a))))🪙2" by (rule power_strict_mono) auto thenshow"(dist (x ∙ i) (y ∙ i))🪙2 < e🪙2 / real DIM('a)" by (simp add: power_divide) qed auto alsohave"… = e" using‹0 🚫›by simp finallyshow"y ∈ ball x e" by (auto simp: ball_def) qed (use a b in‹auto simp: box_def›) qed
lemma open_UNION_box: fixes M :: "'a::euclidean_space set" assumes"open M" defines"a' ≡ λf :: 'a ==> real × real. (∑(i::'a)∈Basis. fst (f i) *🪙R i)" defines"b' ≡ λf :: 'a ==> real × real. (∑(i::'a)∈Basis. snd (f i) *🪙R i)" defines"I ≡ {f∈Basis →🪙E ℚ×ℚ. box (a' f) (b' f) ⊆ M}" shows"M = (∪f∈I. box (a' f) (b' f))" proof - have"x ∈ (∪f∈I. box (a' f) (b' f))"if"x ∈ M"for x proof - obtain e where e: "e > 0""ball x e ⊆ M" using openE[OF ‹open M›‹x ∈ M›] by auto moreoverobtain a b where ab: "x ∈ box a b" "∀i ∈ Basis. a ∙ i ∈ℚ" "∀i∈Basis. b ∙ i ∈ℚ" "box a b ⊆ ball x e" using rational_boxes[OF e(1)] by metis ultimatelyshow ?thesis by (intro UN_I[of "λi∈Basis. (a ∙ i, b ∙ i)"])
(auto simp: euclidean_representation I_def a'_def b'_def) qed thenshow ?thesis by (auto simp: I_def) qed
corollary open_countable_Union_open_box: fixes S :: "'a :: euclidean_space set" assumes"open S" obtainsDwhere"countable D""D⊆ Pow S""∧X. X ∈D==>∃a b. X = box a b""∪D = S" proof - let ?a = "λf. (∑(i::'a)∈Basis. fst (f i) *🪙R i)" let ?b = "λf. (∑(i::'a)∈Basis. snd (f i) *🪙R i)" let ?I = "{f∈Basis →🪙E ℚ×ℚ. box (?a f) (?b f) ⊆ S}" let ?D = "(λf. box (?a f) (?b f)) ` ?I" show ?thesis proof have"countable ?I" by (simp add: countable_PiE countable_rat) thenshow"countable ?D" by blast show"∪?D = S" using open_UNION_box [OF assms] by metis qed auto qed
lemma rational_cboxes: fixes x :: "'a::euclidean_space" assumes"e > 0" shows"∃a b. (∀i∈Basis. a ∙ i ∈ℚ∧ b ∙ i ∈ℚ) ∧ x ∈ cbox a b ∧ cbox a b ⊆ ball x e" proof -
define e' where"e' = e / (2 * sqrt (real (DIM ('a))))" thenhave e: "e' > 0" using assms by auto have"∃y. y ∈ℚ∧ y < x ∙ i ∧ x ∙ i - y < e'"for i using Rats_dense_in_real[of "x ∙ i - e'""x ∙ i"] e by force thenobtain a where
a: "∀u. a u ∈ℚ∧ a u < x ∙ u ∧ x ∙ u - a u < e'"by metis have"∃y. y ∈ℚ∧ x ∙ i < y ∧ y - x ∙ i < e'"for i using Rats_dense_in_real[of "x ∙ i""x ∙ i + e'"] e by force thenobtain b where
b: "∀u. b u ∈ℚ∧ x ∙ u < b u ∧ b u - x ∙ u < e'"by metis let ?a = "∑i∈Basis. a i *🪙R i"and ?b = "∑i∈Basis. b i *🪙R i" show ?thesis proof (rule exI[of _ ?a], rule exI[of _ ?b], safe) fix y :: 'a assume *: "y ∈ cbox ?a ?b" have"dist x y = sqrt (∑i∈Basis. (dist (x ∙ i) (y ∙ i))🪙2)" unfolding L2_set_def[symmetric] by (rule euclidean_dist_l2) alsohave"… < sqrt (∑(i::'a)∈Basis. e^2 / real (DIM('a)))" proof (rule real_sqrt_less_mono, rule sum_strict_mono) fix i :: "'a" assume i: "i ∈ Basis" have"a i ≤ y∙i ∧ y∙i ≤ b i" using * i by (auto simp: cbox_def) moreoverhave"a i < x∙i""x∙i - a i < e'""x∙i < b i""b i - x∙i < e'" using a b by auto ultimatelyhave"∣x∙i - y∙i∣ < 2 * e'" by auto thenhave"dist (x ∙ i) (y ∙ i) < e/sqrt (real (DIM('a)))" unfolding e'_defby (auto simp: dist_real_def) thenhave"(dist (x ∙ i) (y ∙ i))🪙2 < (e/sqrt (real (DIM('a))))🪙2" by (rule power_strict_mono) auto thenshow"(dist (x ∙ i) (y ∙ i))🪙2 < e🪙2 / real DIM('a)" by (simp add: power_divide) qed auto alsohave"… = e" using‹0 🚫›by simp finallyshow"y ∈ ball x e" by (auto simp: ball_def) next show"x ∈ cbox (∑i∈Basis. a i *🪙R i) (∑i∈Basis. b i *🪙R i)" using a b less_imp_le by (auto simp: cbox_def) qed (use a b cbox_def in auto) qed
lemma open_UNION_cbox: fixes M :: "'a::euclidean_space set" assumes"open M" defines"a' ≡ λf. (∑(i::'a)∈Basis. fst (f i) *🪙R i)" defines"b' ≡ λf. (∑(i::'a)∈Basis. snd (f i) *🪙R i)" defines"I ≡ {f∈Basis →🪙E ℚ×ℚ. cbox (a' f) (b' f) ⊆ M}" shows"M = (∪f∈I. cbox (a' f) (b' f))" proof - have"x ∈ (∪f∈I. cbox (a' f) (b' f))"if"x ∈ M"for x proof - obtain e where e: "e > 0""ball x e ⊆ M" using openE[OF ‹open M›‹x ∈ M›] by auto moreoverobtain a b where ab: "x ∈ cbox a b""∀i ∈ Basis. a ∙ i ∈ℚ" "∀i ∈ Basis. b ∙ i ∈ℚ""cbox a b ⊆ ball x e" using rational_cboxes[OF e(1)] by metis ultimatelyshow ?thesis by (intro UN_I[of "λi∈Basis. (a ∙ i, b ∙ i)"])
(auto simp: euclidean_representation I_def a'_def b'_def) qed thenshow ?thesis by (auto simp: I_def) qed
corollary open_countable_Union_open_cbox: fixes S :: "'a :: euclidean_space set" assumes"open S" obtainsDwhere"countable D""D⊆ Pow S""∧X. X ∈D==>∃a b. X = cbox a b""∪D = S" proof - let ?a = "λf. (∑(i::'a)∈Basis. fst (f i) *🪙R i)" let ?b = "λf. (∑(i::'a)∈Basis. snd (f i) *🪙R i)" let ?I = "{f∈Basis →🪙E ℚ×ℚ. cbox (?a f) (?b f) ⊆ S}" let ?D = "(λf. cbox (?a f) (?b f)) ` ?I" show ?thesis proof have"countable ?I" by (simp add: countable_PiE countable_rat) thenshow"countable ?D" by blast show"∪?D = S" using open_UNION_cbox [OF assms] by metis qed auto qed
lemma box_eq_empty: fixes a :: "'a::euclidean_space" shows"(box a b = {} ⟷ (∃i∈Basis. b∙i ≤ a∙i))" (is ?th1) and"(cbox a b = {} ⟷ (∃i∈Basis. b∙i < a∙i))" (is ?th2) proof - have False if"i ∈ Basis"and"b∙i ≤ a∙i"and"x ∈ box a b"for i x by (smt (verit, ccfv_SIG) mem_box(1) that) moreover
{ assume as: "∀i∈Basis. ¬ (b∙i ≤ a∙i)" let ?x = "(1/2) *🪙R (a + b)"
{ fix i :: 'a assume i: "i ∈ Basis" have"a∙i < b∙i" using as i by fastforce thenhave"a∙i < ((1/2) *🪙R (a+b)) ∙ i""((1/2) *🪙R (a+b)) ∙ i < b∙i" by (auto simp: inner_add_left)
} thenhave"box a b ≠ {}" by (metis (no_types, opaque_lifting) emptyE mem_box(1))
} ultimatelyshow ?th1 by blast
have False if"i∈Basis"and"b∙i < a∙i"and"x ∈ cbox a b"for i x using mem_box(2) that by force moreover have"cbox a b ≠ {}"if"∀i∈Basis. ¬ (b∙i < a∙i)" by (metis emptyE linorder_linear mem_box(2) order.strict_iff_not that) ultimatelyshow ?th2 by blast qed
lemma box_ne_empty: fixes a :: "'a::euclidean_space" shows"cbox a b ≠ {} ⟷ (∀i∈Basis. a∙i ≤ b∙i)" and"box a b ≠ {} ⟷ (∀i∈Basis. a∙i < b∙i)" unfolding box_eq_empty[of a b] by fastforce+
lemma fixes a :: "'a::euclidean_space" shows cbox_idem [simp]: "cbox a a = {a}" and box_idem [simp]: "box a a = {}" unfolding set_eq_iff mem_box eq_iff [symmetric] using euclidean_eq_iff by fastforce+
lemma subset_box_imp: fixes a :: "'a::euclidean_space" shows"(∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i) ==> cbox c d ⊆ cbox a b" and"(∀i∈Basis. a∙i < c∙i ∧ d∙i < b∙i) ==> cbox c d ⊆ box a b" and"(∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i) ==> box c d ⊆ cbox a b" and"(∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i) ==> box c d ⊆ box a b" unfolding subset_eq[unfolded Ball_def] unfolding mem_box by (best intro: order_trans less_le_trans le_less_trans less_imp_le)+
lemma box_subset_cbox: fixes a :: "'a::euclidean_space" shows"box a b ⊆ cbox a b" unfolding subset_eq [unfolded Ball_def] mem_box by (fast intro: less_imp_le)
lemma subset_box: fixes a :: "'a::euclidean_space" shows"cbox c d ⊆ cbox a b ⟷ (∀i∈Basis. c∙i ≤ d∙i) ⟶ (∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i)" (is ?th1) and"cbox c d ⊆ box a b ⟷ (∀i∈Basis. c∙i ≤ d∙i) ⟶ (∀i∈Basis. a∙i < c∙i ∧ d∙i < b∙i)" (is?th2) and"box c d ⊆ cbox a b ⟷ (∀i∈Basis. c∙i < d∙i) ⟶ (∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i)"(is ?th3) and"box c d ⊆ box a b ⟷ (∀i∈Basis. c∙i < d∙i) ⟶ (∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i)" (is ?th4) proof - let ?lesscd = "∀i∈Basis. c∙i < d∙i" let ?lerhs = "∀i∈Basis. a∙i ≤ c∙i ∧ d∙i ≤ b∙i" show ?th1 ?th2 by (fastforce simp: mem_box)+ have acdb: "a∙i ≤ c∙i ∧ d∙i ≤ b∙i" if i: "i ∈ Basis"and box: "box c d ⊆ cbox a b"andcd: "∧i. i ∈ Basis ==> c∙i < d∙i"for i proof - have"box c d ≠ {}" using that unfolding box_eq_empty by force
{ let ?x = "(∑j∈Basis. (if j=i then ((min (a∙j) (d∙j))+c∙j)/2 else (c∙j+d∙j)/2) *🪙R j)::'a" assume *: "a∙i > c∙i" thenhave"c ∙ j < ?x ∙ j ∧ ?x ∙ j < d ∙ j"if"j ∈ Basis"for j usingcd that by (fastforce simp add: i *) thenhave"?x ∈ box c d" unfolding mem_box by auto moreoverhave"?x ∉ cbox a b" using i cd * by (force simp: mem_box) ultimatelyhave False using box by auto
} thenhave"a∙i ≤ c∙i"by force moreover
{ let ?x = "(∑j∈Basis. (if j=i then ((max (b∙j) (c∙j))+d∙j)/2 else (c∙j+d∙j)/2) *🪙R j)::'a" assume *: "b∙i < d∙i" thenhave"d ∙ j > ?x ∙ j ∧ ?x ∙ j > c ∙ j"if"j ∈ Basis"for j usingcd that by (fastforce simp add: i *) thenhave"?x ∈ box c d" unfolding mem_box by auto moreoverhave"?x ∉ cbox a b" using i cd * by (force simp: mem_box) ultimatelyhave False using box by auto
} thenhave"b∙i ≥ d∙i"by (rule ccontr) auto ultimatelyshow ?thesis by auto qed show ?th3 using acdb by (fastforce simp add: mem_box) have acdb': "a∙i ≤ c∙i ∧ d∙i ≤ b∙i" if"i ∈ Basis""box c d ⊆ box a b""∧i. i ∈ Basis ==> c∙i < d∙i"for i using box_subset_cbox[of a b] that acdb by auto show ?th4 using acdb' by (fastforce simp add: mem_box) qed
lemma eq_cbox: "cbox a b = cbox c d ⟷ cbox a b = {} ∧ cbox c d = {} ∨ a = c ∧ b = d"
(is"?lhs = ?rhs") proof assume ?lhs thenhave"cbox a b ⊆ cbox c d""cbox c d ⊆ cbox a b" by auto thenshow ?rhs by (force simp: subset_box box_eq_empty intro: antisym euclidean_eqI) qed auto
lemma eq_cbox_box [simp]: "cbox a b = box c d ⟷ cbox a b = {} ∧ box c d = {}"
(is"?lhs ⟷ ?rhs") proof assume L: ?lhs thenhave"cbox a b ⊆ box c d""box c d ⊆ cbox a b" by auto with L subset_box show ?rhs by (smt (verit) SOME_Basis box_ne_empty(1)) qed force
lemma eq_box_cbox [simp]: "box a b = cbox c d ⟷ box a b = {} ∧ cbox c d = {}" by (metis eq_cbox_box)
lemma eq_box: "box a b = box c d ⟷ box a b = {} ∧ box c d = {} ∨ a = c ∧ b = d"
(is"?lhs ⟷ ?rhs") proof assume L: ?lhs thenhave"box a b ⊆ box c d""box c d ⊆ box a b" by auto thenshow ?rhs unfolding subset_box by (smt (verit) box_ne_empty(2) euclidean_eq_iff)+ qed force
lemma subset_box_complex: "cbox a b ⊆ cbox c d ⟷ (Re a ≤ Re b ∧ Im a ≤ Im b) ⟶ Re a ≥ Re c ∧ Im a ≥ Im c ∧ Re b ≤ Re d ∧ Im b ≤ Im d" "cbox a b ⊆ box c d ⟷ (Re a ≤ Re b ∧ Im a ≤ Im b) ⟶ Re a > Re c ∧ Im a > Im c ∧ Re b < Re d ∧ Im b < Im d" "box a b ⊆ cbox c d ⟷ (Re a < Re b ∧ Im a < Im b) ⟶ Re a ≥ Re c ∧ Im a ≥ Im c ∧ Re b ≤ Re d ∧ Im b ≤ Im d" "box a b ⊆ box c d ⟷ (Re a < Re b ∧ Im a < Im b) ⟶ Re a ≥ Re c ∧ Im a ≥ Im c ∧ Re b ≤ Re d ∧ Im b ≤ Im d" by (subst subset_box; force simp: Basis_complex_def)+
lemma in_cbox_complex_iff: "x ∈ cbox a b ⟷ Re x ∈ {Re a..Re b} ∧ Im x ∈ {Im a..Im b}" by (cases x; cases a; cases b) (auto simp: cbox_Complex_eq)
lemma cbox_complex_of_real: "cbox (complex_of_real x) (complex_of_real y) = complex_of_real ` {x..y}" proof - have"(x ≤ Re z ∧ Re z ≤ y ∧ Im z = 0) = (z ∈ complex_of_real ` {x..y})"for z by (cases z) (simp add: complex_eq_cancel_iff2 image_iff) thenshow ?thesis by (auto simp: in_cbox_complex_iff) qed
lemma box_Complex_eq: "box (Complex a c) (Complex b d) = (λ(x,y). Complex x y) ` (box a b × box c d)" by (auto simp: box_def Basis_complex_def image_iff complex_eq_iff)
lemma in_box_complex_iff: "x ∈ box a b ⟷ Re x ∈ {Re a<..∧ Im x ∈ {Im a<.. by (cases x; cases a; cases b) (auto simp: box_Complex_eq)
lemma cbox_complex_eq: "cbox a b = {x. Re x ∈ {Re a..Re b} ∧ Im x ∈ {Im a..Im b}}" by (auto simp: in_cbox_complex_iff)
lemma box_complex_eq: "box a b = {x. Re x ∈ {Re a<..∧ Im x ∈ {Im a<.. by (auto simp: in_box_complex_iff)
lemma Int_interval: fixes a :: "'a::euclidean_space" shows"cbox a b ∩ cbox c d = cbox (∑i∈Basis. max (a∙i) (c∙i) *🪙R i) (∑i∈Basis. min (b∙i) (d∙i) *🪙R i)" unfolding set_eq_iff and Int_iff and mem_box by auto
lemma disjoint_interval: fixes a::"'a::euclidean_space" shows"cbox a b ∩ cbox c d = {} ⟷ (∃i∈Basis. (b∙i < a∙i ∨ d∙i < c∙i ∨ b∙i < c∙i ∨ d∙i < a∙i))" (is ?th1) and"cbox a b ∩ box c d = {} ⟷ (∃i∈Basis. (b∙i < a∙i ∨ d∙i ≤ c∙i ∨ b∙i ≤ c∙i ∨ d∙i ≤ a∙i))" (is ?th2) and"box a b ∩ cbox c d = {} ⟷ (∃i∈Basis. (b∙i ≤ a∙i ∨ d∙i < c∙i ∨ b∙i ≤ c∙i ∨ d∙i ≤ a∙i))" (is ?th3) and"box a b ∩ box c d = {} ⟷ (∃i∈Basis. (b∙i ≤ a∙i ∨ d∙i ≤ c∙i ∨ b∙i ≤ c∙i ∨ d∙i≤ a∙i))" (is ?th4) proof - let ?z = "(∑i∈Basis. (((max (a∙i) (c∙i)) + (min (b∙i) (d∙i))) / 2) *🪙R i)::'a" have **: "∧P Q. (∧i :: 'a. i ∈ Basis ==> Q ?z i ==> P i) ==> (∧i x :: 'a. i ∈ Basis ==> P i ==> Q x i) ==> (∀x. ∃i∈Basis. Q x i) ⟷ (∃i∈Basis. P i)" by blast note * = set_eq_iff Int_iff empty_iff mem_box ball_conj_distrib[symmetric] eq_False ball_simps(10) show ?th1 unfolding * by (intro **) auto show ?th2 unfolding * by (intro **) auto show ?th3 unfolding * by (intro **) auto show ?th4 unfolding * by (intro **) auto qed
lemma UN_box_eq_UNIV: "(∪i::nat. box (- (real i *🪙R One)) (real i *🪙R One)) = UNIV" proof - have"∣x ∙ b∣ < real_of_int (⌈Max ((λb. ∣x ∙ b∣)`Basis)⌉ + 1)" if [simp]: "b ∈ Basis"for x b :: 'a proof - have"∣x ∙ b∣≤ real_of_int ⌈∣x ∙ b∣⌉" by (rule le_of_int_ceiling) alsohave"…≤ real_of_int ⌈Max ((λb. ∣x ∙ b∣)`Basis)⌉" by (auto intro!: ceiling_mono) alsohave"… < real_of_int (⌈Max ((λb. ∣x ∙ b∣)`Basis)⌉ + 1)" by simp finallyshow ?thesis . qed thenhave"∃n::nat. ∀b∈Basis. ∣x ∙ b∣ < real n"for x :: 'a by (metis order.strict_trans reals_Archimedean2) moreoverhave"∧x b::'a. ∧n::nat. ∣x ∙ b∣ < real n ⟷ - real n < x ∙ b ∧ x ∙ b < real n" by auto ultimatelyshow ?thesis by (auto simp: box_def inner_sum_left inner_Basis sum.If_cases) qed
lemma cbox_shift: "(+) c ` cbox a b = cbox (a + c) (b + c)" proof - have"bij_betw ((+) c) (cbox a b) (cbox (a + c) (b + c))" by (rule bij_betwI[of _ _ _ "λx. x - c"]) (auto simp: cbox_def algebra_simps) thus ?thesis by (simp add: bij_betw_def) qed
lemma cbox_shift': "(λx. x + c) ` cbox a b = cbox (a + c) (b + c)" using cbox_shift[of c a b] by (simp add: add.commute)
lemma cbox_shift'': "(λx. x - c) ` cbox a b = cbox (a - c) (b - c)" using cbox_shift[of "-c" a b] by simp
lemma image_affinity_cbox: fixes m::real fixes a b c :: "'a::euclidean_space" shows"(λx. m *🪙R x + c) ` cbox a b = (if cbox a b = {} then {} else (if 0 ≤ m then cbox (m *🪙R a + c) (m *🪙R b + c) else cbox (m *🪙R b + c) (m *🪙R a + c)))" proof (cases "m = 0") case True
{ fix x assume"∀i∈Basis. x ∙ i ≤ c ∙ i""∀i∈Basis. c ∙ i ≤ x ∙ i" thenhave"x = c" by (simp add: dual_order.antisym euclidean_eqI)
} moreoverhave"c ∈ cbox (m *🪙R a + c) (m *🪙R b + c)" unfolding True by auto ultimatelyshow ?thesis using True by (auto simp: cbox_def) next case False
{ fix y assume"∀i∈Basis. a ∙ i ≤ y ∙ i""∀i∈Basis. y ∙ i ≤ b ∙ i""m > 0" thenhave"∀i∈Basis. (m *🪙R a + c) ∙ i ≤ (m *🪙R y + c) ∙ i" and"∀i∈Basis. (m *🪙R y + c) ∙ i ≤ (m *🪙R b + c) ∙ i" by (auto simp: inner_distrib)
} moreover
{ fix y assume"∀i∈Basis. a ∙ i ≤ y ∙ i""∀i∈Basis. y ∙ i ≤ b ∙ i""m < 0" thenhave"∀i∈Basis. (m *🪙R b + c) ∙ i ≤ (m *🪙R y + c) ∙ i" and"∀i∈Basis. (m *🪙R y + c) ∙ i ≤ (m *🪙R a + c) ∙ i" by (auto simp: mult_left_mono_neg inner_distrib)
} moreover
{ fix y assume"m > 0"and"∀i∈Basis. (m *🪙R a + c) ∙ i ≤ y ∙ i" and"∀i∈Basis. y ∙ i ≤ (m *🪙R b + c) ∙ i" thenhave"y ∈ (λx. m *🪙R x + c) ` cbox a b" unfolding image_iff Bex_def mem_box apply (intro exI[where x="(1 / m) *🪙R (y - c)"]) apply (auto simp: pos_le_divide_eq pos_divide_le_eq mult.commute inner_distrib inner_diff_left) done
} moreover
{ fix y assume"∀i∈Basis. (m *🪙R b + c) ∙ i ≤ y ∙ i""∀i∈Basis. y ∙ i ≤ (m *🪙R a + c) ∙i""m < 0" thenhave"y ∈ (λx. m *🪙R x + c) ` cbox a b" unfolding image_iff Bex_def mem_box apply (intro exI[where x="(1 / m) *🪙R (y - c)"]) apply (auto simp: neg_le_divide_eq neg_divide_le_eq mult.commute inner_distrib inner_diff_left) done
} ultimatelyshow ?thesis using False by (auto simp: cbox_def) qed
lemma image_smult_cbox:"(λx. m *🪙R (x::_::euclidean_space)) ` cbox a b = (if cbox a b = {} then {} else if 0 ≤ m then cbox (m *🪙R a) (m *🪙R b) else cbox (m *🪙R b) (m *🪙R a))" using image_affinity_cbox[of m 0 a b] by auto
lemma swap_continuous: assumes"continuous_on (cbox (a,c) (b,d)) (λ(x,y). f x y)" shows"continuous_on (cbox (c,a) (d,b)) (λ(x, y). f y x)" proof - have"(λ(x, y). f y x) = (λ(x, y). f x y) ∘ prod.swap" by auto thenshow ?thesis by (metis assms continuous_on_compose continuous_on_swap swap_cbox_Pair) qed
lemma open_contains_cbox: fixes x :: "'a :: euclidean_space" assumes"open A""x ∈ A" obtains a b where"cbox a b ⊆ A""x ∈ box a b""∀i∈Basis. a ∙ i < b ∙ i" proof - from assms obtain R where R: "R > 0""ball x R ⊆ A" by (auto simp: open_contains_ball)
define r :: real where"r = R / (2 * sqrt DIM('a))" from‹R > 0›have [simp]: "r > 0"by (auto simp: r_def)
define d :: 'a where"d = r *🪙R Topology_Euclidean_Space.One" have"cbox (x - d) (x + d) ⊆ A" proof safe fix y assume y: "y ∈ cbox (x - d) (x + d)" have"dist x y = sqrt (∑i∈Basis. (dist (x ∙ i) (y ∙ i))🪙2)" by (subst euclidean_dist_l2) (auto simp: L2_set_def) alsofrom y have"sqrt (∑i∈Basis. (dist (x ∙ i) (y ∙ i))🪙2) ≤ sqrt (∑i∈(Basis::'a set). r🪙2)" by (intro real_sqrt_le_mono sum_mono power_mono)
(auto simp: dist_norm d_def cbox_def algebra_simps) alsohave"… = sqrt (DIM('a) * r🪙2)"by simp alsohave"DIM('a) * r🪙2 = (R / 2) ^ 2" by (simp add: r_def power_divide) alsohave"sqrt … = R / 2" using‹R > 0›by simp alsofrom‹R > 0›have"… < R"by simp finallyhave"y ∈ ball x R"by simp with R show"y ∈ A"by blast qed thus ?thesis using that[of "x - d""x + d"] by (auto simp: algebra_simps d_def box_def) qed
lemma open_contains_box: fixes x :: "'a :: euclidean_space" assumes"open A""x ∈ A" obtains a b where"box a b ⊆ A""x ∈ box a b""∀i∈Basis. a ∙ i < b ∙ i" by (meson assms box_subset_cbox dual_order.trans open_contains_cbox)
lemma inner_image_box: assumes"(i :: 'a :: euclidean_space) ∈ Basis" assumes"∀i∈Basis. a ∙ i < b ∙ i" shows"(λx. x ∙ i) ` box a b = {a ∙ i<..∙ i}" proof safe fix x assume x: "x ∈ {a ∙ i<..∙ i}" let ?y = "(∑j∈Basis. (if i = j then x else (a + b) ∙ j / 2) *🪙R j)" from x assms have"?y ∙ i ∈ (λx. x ∙ i) ` box a b" by (intro imageI) (auto simp: box_def algebra_simps) alsohave"?y ∙ i = (∑j∈Basis. (if i = j then x else (a + b) ∙ j / 2) * (j ∙ i))" by (simp add: inner_sum_left) alsohave"… = (∑j∈Basis. if i = j then x else 0)" by (intro sum.cong) (auto simp: inner_not_same_Basis assms) alsohave"… = x"using assms by simp finallyshow"x ∈ (λx. x ∙ i) ` box a b" . qed (insert assms, auto simp: box_def)
lemma inner_image_cbox: assumes"(i :: 'a :: euclidean_space) ∈ Basis" assumes"∀i∈Basis. a ∙ i ≤ b ∙ i" shows"(λx. x ∙ i) ` cbox a b = {a ∙ i..b ∙ i}" proof safe fix x assume x: "x ∈ {a ∙ i..b ∙ i}" let ?y = "(∑j∈Basis. (if i = j then x else a ∙ j) *🪙R j)" from x assms have"?y ∙ i ∈ (λx. x ∙ i) ` cbox a b" by (intro imageI) (auto simp: cbox_def) alsohave"?y ∙ i = (∑j∈Basis. (if i = j then x else a ∙ j) * (j ∙ i))" by (simp add: inner_sum_left) alsohave"… = (∑j∈Basis. if i = j then x else 0)" by (intro sum.cong) (auto simp: inner_not_same_Basis assms) alsohave"… = x"using assms by simp finallyshow"x ∈ (λx. x ∙ i) ` cbox a b" . qed (insert assms, auto simp: cbox_def)
lemma is_interval_1: "is_interval (s::real set) ⟷ (∀a∈s. ∀b∈s. ∀ x. a ≤ x ∧ x ≤ b ⟶ x ∈ s)" unfolding is_interval_def by auto
lemma is_interval_Int: "is_interval X ==> is_interval Y ==> is_interval (X ∩ Y)" unfolding is_interval_def by blast
lemma is_interval_cbox [simp]: "is_interval (cbox a (b::'a::euclidean_space))" (is ?th1) and is_interval_box [simp]: "is_interval (box a b)" (is ?th2) unfolding is_interval_def mem_box Ball_def atLeastAtMost_iff by (meson order_trans le_less_trans less_le_trans less_trans)+
lemma is_interval_empty [iff]: "is_interval {}" unfolding is_interval_def by simp
lemma is_interval_univ [iff]: "is_interval UNIV" unfolding is_interval_def by simp
lemma mem_is_intervalI: assumes"is_interval S" and"a ∈ S""b ∈ S" and"∧i. i ∈ Basis ==> a ∙ i ≤ x ∙ i ∧ x ∙ i ≤ b ∙ i ∨ b ∙ i ≤ x ∙ i ∧ x ∙ i ≤ a ∙ i" shows"x ∈ S" using assms is_interval_def by force
lemma interval_subst: fixes S::"'a::euclidean_space set" assumes"is_interval S" and"x ∈ S""y j ∈ S" and"j ∈ Basis" shows"(∑i∈Basis. (if i = j then y i ∙ i else x ∙ i) *🪙R i) ∈ S" by (rule mem_is_intervalI[OF assms(1,2)]) (auto simp: assms)
lemma mem_box_componentwiseI: fixes S::"'a::euclidean_space set" assumes"is_interval S" assumes"∧i. i ∈ Basis ==> x ∙ i ∈ ((λx. x ∙ i) ` S)" shows"x ∈ S" proof - from assms have"∀i ∈ Basis. ∃s ∈ S. x ∙ i = s ∙ i" by auto with finite_Basis obtain s and bs::"'a list" where s: "∧i. i ∈ Basis ==> x ∙ i = s i ∙ i""∧i. i ∈ Basis ==> s i ∈ S" and bs: "set bs = Basis""distinct bs" by (metis finite_distinct_list) from nonempty_Basis s obtain j where j: "j ∈ Basis""s j ∈ S" by blast
define y where "y = rec_list (s j) (λj _ Y. (∑i∈Basis. (if i = j then s i ∙ i else Y ∙ i) *🪙R i))" have"x = (∑i∈Basis. (if i ∈ set bs then s i ∙ i else s j ∙ i) *🪙R i)" using bs by (auto simp: s(1)[symmetric] euclidean_representation) alsohave [symmetric]: "y bs = …" using bs(2) bs(1)[THEN equalityD1] by (induct bs) (auto simp: y_def euclidean_representation intro!: euclidean_eqI[where 'a='a]) alsohave"y bs ∈ S" using bs(1)[THEN equalityD1] proof (induction bs) case Nil thenshow ?case by (simp add: j y_def) next case (Cons a bs) thenshow ?case using interval_subst[OF assms(1)] s by (simp add: y_def) qed finallyshow ?thesis . qed
lemma cbox01_nonempty [simp]: "cbox 0 One ≠ {}" by (simp add: box_ne_empty inner_Basis inner_sum_left sum_nonneg)
lemma box01_nonempty [simp]: "box 0 One ≠ {}" by (simp add: box_ne_empty inner_Basis inner_sum_left)
lemma empty_as_interval: "{} = cbox One (0::'a::euclidean_space)" using nonempty_Basis box01_nonempty box_eq_empty(1) box_ne_empty(1) by blast
lemma interval_subset_is_interval: assumes"is_interval S" shows"cbox a b ⊆ S ⟷ cbox a b = {} ∨ a ∈ S ∧ b ∈ S" (is"?lhs = ?rhs") proof assume ?lhs thenshow ?rhs using box_ne_empty(1) mem_box(2) by fastforce next assume ?rhs have"cbox a b ⊆ S"if"a ∈ S""b ∈ S" using assms that by (force simp: mem_box intro: mem_is_intervalI) with‹?rhs›show ?lhs by blast qed
lemma is_real_interval_union: "is_interval (X ∪ Y)" if X: "is_interval X"and Y: "is_interval Y"and I: "(X ≠ {} ==> Y ≠ {} ==> X ∩ Y ≠ {})" for X Y::"real set" proof -
consider "X ≠ {}""Y ≠ {}" | "X = {}" | "Y = {}"by blast thenshow ?thesis proof cases case 1 thenobtain r where"r ∈ X ∨ X ∩ Y = {}""r ∈ Y ∨ X ∩ Y = {}" by blast thenshow ?thesis using I 1 X Y unfolding is_interval_1 by (metis (full_types) Un_iff le_cases) qed (use that in auto) qed
lemma is_interval_translationI: assumes"is_interval X" shows"is_interval ((+) x ` X)" unfolding is_interval_def proof safe fix b d e assume"b ∈ X""d ∈ X" "∀i∈Basis. (x + b) ∙ i ≤ e ∙ i ∧ e ∙ i ≤ (x + d) ∙ i ∨ (x + d) ∙ i ≤ e ∙ i ∧ e ∙ i ≤ (x + b) ∙ i" hence"e - x ∈ X" by (intro mem_is_intervalI[OF assms ‹b ∈ X›‹d ∈ X›, of "e - x"])
(auto simp: algebra_simps) thus"e ∈ (+) x ` X"by force qed
lemma is_interval_uminusI: assumes"is_interval X" shows"is_interval (uminus ` X)" unfolding is_interval_def proof safe fix b d e assume"b ∈ X""d ∈ X" "∀i∈Basis. (- b) ∙ i ≤ e ∙ i ∧ e ∙ i ≤ (- d) ∙ i ∨ (- d) ∙ i ≤ e ∙ i ∧ e ∙ i ≤ (- b) ∙ i" hence"- e ∈ X" by (smt (verit, ccfv_threshold) assms inner_minus_left mem_is_intervalI) thus"e ∈ uminus ` X"by force qed
lemma is_interval_uminus[simp]: "is_interval (uminus ` x) = is_interval x" using is_interval_uminusI[of x] is_interval_uminusI[of "uminus ` x"] by (auto simp: image_image)
lemma is_interval_neg_translationI: assumes"is_interval X" shows"is_interval ((-) x ` X)" proof - have"(-) x ` X = (+) x ` uminus ` X" by (force simp: algebra_simps) alsohave"is_interval …" by (metis is_interval_uminusI is_interval_translationI assms) finallyshow ?thesis . qed
lemma is_interval_translation[simp]: "is_interval ((+) x ` X) = is_interval X" using is_interval_neg_translationI[of "(+) x ` X" x] by (auto intro!: is_interval_translationI simp: image_image)
lemma is_interval_minus_translation[simp]: shows"is_interval ((-) x ` X) = is_interval X" proof - have"(-) x ` X = (+) x ` uminus ` X" by (force simp: algebra_simps) alsohave"is_interval … = is_interval X" by simp finallyshow ?thesis . qed
lemma is_interval_minus_translation'[simp]: shows"is_interval ((λx. x - c) ` X) = is_interval X" using is_interval_translation[of "-c" X] by (metis image_cong uminus_add_conv_diff)
lemma is_interval_cball_1[intro, simp]: "is_interval (cball a b)"for a b::real by (simp add: cball_eq_atLeastAtMost is_interval_def)
lemma is_interval_ball_real: "is_interval (ball a b)"for a b::real by (simp add: ball_eq_greaterThanLessThan is_interval_def)
subsection🍋‹tag unimportant›‹Bounded Projections›
lemma bounded_inner_imp_bdd_above: assumes"bounded s" shows"bdd_above ((λx. x ∙ a) ` s)" by (simp add: assms bounded_imp_bdd_above bounded_linear_image bounded_linear_inner_left)
lemma bounded_inner_imp_bdd_below: assumes"bounded s" shows"bdd_below ((λx. x ∙ a) ` s)" by (simp add: assms bounded_imp_bdd_below bounded_linear_image bounded_linear_inner_left)
subsection🍋‹tag unimportant›‹Structural rules for pointwise continuity›
lemma continuous_infnorm[continuous_intros]: "continuous F f ==> continuous F (λx. infnorm (f x))" unfolding continuous_def by (rule tendsto_infnorm)
lemma continuous_inner[continuous_intros]: assumes"continuous F f" and"continuous F g" shows"continuous F (λx. inner (f x) (g x))" using assms unfolding continuous_def by (rule tendsto_inner)
subsection🍋‹tag unimportant›‹Structural rules for setwise continuity›
lemma continuous_on_infnorm[continuous_intros]: "continuous_on s f ==> continuous_on s (λx. infnorm (f x))" unfolding continuous_on by (fast intro: tendsto_infnorm)
lemma continuous_on_inner[continuous_intros]: fixes g :: "'a::topological_space ==> 'b::real_inner" assumes"continuous_on s f" and"continuous_on s g" shows"continuous_on s (λx. inner (f x) (g x))" using bounded_bilinear_inner assms by (rule bounded_bilinear.continuous_on)
subsection🍋‹tag unimportant›‹Openness of halfspaces.›
lemma open_halfspace_lt: "open {x. inner a x < b}" by (simp add: open_Collect_less continuous_on_inner)
lemma open_halfspace_gt: "open {x. inner a x > b}" by (simp add: open_Collect_less continuous_on_inner)
lemma eucl_less_eq_halfspaces: fixes a :: "'a::euclidean_space" shows"{x. x ∩i∈Basis. {x. x ∙ i < a ∙ i})" "{x. a ∩i∈Basis. {x. a ∙ i < x ∙ i})" by (auto simp: eucl_less_def)
lemma open_Collect_eucl_less[simp, intro]: fixes a :: "'a::euclidean_space" shows"open {x. x "open {x. a by (auto simp: eucl_less_eq_halfspaces open_halfspace_component_lt open_halfspace_component_gt)
subsection🍋‹tag unimportant›‹Closure and Interior of halfspaces and hyperplanes›
lemma closed_interval_left: fixes b :: "'a::euclidean_space" shows"closed {x::'a. ∀i∈Basis. x∙i ≤ b∙i}" by (simp add: Collect_ball_eq closed_INT closed_Collect_le continuous_on_inner)
lemma closed_interval_right: fixes a :: "'a::euclidean_space" shows"closed {x::'a. ∀i∈Basis. a∙i ≤ x∙i}" by (simp add: Collect_ball_eq closed_INT closed_Collect_le continuous_on_inner)
lemma interior_halfspace_le [simp]: assumes"a ≠ 0" shows"interior {x. a ∙ x ≤ b} = {x. a ∙ x < b}" proof - have *: "a ∙ x < b"if x: "x ∈ S"and S: "S ⊆ {x. a ∙ x ≤ b}"and"open S"for S x proof - obtain e where"e>0"and e: "cball x e ⊆ S" using‹open S› open_contains_cball x by blast thenhave"x + (e / norm a) *🪙R a ∈ cball x e" by (simp add: dist_norm) thenhave"x + (e / norm a) *🪙R a ∈ S" using e by blast thenhave"x + (e / norm a) *🪙R a ∈ {x. a ∙ x ≤ b}" using S by blast moreoverhave"e * (a ∙ a) / norm a > 0" by (simp add: ‹0 🚫› assms) ultimatelyshow ?thesis by (simp add: algebra_simps) qed show ?thesis by (rule interior_unique) (auto simp: open_halfspace_lt *) qed
lemma interior_halfspace_ge [simp]: "a ≠ 0 ==> interior {x. a ∙ x ≥ b} = {x. a ∙ x > b}" using interior_halfspace_le [of "-a""-b"] by simp
lemma closure_halfspace_lt [simp]: assumes"a ≠ 0" shows"closure {x. a ∙ x < b} = {x. a ∙ x ≤ b}" proof - have [simp]: "-{x. a ∙ x < b} = {x. a ∙ x ≥ b}" by force thenshow ?thesis using interior_halfspace_ge [of a b] assms by (force simp: closure_interior) qed
lemma closure_halfspace_gt [simp]: "a ≠ 0 ==> closure {x. a ∙ x > b} = {x. a ∙ x ≥ b}" using closure_halfspace_lt [of "-a""-b"] by simp
lemma interior_hyperplane [simp]: assumes"a ≠ 0" shows"interior {x. a ∙ x = b} = {}" proof - have [simp]: "{x. a ∙ x = b} = {x. a ∙ x ≤ b} ∩ {x. a ∙ x ≥ b}" by force thenshow ?thesis by (auto simp: assms) qed
lemma frontier_halfspace_le: assumes"a ≠ 0 ∨ b ≠ 0" shows"frontier {x. a ∙ x ≤ b} = {x. a ∙ x = b}" proof (cases "a = 0") case True with assms show ?thesis by simp next case False thenshow ?thesis by (force simp: frontier_def closed_halfspace_le) qed
lemma frontier_halfspace_ge: assumes"a ≠ 0 ∨ b ≠ 0" shows"frontier {x. a ∙ x ≥ b} = {x. a ∙ x = b}" proof (cases "a = 0") case True with assms show ?thesis by simp next case False thenshow ?thesis by (force simp: frontier_def closed_halfspace_ge) qed
lemma frontier_halfspace_lt: assumes"a ≠ 0 ∨ b ≠ 0" shows"frontier {x. a ∙ x < b} = {x. a ∙ x = b}" proof (cases "a = 0") case True with assms show ?thesis by simp next case False thenshow ?thesis by (force simp: frontier_def interior_open open_halfspace_lt) qed
lemma frontier_halfspace_gt: assumes"a ≠ 0 ∨ b ≠ 0" shows"frontier {x. a ∙ x > b} = {x. a ∙ x = b}" proof (cases "a = 0") case True with assms show ?thesis by simp next case False thenshow ?thesis by (force simp: frontier_def interior_open open_halfspace_gt) qed
subsection🍋‹tag unimportant›\<open>Some more convenient intermediate-value theorem formulations›
lemma connected_ivt_hyperplane: assumes"connected S"and xy: "x ∈ S""y ∈ S"and b: "inner a x ≤ b""b ≤ inner a y" shows"∃z ∈ S. inner a z = b" proof (rule ccontr) assume as:"¬ (∃z∈S. inner a z = b)" let ?A = "{x. inner a x < b}" let ?B = "{x. inner a x > b}" have"open ?A""open ?B" using open_halfspace_lt and open_halfspace_gt by auto moreoverhave"?A ∩ ?B = {}"by auto moreoverhave"S ⊆ ?A ∪ ?B"using as by auto ultimatelyshow False using‹connected S›unfolding connected_def by (smt (verit, del_insts) as b disjoint_iff empty_iff mem_Collect_eq xy) qed
lemma connected_ivt_component: fixes x::"'a::euclidean_space" shows"connected S ==> x ∈ S ==> y ∈ S ==> x∙k ≤ a ==> a ≤ y∙k ==> (∃z∈S. z∙k = a)" using connected_ivt_hyperplane[of S x y "k::'a" a] by (auto simp: inner_commute)
lemma Lim_component_eq: fixes f :: "'a ==> 'b::euclidean_space" assumes net: "(f ---> l) net""¬ trivial_limit net" and ev:"eventually (λx. f(x)∙i = b) net" shows"l∙i = b" using ev[unfolded order_eq_iff eventually_conj_iff] using Lim_component_ge[OF net, of b i] using Lim_component_le[OF net, of i b] by auto
lemma open_box[intro]: "open (box a b)" proof - have"open (∩i∈Basis. ((∙) i) -` {a ∙ i <..< b ∙ i})" by (auto intro!: continuous_open_vimage continuous_inner continuous_ident continuous_const) alsohave"(∩i∈Basis. ((∙) i) -` {a ∙ i <..< b ∙ i}) = box a b" by (auto simp: box_def inner_commute) finallyshow ?thesis . qed
lemma closed_cbox[intro]: fixes a b :: "'a::euclidean_space" shows"closed (cbox a b)" proof - have"closed (∩i∈Basis. (λx. x∙i) -` {a∙i .. b∙i})" by (intro closed_INT ballI continuous_closed_vimage allI
linear_continuous_at closed_real_atLeastAtMost finite_Basis bounded_linear_inner_left) alsohave"(∩i∈Basis. (λx. x∙i) -` {a∙i .. b∙i}) = cbox a b" by (auto simp: cbox_def) finallyshow"closed (cbox a b)" . qed
lemma interior_cbox [simp]: fixes a b :: "'a::euclidean_space" shows"interior (cbox a b) = box a b" (is"?L = ?R") proof(rule subset_antisym) show"?R ⊆ ?L" using box_subset_cbox open_box by (rule interior_maximal)
{ fix x assume"x ∈ interior (cbox a b)" thenobtain s where s: "open s""x ∈ s""s ⊆ cbox a b" .. thenobtain e where"e>0"and e:"∀x'. dist x' x < e ⟶ x' ∈ cbox a b" unfolding open_dist and subset_eq by auto
{ fix i :: 'a assume i: "i ∈ Basis" have"dist (x - (e / 2) *🪙R i) x < e" and"dist (x + (e / 2) *🪙R i) x < e" using norm_Basis[OF i] ‹e>0›by (auto simp: dist_norm) thenhave"a ∙ i ≤ (x - (e / 2) *🪙R i) ∙ i"and"(x + (e / 2) *🪙R i) ∙ i ≤ b ∙ i" using e[THEN spec[where x="x - (e/2) *🪙R i"]] and e[THEN spec[where x="x + (e/2) *🪙R i"]] unfolding mem_box using i by blast+ thenhave"a ∙ i < x ∙ i"and"x ∙ i < b ∙ i" using‹e>0› i by (auto simp: inner_diff_left inner_Basis inner_add_left)
} thenhave"x ∈ box a b" unfolding mem_box by auto
} thenshow"?L ⊆ ?R" .. qed
lemma bounded_cbox [simp]: fixes a :: "'a::euclidean_space" shows"bounded (cbox a b)" proof - let ?b = "∑i∈Basis. ∣a∙i∣ + ∣b∙i∣"
{ fix x :: "'a" assume"∧i. i∈Basis ==> a ∙ i ≤ x ∙ i ∧ x ∙ i ≤ b ∙ i" thenhave"(∑i∈Basis. ∣x ∙ i∣) ≤ ?b" by (force simp: intro!: sum_mono) thenhave"norm x ≤ ?b" using norm_le_l1[of x] by auto
} thenshow ?thesis unfolding cbox_def bounded_iff by force qed
lemma bounded_box [simp]: fixes a :: "'a::euclidean_space" shows"bounded (box a b)" by (metis bounded_cbox bounded_interior interior_cbox)
lemma not_interval_UNIV [simp]: fixes a :: "'a::euclidean_space" shows"cbox a b ≠ UNIV""box a b ≠ UNIV" using bounded_box[of a b] bounded_cbox[of a b] by force+
lemma not_interval_UNIV2 [simp]: fixes a :: "'a::euclidean_space" shows"UNIV ≠ cbox a b""UNIV ≠ box a b" using bounded_box[of a b] bounded_cbox[of a b] by force+
lemma box_midpoint: fixes a :: "'a::euclidean_space" assumes"box a b ≠ {}" shows"((1/2) *🪙R (a + b)) ∈ box a b" proof - have"a ∙ i < ((1 / 2) *🪙R (a + b)) ∙ i ∧ ((1 / 2) *🪙R (a + b)) ∙ i < b ∙ i"if"i ∈ Basis"for i using assms that by (auto simp: inner_add_left box_ne_empty) thenshow ?thesis unfolding mem_box by auto qed
lemma open_cbox_convex: fixes x :: "'a::euclidean_space" assumes x: "x ∈ box a b" and y: "y ∈ cbox a b" and e: "0 < e""e ≤ 1" shows"(e *🪙R x + (1 - e) *🪙R y) ∈ box a b" proof -
{ fix i :: 'a assume i: "i ∈ Basis" have"a ∙ i = e * (a ∙ i) + (1 - e) * (a ∙ i)" unfolding left_diff_distrib by simp alsohave"… < e * (x ∙ i) + (1 - e) * (y ∙ i)" by (smt (verit, best) e i mem_box mult_le_cancel_left_pos mult_left_mono x y) finallyhave"a ∙ i < (e *🪙R x + (1 - e) *🪙R y) ∙ i" unfolding inner_simps by auto moreover
{ have"b ∙ i = e * (b∙i) + (1 - e) * (b∙i)" unfolding left_diff_distrib by simp alsohave"… > e * (x ∙ i) + (1 - e) * (y ∙ i)" by (smt (verit, best) e i mem_box mult_le_cancel_left_pos mult_left_mono x y) finallyhave"(e *🪙R x + (1 - e) *🪙R y) ∙ i < b ∙ i" unfolding inner_simps by auto
} ultimatelyhave"a ∙ i < (e *🪙R x + (1 - e) *🪙R y) ∙ i ∧ (e *🪙R x + (1 - e) *🪙R y) ∙ i < b ∙ i" by auto
} thenshow ?thesis unfolding mem_box by auto qed
lemma closure_cbox [simp]: "closure (cbox a b) = cbox a b" by (simp add: closed_cbox)
lemma closure_box [simp]: fixes a :: "'a::euclidean_space" assumes"box a b ≠ {}" shows"closure (box a b) = cbox a b" proof - have ab: "a using assms by (simp add: eucl_less_def box_ne_empty) let ?c = "(1 / 2) *🪙R (a + b)"
{ fix x assume as: "x ∈ cbox a b"
define f where [abs_def]: "f n = x + (inverse (real n + 1)) *🪙R (?c - x)"for n
{ fix n assume fn: "f n ⟶ a ⟶ f n = x"and xc: "x ≠ ?c" have *: "0 < inverse (real n + 1)""inverse (real n + 1) ≤ 1" unfolding inverse_le_1_iff by auto have"(inverse (real n + 1)) *🪙R ((1 / 2) *🪙R (a + b)) + (1 - inverse (real n + 1)) *🪙R x = x + (inverse (real n + 1)) *🪙R (((1 / 2) *🪙R (a + b)) - x)" by (auto simp: algebra_simps) thenhave"f n and"a using open_cbox_convex[OF box_midpoint[OF assms] as *] unfolding f_def by (auto simp: box_def eucl_less_def) thenhave False using fn unfolding f_def using xc by auto
} moreover
{ have"∃N::nat. ∀n≥N. inverse (real n + 1) < ε"if"ε > 0"for ε using reals_Archimedean [of ε] that by (metis inverse_inverse_eq inverse_less_imp_less nat_le_real_less order_less_trans
reals_Archimedean2) thenhave"(λn. inverse (real n + 1)) <---- 0" unfolding lim_sequentially by(auto simp: dist_norm) thenhave"f <---- x" unfolding f_def using tendsto_add[OF tendsto_const, of "λn. (inverse (real n + 1)) *🪙R ((1 / 2) *🪙R (a + b) - x)" 0 sequentially x] using tendsto_scaleR [OF _ tendsto_const, of "λn. inverse (real n + 1)" 0 sequentially "((1 / 2) *🪙R (a + b) - x)"] by auto
} ultimatelyhave"x ∈ closure (box a b)" using as box_midpoint[OF assms] unfolding closure_def islimpt_sequential by (cases "x=?c") (auto simp: in_box_eucl_less)
} thenshow ?thesis using closure_minimal[OF box_subset_cbox, of a b] by blast qed
lemma bounded_subset_box_symmetric: fixes S :: "('a::euclidean_space) set" assumes"bounded S" obtains a where"S ⊆ box (-a) a" proof - obtain b where"b>0"and b: "∀x∈S. norm x ≤ b" using assms[unfolded bounded_pos] by auto
define a :: 'a where"a = (∑i∈Basis. (b + 1) *🪙R i)" have"(-a)∙i < x∙i"and"x∙i < a∙i"if"x ∈ S"and i: "i ∈ Basis"for x i using b Basis_le_norm[OF i, of x] that by (auto simp: a_def) thenhave"S ⊆ box (-a) a" by (auto simp: simp add: box_def) thenshow ?thesis .. qed
lemma bounded_subset_cbox_symmetric: fixes S :: "('a::euclidean_space) set" assumes"bounded S" obtains a where"S ⊆ cbox (-a) a" by (meson assms bounded_subset_box_symmetric box_subset_cbox order.trans)
lemma frontier_cbox: fixes a b :: "'a::euclidean_space" shows"frontier (cbox a b) = cbox a b - box a b" unfolding frontier_def unfolding interior_cbox and closure_closed[OF closed_cbox] ..
lemma frontier_box: fixes a b :: "'a::euclidean_space" shows"frontier (box a b) = (if box a b = {} then {} else cbox a b - box a b)" by (simp add: frontier_def interior_open open_box)
lemma Int_interval_mixed_eq_empty: fixes a :: "'a::euclidean_space" assumes"box c d ≠ {}" shows"box a b ∩ cbox c d = {} ⟷ box a b ∩ box c d = {}" unfolding closure_box[OF assms, symmetric] unfolding open_Int_closure_eq_empty[OF open_box] ..
subsection‹Class Instances›
lemma compact_lemma: fixes f :: "nat ==> 'a::euclidean_space" assumes"bounded (range f)" shows"∀d⊆Basis. ∃l::'a. ∃ r. strict_mono r ∧ (∀e>0. eventually (λn. ∀i∈d. dist (f (r n) ∙ i) (l ∙ i) < e) sequentially)" by (rule compact_lemma_general[where unproj="λe. ∑i∈Basis. e i *🪙R i"])
(auto intro!: assms bounded_linear_inner_left bounded_linear_image
simp: euclidean_representation)
instance🍋‹tag important› euclidean_space ⊆ heine_borel proof fix f :: "nat ==> 'a" assume f: "bounded (range f)" thenobtain l::'a and r where r: "strict_mono r" and l: "∀e>0. eventually (λn. ∀i∈Basis. dist (f (r n) ∙ i) (l ∙ i) < e) sequentially" using compact_lemma [OF f] by blast
{ fix e::real assume"e > 0" hence"e / real_of_nat DIM('a) > 0"by (simp) with l have"eventually (λn. ∀i∈Basis. dist (f (r n) ∙ i) (l ∙ i) < e / (real_of_nat DIM('a))) sequentially" by simp moreover
{ fix n assume n: "∀i∈Basis. dist (f (r n) ∙ i) (l ∙ i) < e / (real_of_nat DIM('a))" have"dist (f (r n)) l ≤ (∑i∈Basis. dist (f (r n) ∙ i) (l ∙ i))" using L2_set_le_sum [OF zero_le_dist] by (subst euclidean_dist_l2) alsohave"… < (∑i∈(Basis::'a set). e / (real_of_nat DIM('a)))" by (meson eucl.finite_Basis n nonempty_Basis sum_strict_mono) finallyhave"dist (f (r n)) l < e" by auto
} ultimatelyhave"∀🪙F n in sequentially. dist (f (r n)) l < e" by (rule eventually_mono)
} thenhave *: "(f ∘ r) <---- l" unfolding o_def tendsto_iff by simp with r show"∃l r. strict_mono r ∧ (f ∘ r) <---- l" by auto qed
instance euclidean_space ⊆ second_countable_topology proof
define a where"a f = (∑i∈Basis. fst (f i) *🪙R i)"for f :: "'a ==> real × real" thenhave a: "∧f. (∑i∈Basis. fst (f i) *🪙R i) = a f" by simp
define b where"b f = (∑i∈Basis. snd (f i) *🪙R i)"for f :: "'a ==> real × real" thenhave b: "∧f. (∑i∈Basis. snd (f i) *🪙R i) = b f" by simp
define B where"B = (λf. box (a f) (b f)) ` (Basis →🪙E (ℚ×ℚ))"
have"Ball B open"by (simp add: B_def open_box) moreoverhave"(∀A. open A ⟶ (∃B'⊆B. ∪B' = A))" proof safe fix A::"'a set" assume"open A" show"∃B'⊆B. ∪B' = A" using open_UNION_box[OF ‹open A›] by (smt (verit, ccfv_threshold) B_def a b image_iff mem_Collect_eq subsetI) qed ultimately have"topological_basis B" unfolding topological_basis_def by blast moreover have"countable B" unfolding B_def by (intro countable_image countable_PiE finite_Basis countable_SIGMA countable_rat) ultimatelyshow"∃B::'a set set. countable B ∧ open = generate_topology B" by (blast intro: topological_basis_imp_subbasis) qed
instance euclidean_space ⊆ polish_space ..
subsection‹Compact Boxes›
lemma compact_cbox [simp]: fixes a :: "'a::euclidean_space" shows"compact (cbox a b)" using bounded_closed_imp_seq_compact[of "cbox a b"] using bounded_cbox[of a b] by (auto simp: compact_eq_seq_compact_metric)
proposition is_interval_compact: "is_interval S ∧ compact S ⟷ (∃a b. S = cbox a b)" (is"?lhs = ?rhs") proof (cases "S = {}") case True with empty_as_interval show ?thesis by auto next case False show ?thesis proof assume L: ?lhs thenhave"is_interval S""compact S"by auto
define a where"a ≡∑i∈Basis. (INF x∈S. x ∙ i) *🪙R i"
define b where"b ≡∑i∈Basis. (SUP x∈S. x ∙ i) *🪙R i" have 1: "∧x i. [x ∈ S; i ∈ Basis]==> (INF x∈S. x ∙ i) ≤ x ∙ i" by (simp add: cInf_lower bounded_inner_imp_bdd_below compact_imp_bounded L) have 2: "∧x i. [x ∈ S; i ∈ Basis]==> x ∙ i ≤ (SUP x∈S. x ∙ i)" by (simp add: cSup_upper bounded_inner_imp_bdd_above compact_imp_bounded L) have 3: "x ∈ S"if inf: "∧i. i ∈ Basis ==> (INF x∈S. x ∙ i) ≤ x ∙ i" and sup: "∧i. i ∈ Basis ==> x ∙ i ≤ (SUP x∈S. x ∙ i)"for x proof (rule mem_box_componentwiseI [OF ‹is_interval S›]) fix i::'a assume i: "i ∈ Basis" have cont: "continuous_on S (λx. x ∙ i)" by (intro continuous_intros) obtain a where"a ∈ S"and a: "∧y. y∈S ==> a ∙ i ≤ y ∙ i" using continuous_attains_inf [OF ‹compact S› False cont] by blast obtain b where"b ∈ S"and b: "∧y. y∈S ==> y ∙ i ≤ b ∙ i" using continuous_attains_sup [OF ‹compact S› False cont] by blast have"a ∙ i ≤ (INF x∈S. x ∙ i)" by (simp add: False a cINF_greatest) alsohave"…≤ x ∙ i" by (simp add: i inf) finallyhave ai: "a ∙ i ≤ x ∙ i" . have"x ∙ i ≤ (SUP x∈S. x ∙ i)" by (simp add: i sup) alsohave"(SUP x∈S. x ∙ i) ≤ b ∙ i" by (simp add: False b cSUP_least) finallyhave bi: "x ∙ i ≤ b ∙ i" . show"x ∙ i ∈ (λx. x ∙ i) ` S" apply (rule_tac x="∑j∈Basis. (((∙)a)(i := x ∙ j))j *🪙R j"in image_eqI) apply (simp add: i) apply (rule mem_is_intervalI [OF ‹is_interval S›‹a ∈ S›‹b ∈ S›]) using i ai bi apply force done qed have"S = cbox a b" by (auto simp: a_def b_def mem_box intro: 1 2 3) thenshow ?rhs by blast next assume R: ?rhs thenshow ?lhs using compact_cbox is_interval_cbox by blast qed qed
subsection🍋‹tag unimportant›\<open>Componentwise limits and continuity›
text‹But is the premise really necessary? Need to generalise @{thm euclidean_dist_l2}› lemma Euclidean_dist_upper: "i ∈ Basis ==> dist (x ∙ i) (y ∙ i) ≤ dist x y" by (metis (no_types) member_le_L2_set euclidean_dist_l2 finite_Basis)
text‹But is the premise 🍋‹i ∈ Basis› really necessary?› lemma open_preimage_inner: assumes"open S""i ∈ Basis" shows"open {x. x ∙ i ∈ S}" proof (rule openI, simp) fix x assume x: "x ∙ i ∈ S" with assms obtain e where"0 < e"and e: "ball (x ∙ i) e ⊆ S" by (auto simp: open_contains_ball_eq) have"∃e>0. ball (y ∙ i) e ⊆ S"if dxy: "dist x y < e / 2"for y proof (intro exI conjI) have"dist (x ∙ i) (y ∙ i) < e / 2" by (meson ‹i ∈ Basis› dual_order.trans Euclidean_dist_upper not_le that) thenhave"dist (x ∙ i) z < e"if"dist (y ∙ i) z < e / 2"for z by (metis dist_commute dist_triangle_half_l that) thenhave"ball (y ∙ i) (e / 2) ⊆ ball (x ∙ i) e" using mem_ball by blast with e show"ball (y ∙ i) (e / 2) ⊆ S" by (metis order_trans) qed (simp add: ‹0 🚫›) thenshow"∃e>0. ball x e ⊆ {s. s ∙ i ∈ S}" by (metis (no_types, lifting) ‹0 🚫›‹open S› half_gt_zero_iff mem_Collect_eq mem_ball open_contains_ball_eq subsetI) qed
proposition tendsto_componentwise_iff: fixes f :: "_ ==> 'b::euclidean_space" shows"(f ---> l) F ⟷ (∀i ∈ Basis. ((λx. (f x ∙ i)) ---> (l ∙ i)) F)"
(is"?lhs = ?rhs") proof assume ?lhs thenshow ?rhs unfolding tendsto_def by (smt (verit) eventually_elim2 mem_Collect_eq open_preimage_inner) next assume R: ?rhs thenhave"∧e. e > 0 ==>∀i∈Basis. ∀🪙F x in F. dist (f x ∙ i) (l ∙ i) < e" unfolding tendsto_iff by blast thenhave R': "∧e. e > 0 ==>∀🪙F x in F. ∀i∈Basis. dist (f x ∙ i) (l ∙ i) < e" by (simp add: eventually_ball_finite_distrib [symmetric]) show ?lhs unfolding tendsto_iff proof clarify fix e::real assume"0 < e" have *: "L2_set (λi. dist (f x ∙ i) (l ∙ i)) Basis < e" if"∀i∈Basis. dist (f x ∙ i) (l ∙ i) < e / real DIM('b)"for x proof - have"L2_set (λi. dist (f x ∙ i) (l ∙ i)) Basis ≤ sum (λi. dist (f x ∙ i) (l ∙ i)) Basis" by (simp add: L2_set_le_sum) alsohave"... < DIM('b) * (e / real DIM('b))" by (meson DIM_positive sum_bounded_above_strict that) alsohave"... = e" by (simp add: field_simps) finallyshow"L2_set (λi. dist (f x ∙ i) (l ∙ i)) Basis < e" . qed have"∀🪙F x in F. ∀i∈Basis. dist (f x ∙ i) (l ∙ i) < e / DIM('b)" by (simp add: R' ‹0 🚫›) thenshow"∀🪙F x in F. dist (f x) l < e" by eventually_elim (metis (full_types) "*" euclidean_dist_l2) qed qed
corollary continuous_componentwise: "continuous F f ⟷ (∀i ∈ Basis. continuous F (λx. (f x ∙ i)))" by (simp add: continuous_def tendsto_componentwise_iff [symmetric])
corollary continuous_on_componentwise: fixes S :: "'a :: t2_space set" shows"continuous_on S f ⟷ (∀i ∈ Basis. continuous_on S (λx. (f x ∙ i)))" by (metis continuous_componentwise continuous_on_eq_continuous_within)
lemma linear_componentwise_iff: "linear f' ⟷ (∀i∈Basis. linear (λx. f' x ∙ i))" (is"?lhs ⟷ ?rhs") proof show"?lhs ==> ?rhs" by (simp add: Real_Vector_Spaces.linear_iff inner_left_distrib) show"?rhs ==> ?lhs" by (simp add: linear_iff) (metis euclidean_eqI inner_left_distrib inner_scaleR_left) qed
lemma bounded_linear_componentwise_iff: "(bounded_linear f') ⟷ (∀i∈Basis. bounded_linear (λx. f' x ∙ i))"
(is"?lhs = ?rhs") proof assume ?rhs thenhave"(∀i∈Basis. ∃K. ∀x. ∣f' x ∙ i∣≤ norm x * K)""linear f'" by (auto simp: bounded_linear_def bounded_linear_axioms_def linear_componentwise_iff [symmetric] ball_conj_distrib) thenobtain F where F: "∧i x. i ∈ Basis ==>∣f' x ∙ i∣≤ norm x * F i" by metis have"norm (f' x) ≤ norm x * sum F Basis"for x proof - have"norm (f' x) ≤ (∑i∈Basis. ∣f' x ∙ i∣)" by (rule norm_le_l1) alsohave"... ≤ (∑i∈Basis. norm x * F i)" by (metis F sum_mono) alsohave"... = norm x * sum F Basis" by (simp add: sum_distrib_left) finallyshow ?thesis . qed thenshow ?lhs by (force simp: bounded_linear_def bounded_linear_axioms_def ‹linear f'›) qed (simp add: bounded_linear_inner_left_comp)
definition clamp :: "'a::euclidean_space ==> 'a ==> 'a ==> 'a"where "clamp a b x = (if (∀i∈Basis. a ∙ i ≤ b ∙ i) then (∑i∈Basis. (if x∙i < a∙i then a∙i else if x∙i ≤ b∙i then x∙i else b∙i) *🪙R i) else a)"
lemma clamp_in_interval[simp]: assumes"∧i. i ∈ Basis ==> a ∙ i ≤ b ∙ i" shows"clamp a b x ∈ cbox a b" unfolding clamp_def using box_ne_empty(1)[of a b] assms by (auto simp: cbox_def)
lemma clamp_cancel_cbox[simp]: fixes x a b :: "'a::euclidean_space" assumes x: "x ∈ cbox a b" shows"clamp a b x = x" using assms by (auto simp: clamp_def mem_box intro!: euclidean_eqI[where 'a='a])
lemma clamp_empty_interval: assumes"i ∈ Basis""a ∙ i > b ∙ i" shows"clamp a b = (λ_. a)" using assms by (force simp: clamp_def[abs_def] split: if_splits intro!: ext)
lemma dist_clamps_le_dist_args: fixes x :: "'a::euclidean_space" shows"dist (clamp a b y) (clamp a b x) ≤ dist y x" proof cases assume le: "(∀i∈Basis. a ∙ i ≤ b ∙ i)" thenhave"(∑i∈Basis. (dist (clamp a b y ∙ i) (clamp a b x ∙ i))🪙2) ≤ (∑i∈Basis. (dist (y ∙ i) (x ∙ i))🪙2)" by (auto intro!: sum_mono simp: clamp_def dist_real_def abs_le_square_iff[symmetric]) thenshow ?thesis by (auto intro: real_sqrt_le_mono
simp: euclidean_dist_l2[where y=x] euclidean_dist_l2[where y="clamp a b x"] L2_set_def) qed (auto simp: clamp_def)
lemma clamp_continuous_at: fixes f :: "'a::euclidean_space ==> 'b::metric_space" and x :: 'a assumes f_cont: "continuous_on (cbox a b) f" shows"continuous (at x) (λx. f (clamp a b x))" proof cases assume le: "(∀i∈Basis. a ∙ i ≤ b ∙ i)" show ?thesis unfolding continuous_at_eps_delta proof safe fix x :: 'a fix e :: real assume"e > 0" moreoverhave"clamp a b x ∈ cbox a b" by (simp add: le) moreovernote f_cont[simplified continuous_on_iff] ultimately obtain d where d: "0 < d" "∧x'. x' ∈ cbox a b ==> dist x' (clamp a b x) < d ==> dist (f x') (f (clamp a b x)) < e" by force show"∃d>0. ∀x'. dist x' x < d ⟶ dist (f (clamp a b x')) (f (clamp a b x)) < e" using le by (auto intro!: d clamp_in_interval dist_clamps_le_dist_args[THEN le_less_trans]) qed qed (auto simp: clamp_empty_interval)
lemma clamp_continuous_on: fixes f :: "'a::euclidean_space ==> 'b::metric_space" assumes f_cont: "continuous_on (cbox a b) f" shows"continuous_on S (λx. f (clamp a b x))" using assms by (auto intro: continuous_at_imp_continuous_on clamp_continuous_at)
lemma clamp_bounded: fixes f :: "'a::euclidean_space ==> 'b::metric_space" assumes bounded: "bounded (f ` (cbox a b))" shows"bounded (range (λx. f (clamp a b x)))" proof cases assume le: "(∀i∈Basis. a ∙ i ≤ b ∙ i)" from bounded obtain c where f_bound: "∀x∈f ` cbox a b. dist undefined x ≤ c" by (auto simp: bounded_any_center[where a=undefined]) thenshow ?thesis by (metis bounded bounded_subset clamp_in_interval image_mono image_subsetI le range_composition) qed (auto simp: clamp_empty_interval image_def)
definition ext_cont :: "('a::euclidean_space ==> 'b::metric_space) ==> 'a ==> 'a ==> 'a ==> 'b" where"ext_cont f a b = (λx. f (clamp a b x))"
lemma ext_cont_cancel_cbox[simp]: fixes x a b :: "'a::euclidean_space" assumes x: "x ∈ cbox a b" shows"ext_cont f a b x = f x" using assms by (simp add: ext_cont_def)
lemma continuous_on_ext_cont[continuous_intros]: "continuous_on (cbox a b) f ==> continuous_on S (ext_cont f a b)" by (auto intro!: clamp_continuous_on simp: ext_cont_def)
subsection‹Separability›
lemma univ_second_countable_sequence: obtains B :: "nat ==> 'a::euclidean_space set" where"inj B""∧n. open(B n)""∧S. open S ==>∃k. S = ∪{B n |n. n ∈ k}" proof - obtainB :: "'a set set" where"countable B" and opn: "∧C. C ∈B==> open C" and Un: "∧S. open S ==>∃U. U ⊆B∧ S = ∪U" using univ_second_countable by blast have *: "infinite (range (λn. ball (0::'a) (inverse(Suc n))))" by (simp add: inj_on_def ball_eq_ball_iff Infinite_Set.range_inj_infinite) have"infinite B" proof assume"finite B" thenhave"finite (Union ` (Pow B))" by simp moreoverhave"range (λn. ball 0 (inverse (real (Suc n)))) ⊆∪ ` Pow B" by (metis (no_types, lifting) PowI image_eqI image_subset_iff Un [OF open_ball]) ultimatelyshow False by (metis finite_subset *) qed obtain f :: "nat ==> 'a set"where"B = range f""inj f" by (blast intro: countable_as_injective_image [OF ‹countable B›‹infinite B›]) have *: "∃k. S = ∪{f n |n. n ∈ k}"if"open S"for S using Un [OF that] apply clarify apply (rule_tac x="f-`U"in exI) using‹inj f›‹B = range f›apply force done show ?thesis using"*"‹B = range f›‹inj f› opn that by force qed
proposition separable: fixes S :: "'a::{metric_space, second_countable_topology} set" obtains T where"countable T""T ⊆ S""S ⊆ closure T" proof - obtainB :: "'a set set" where"countable B" and"{} ∉B" and ope: "∧C. C ∈B==> openin(top_of_set S) C" and if_ope: "∧T. openin(top_of_set S) T ==>∃U. U⊆B∧ T = ∪U" by (meson subset_second_countable) thenobtain f where f: "∧C. C ∈B==> f C ∈ C" by (metis equals0I) show ?thesis proof show"countable (f ` B)" by (simp add: ‹countable B›) show"f ` B⊆ S" using ope f openin_imp_subset by blast show"S ⊆ closure (f ` B)" proof (clarsimp simp: closure_approachable) fix x and e::real assume"x ∈ S""0 < e" have"openin (top_of_set S) (S ∩ ball x e)" by (simp add: openin_Int_open) with if_ope obtainUwhereU: "U⊆B""S ∩ ball x e = ∪U" by meson show"∃C ∈B. dist (f C) x < e" proof (cases "U = {}") case True thenshow ?thesis using‹0 🚫›U‹x ∈ S›by auto next case False thenshow ?thesis by (metis IntI Union_iff U‹0 🚫›‹x ∈ S› dist_commute dist_self f inf_le2 mem_ball subset_eq) qed qed qed qed
subsection🍋‹tag unimportant›‹Diameter›
lemma diameter_cball [simp]: fixes a :: "'a::euclidean_space" shows"diameter(cball a r) = (if r < 0 then 0 else 2*r)" proof - have"diameter(cball a r) = 2*r"if"r ≥ 0" proof (rule order_antisym) show"diameter (cball a r) ≤ 2*r" proof (rule diameter_le) fix x y assume"x ∈ cball a r""y ∈ cball a r" thenhave"norm (x - a) ≤ r""norm (a - y) ≤ r" by (auto simp: dist_norm norm_minus_commute) thenhave"norm (x - y) ≤ r+r" using norm_diff_triangle_le by blast thenshow"norm (x - y) ≤ 2*r"by simp qed (simp add: that) have"2*r = dist (a + r *🪙R (SOME i. i ∈ Basis)) (a - r *🪙R (SOME i. i ∈ Basis))" using‹0 ≤ r› that by (simp add: dist_norm flip: scaleR_2) alsohave"... ≤ diameter (cball a r)" apply (rule diameter_bounded_bound) using that by (auto simp: dist_norm) finallyshow"2*r ≤ diameter (cball a r)" . qed thenshow ?thesis by simp qed
lemma diameter_ball [simp]: fixes a :: "'a::euclidean_space" shows"diameter(ball a r) = (if r < 0 then 0 else 2*r)" proof - have"diameter(ball a r) = 2*r"if"r > 0" by (metis bounded_ball diameter_closure closure_ball diameter_cball less_eq_real_def linorder_not_less that) thenshow ?thesis by (simp add: diameter_def) qed
lemma diameter_closed_interval [simp]: "diameter {a..b} = (if b < a then 0 else b-a)" proof - have"{a..b} = cball ((a+b)/2) ((b-a)/2)" using atLeastAtMost_eq_cball by blast thenshow ?thesis by simp qed
lemma diameter_open_interval [simp]: "diameter {a<.. proof - have"{a <..< b} = ball ((a+b)/2) ((b-a)/2)" using greaterThanLessThan_eq_ball by blast thenshow ?thesis by simp qed
lemma diameter_cbox: fixes a b::"'a::euclidean_space" shows"(∀i ∈ Basis. a ∙ i ≤ b ∙ i) ==> diameter (cbox a b) = dist a b" by (force simp: diameter_def intro!: cSup_eq_maximum L2_set_mono
simp: euclidean_dist_l2[where 'a='a] cbox_def dist_norm)
subsection🍋‹tag unimportant›\<open>Relating linear images toopen/closed/interior/closure/connected›
proposition open_surjective_linear_image: fixes f :: "'a::real_normed_vector ==> 'b::euclidean_space" assumes"open A""linear f""surj f" shows"open(f ` A)" unfolding open_dist proof clarify fix x assume"x ∈ A" have"bounded (inv f ` Basis)" by (simp add: finite_imp_bounded) with bounded_pos obtain B where"B > 0"and B: "∧x. x ∈ inv f ` Basis ==> norm x ≤ B" by metis obtain e where"e > 0"and e: "∧z. dist z x < e ==> z ∈ A" by (metis open_dist ‹x ∈ A›‹open A›)
define δ where"δ ≡ e / B / DIM('b)" show"∃e>0. ∀y. dist y (f x) < e ⟶ y ∈ f ` A" proof (intro exI conjI) show"δ > 0" using‹e > 0›‹B > 0›by (simp add: δ_def field_split_simps) have"y ∈ f ` A"if"dist y (f x) * (B * real DIM('b)) < e"for y proof -
define u where"u ≡ y - f x" show ?thesis proof (rule image_eqI) show"y = f (x + (∑i∈Basis. (u ∙ i) *🪙R inv f i))" apply (simp add: linear_add linear_sum linear.scaleR ‹linear f› surj_f_inv_f ‹surj f›) apply (simp add: euclidean_representation u_def) done have"dist (x + (∑i∈Basis. (u ∙ i) *🪙R inv f i)) x ≤ (∑i∈Basis. norm ((u ∙ i) *??R inv f i))" by (simp add: dist_norm sum_norm_le) alsohave"... = (∑i∈Basis. ∣u ∙ i∣ * norm (inv f i))" by simp alsohave"... ≤ (∑i∈Basis. ∣u ∙ i∣) * B" by (simp add: B sum_distrib_right sum_mono mult_left_mono) alsohave"... ≤ DIM('b) * dist y (f x) * B" apply (rule mult_right_mono [OF sum_bounded_above]) using‹0 🚫›by (auto simp: Basis_le_norm dist_norm u_def) alsohave"... < e" by (metis mult.commute mult.left_commute that) finallyshow"x + (∑i∈Basis. (u ∙ i) *🪙R inv f i) ∈ A" by (rule e) qed qed thenshow"∀y. dist y (f x) < δ ⟶ y ∈ f ` A" using‹e > 0›‹B > 0› by (auto simp: δ_def field_split_simps) qed qed
corollary open_bijective_linear_image_eq: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes"linear f""bij f" shows"open(f ` A) ⟷ open A" proof assume"open(f ` A)" thenshow"open A" by (metis assms bij_is_inj continuous_open_vimage inj_vimage_image_eq linear_continuous_at linear_linear) next assume"open A" thenshow"open(f ` A)" by (simp add: assms bij_is_surj open_surjective_linear_image) qed
lemma connected_linear_image: fixes f :: "'a::euclidean_space ==> 'b::real_normed_vector" assumes"linear f"and"connected s" shows"connected (f ` s)" using connected_continuous_image assms linear_continuous_on linear_conv_bounded_linear by blast
subsection🍋‹tag unimportant›‹"Isometry" (up to constant bounds) of Injective Linear Map›
proposition injective_imp_isometric: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes s: "closed s""subspace s" and f: "bounded_linear f""∀x∈s. f x = 0 ⟶ x = 0" shows"∃e>0. ∀x∈s. norm (f x) ≥ e * norm x" proof (cases "s ⊆ {0::'a}") case True have"norm x ≤ norm (f x)"if"x ∈ s"for x proof - from True that have"x = 0"by auto thenshow ?thesis by simp qed thenshow ?thesis by (auto intro!: exI[where x=1]) next case False interpret f: bounded_linear f by fact from False obtain a where a: "a ≠ 0""a ∈ s" by auto from False have"s ≠ {}" by auto let ?S = "{f x| x. x ∈ s ∧ norm x = norm a}" let ?S' = "{x::'a. x∈s ∧ norm x = norm a}" let ?S'' = "{x::'a. norm x = norm a}"
have"?S'' = frontier (cball 0 (norm a))" by (simp add: sphere_def dist_norm) thenhave"compact ?S''"by (metis compact_cball compact_frontier) moreoverhave"?S' = s ∩ ?S''"by auto ultimatelyhave"compact ?S'" using closed_Int_compact[of s ?S''] using s(1) by auto moreoverhave *:"f ` ?S' = ?S"by auto ultimatelyhave"compact ?S" using compact_continuous_image[OF linear_continuous_on[OF f(1)], of ?S'] by auto thenhave"closed ?S" using compact_imp_closed by auto moreoverfrom a have"?S ≠ {}"by auto ultimatelyobtain b' where"b'∈?S""∀y∈?S. norm b' ≤ norm y" using distance_attains_inf[of ?S 0] unfolding dist_0_norm by auto thenobtain b where"b∈s" and ba: "norm b = norm a" and b: "∀x∈{x ∈ s. norm x = norm a}. norm (f b) ≤ norm (f x)" unfolding *[symmetric] unfolding image_iff by auto
let ?e = "norm (f b) / norm b" have"norm b > 0" using ba and a and norm_ge_zero by auto moreoverhave"norm (f b) > 0" using f(2)[THEN bspec[where x=b], OF ‹b∈s›] using‹norm b >0›by simp ultimatelyhave"0 < norm (f b) / norm b"by simp moreover have"norm (f b) / norm b * norm x ≤ norm (f x)"if"x∈s"for x proof (cases "x = 0") case True thenshow"norm (f b) / norm b * norm x ≤ norm (f x)" by auto next case False with‹a ≠ 0›have *: "0 < norm a / norm x" unfolding zero_less_norm_iff[symmetric] by simp have"∀x∈s. c *🪙R x ∈ s"for c using s[unfolded subspace_def] by simp with‹x ∈ s›‹x ≠ 0›have"(norm a / norm x) *🪙R x ∈ {x ∈ s. norm x = norm a}" by simp with‹x ≠ 0›‹a ≠ 0›show"norm (f b) / norm b * norm x ≤ norm (f x)" using b[THEN bspec[where x="(norm a / norm x) *🪙R x"]] unfolding f.scaleR and ba by (auto simp: mult.commute pos_le_divide_eq pos_divide_le_eq) qed ultimatelyshow ?thesis by auto qed
proposition closed_injective_image_subspace: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes"subspace s""bounded_linear f""∀x∈s. f x = 0 ⟶ x = 0""closed s" shows"closed(f ` s)" proof - obtain e where"e > 0"and e: "∀x∈s. e * norm x ≤ norm (f x)" using assms injective_imp_isometric by blast with assms show ?thesis by (meson complete_eq_closed complete_isometric_image) qed
lemma closure_bounded_linear_image_subset: assumes f: "bounded_linear f" shows"f ` closure S ⊆ closure (f ` S)" using linear_continuous_on [OF f] closed_closure closure_subset by (rule image_closure_subset)
lemma closure_linear_image_subset: fixes f :: "'m::euclidean_space ==> 'n::real_normed_vector" assumes"linear f" shows"f ` (closure S) ⊆ closure (f ` S)" using assms unfolding linear_conv_bounded_linear by (rule closure_bounded_linear_image_subset)
lemma closed_injective_linear_image: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes S: "closed S"and f: "linear f""inj f" shows"closed (f ` S)" proof - obtain g where g: "linear g""g ∘ f = id" using linear_injective_left_inverse [OF f] by blast thenhave confg: "continuous_on (range f) g" using linear_continuous_on linear_conv_bounded_linear by blast have [simp]: "g ` f ` S = S" using g by (simp add: image_comp) have cgf: "closed (g ` f ` S)" by (simp add: ‹g ∘ f = id› S image_comp) have [simp]: "(range f ∩ g -` S) = f ` S" using g unfolding o_def id_def image_def by auto metis+ show ?thesis proof (rule closedin_closed_trans [of "range f"]) show"closedin (top_of_set (range f)) (f ` S)" using continuous_closedin_preimage [OF confg cgf] by simp show"closed (range f)" using closed_injective_image_subspace f linear_conv_bounded_linear
linear_injective_0 subspace_UNIV by blast qed qed
lemma closed_injective_linear_image_eq: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes f: "linear f""inj f" shows"(closed(image f s) ⟷ closed s)" by (metis closed_injective_linear_image closure_eq closure_linear_image_subset closure_subset_eq f(1) f(2) inj_image_subset_iff)
lemma closure_injective_linear_image: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" shows"[linear f; inj f]==> f ` (closure S) = closure (f ` S)" by (simp add: closed_injective_linear_image closure_linear_image_subset
closure_minimal closure_subset image_mono subset_antisym)
lemma closure_bounded_linear_image: fixes f :: "'a::euclidean_space ==> 'b::euclidean_space" assumes"linear f""bounded S" shows"f ` (closure S) = closure (f ` S)" (is"?lhs = ?rhs") proof show"?lhs ⊆ ?rhs" using assms closure_linear_image_subset by blast show"?rhs ⊆ ?lhs" using assms by (meson closure_minimal closure_subset compact_closure compact_eq_bounded_closed
compact_continuous_image image_mono linear_continuous_on linear_linear) qed
lemma closure_scaleR: fixes S :: "'a::real_normed_vector set" shows"((*🪙R) c) ` (closure S) = closure (((*🪙R) c) ` S)" (is"?lhs = ?rhs") proof show"?lhs ⊆ ?rhs" using bounded_linear_scaleR_right by (rule closure_bounded_linear_image_subset) show"?rhs ⊆ ?lhs" by (intro closure_minimal image_mono closure_subset closed_scaling closed_closure) qed
subsection🍋‹tag unimportant›‹Some properties of a canonical subspace›
lemma closed_substandard: "closed {x::'a::euclidean_space. ∀i∈Basis. P i ⟶ x∙i = 0}"
(is"closed ?A") proof - let ?D = "{i∈Basis. P i}" have"closed (∩i∈?D. {x::'a. x∙i = 0})" by (simp add: closed_INT closed_Collect_eq continuous_on_inner) alsohave"(∩i∈?D. {x::'a. x∙i = 0}) = ?A" by auto finallyshow"closed ?A" . qed
lemma closed_subspace: fixes S :: "'a::euclidean_space set" assumes"subspace S" shows"closed S" proof - have"dim S ≤ card (Basis :: 'a set)" using dim_subset_UNIV by auto with obtain_subset_with_card_n obtain d :: "'a set"wherecd: "card d = dim S"and d: "d ⊆ Basis" by metis let ?t = "{x::'a. ∀i∈Basis. i ∉ d ⟶ x∙i = 0}" have"∃f. linear f ∧ f ` {x::'a. ∀i∈Basis. i ∉ d ⟶ x ∙ i = 0} = S ∧ inj_on f {x::'a. ∀i∈Basis. i ∉ d ⟶ x ∙ i = 0}" using dim_substandard[of d] cd d assms by (intro subspace_isomorphism[OF subspace_substandard[of "λi. i ∉ d"]]) (auto simp: inner_Basis) thenobtain f where f: "linear f" "f ` {x. ∀i∈Basis. i ∉ d ⟶ x ∙ i = 0} = S" "inj_on f {x. ∀i∈Basis. i ∉ d ⟶ x ∙ i = 0}" by blast interpret f: bounded_linear f using f by (simp add: linear_conv_bounded_linear) have"x ∈ ?t ==> f x = 0 ==> x = 0"for x using f.zero d f(3)[THEN inj_onD, of x 0] by auto thenshow ?thesis using closed_injective_image_subspace[of ?t f] closed_substandard subspace_substandard using f(2) f.bounded_linear_axioms by force qed
lemma complete_subspace: "subspace S ==> complete S" for S :: "'a::euclidean_space set" using complete_eq_closed closed_subspace by auto
lemma closed_span [iff]: "closed (span S)" for S :: "'a::euclidean_space set" by (simp add: closed_subspace)
lemma dim_closure [simp]: "dim (closure S) = dim S" (is"?dc = ?d") for S :: "'a::euclidean_space set" by (metis closed_span closure_minimal closure_subset dim_eq_span span_eq_dim span_superset subset_le_dim)
subsection‹Set Distance›
lemma setdist_compact_closed: fixes A :: "'a::heine_borel set" assumes"compact A""closed B" and"A ≠ {}""B ≠ {}" shows"∃x ∈ A. ∃y ∈ B. dist x y = setdist A B" by (metis assms infdist_attains_inf setdist_attains_inf setdist_sym)
lemma setdist_closed_compact: fixes S :: "'a::heine_borel set" assumes S: "closed S"and T: "compact T" and"S ≠ {}""T ≠ {}" shows"∃x ∈ S. ∃y ∈ T. dist x y = setdist S T" using setdist_compact_closed [OF T S ‹T ≠ {}›‹S ≠ {}›] by (metis dist_commute setdist_sym)
lemma setdist_eq_0_compact_closed: assumes S: "compact S"and T: "closed T" shows"setdist S T = 0 ⟷ S = {} ∨ T = {} ∨ S ∩ T ≠ {}" proof (cases "S = {} ∨ T = {}") case False thenshow ?thesis by (metis S T disjoint_iff in_closed_iff_infdist_zero setdist_attains_inf setdist_eq_0I setdist_sym) qed auto
corollary setdist_gt_0_compact_closed: assumes S: "compact S"and T: "closed T" shows"setdist S T > 0 ⟷ (S ≠ {} ∧ T ≠ {} ∧ S ∩ T = {})" using setdist_pos_le [of S T] setdist_eq_0_compact_closed [OF assms] by linarith
lemma setdist_eq_0_closed_compact: assumes S: "closed S"and T: "compact T" shows"setdist S T = 0 ⟷ S = {} ∨ T = {} ∨ S ∩ T ≠ {}" using setdist_eq_0_compact_closed [OF T S] by (metis Int_commute setdist_sym)
lemma setdist_eq_0_bounded: fixes S :: "'a::heine_borel set" assumes"bounded S ∨ bounded T" shows"setdist S T = 0 ⟷ S = {} ∨ T = {} ∨ closure S ∩ closure T ≠ {}" proof (cases "S = {} ∨ T = {}") case False thenshow ?thesis using setdist_eq_0_compact_closed [of "closure S""closure T"]
setdist_eq_0_closed_compact [of "closure S""closure T"] assms by (force simp: bounded_closure compact_eq_bounded_closed) qed force
lemma setdist_eq_0_sing_1: "setdist {x} S = 0 ⟷ S = {} ∨ x ∈ closure S" by (metis in_closure_iff_infdist_zero infdist_def infdist_eq_setdist)
lemma setdist_eq_0_sing_2: "setdist S {x} = 0 ⟷ S = {} ∨ x ∈ closure S" by (metis setdist_eq_0_sing_1 setdist_sym)
lemma setdist_neq_0_sing_1: "[setdist {x} S = a; a ≠ 0]==> S ≠ {} ∧ x ∉ closure S" by (metis setdist_closure_2 setdist_empty2 setdist_eq_0I singletonI)
lemma setdist_neq_0_sing_2: "[setdist S {x} = a; a ≠ 0]==> S ≠ {} ∧ x ∉ closure S" by (simp add: setdist_neq_0_sing_1 setdist_sym)
lemma setdist_sing_in_set: "x ∈ S ==> setdist {x} S = 0" by (simp add: setdist_eq_0I)
lemma setdist_eq_0_closed: "closed S ==> (setdist {x} S = 0 ⟷ S = {} ∨ x ∈ S)" by (simp add: setdist_eq_0_sing_1)
lemma setdist_eq_0_closedin: shows"[closedin (top_of_set U) S; x ∈ U] ==> (setdist {x} S = 0 ⟷ S = {} ∨ x ∈ S)" by (auto simp: closedin_limpt setdist_eq_0_sing_1 closure_def)
lemma setdist_gt_0_closedin: shows"[closedin (top_of_set U) S; x ∈ U; S ≠ {}; x ∉ S] ==> setdist {x} S > 0" using less_eq_real_def setdist_eq_0_closedin by fastforce
text‹A consequence of the results above› lemma compact_minkowski_sum_cball: fixes A :: "'a :: heine_borel set" assumes"compact A" shows"compact (∪x∈A. cball x r)" proof (cases "A = {}") case False show ?thesis unfolding compact_eq_bounded_closed proof safe have"open (-(∪x∈A. cball x r))" unfolding open_dist proof safe fix x assume x: "x ∉ (∪x∈A. cball x r)" have"∃x'∈{x}. ∃y∈A. dist x' y = setdist {x} A" using‹A ≠ {}› assms by (intro setdist_compact_closed) (auto simp: compact_imp_closed) thenobtain y where y: "y ∈ A""dist x y = setdist {x} A" by blast with x have"setdist {x} A > r" by (auto simp: dist_commute) moreoverhave"False"if"dist z x < setdist {x} A - r""u ∈ A""z ∈ cball u r"for z u by (smt (verit, del_insts) mem_cball setdist_Lipschitz setdist_sing_in_set that) ultimately show"∃e>0. ∀y. dist y x < e ⟶ y ∈ - (∪x∈A. cball x r)" by (force intro!: exI[of _ "setdist {x} A - r"]) qed thus"closed (∪x∈A. cball x r)" using closed_open by blast next from assms have"bounded A" by (simp add: compact_imp_bounded) thenobtain x c where c: "∧y. y ∈ A ==> dist x y ≤ c" unfolding bounded_def by blast have"∀y∈(∪x∈A. cball x r). dist x y ≤ c + r" proof safe fix y z assume *: "y ∈ A""z ∈ cball y r" thus"dist x z ≤ c + r" using * c[of y] cball_trans mem_cball by blast qed thus"bounded (∪x∈A. cball x r)" unfolding bounded_def by blast qed qed auto
no_notation eucl_less (infix‹🚫› 50)
end
Messung V0.5 in Prozent
¤ 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.106Bemerkung:
(vorverarbeitet am 2026-04-26)
¤
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.