(* Author: L C Paulson, University of Cambridge Author:AmineChaieb,UniversityofCambridge Author:RobertHimmelmann,TUMuenchen Author:BrianHuffman,PortlandStateUniversity
*)
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 *Rb))" 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(forcesimp:SOME_Basisdist_norm) next caseFalse have"norm(a'-(a+(r/norm(a-a'))*\<^sub>R(a-a')))=norm((-1-(r/norm(a-a')))*\<^sub>R(a-a'))" by(simpadd:algebra_simps) alsofrom\<open>a\<noteq>a'\<close>have"...=\<bar>-norm(a-a')-r\<bar>" by(simpadd:divide_simps) finallyhave[simp]:"norm(a'-(a+(r/norm(a-a'))*\<^sub>R(a-a')))=\<bar>norm(a-a')+r\<bar>" bylinarith from\<open>a\<noteq>a'\<close>show?thesis usingsubsetD[wherec="a'+(1+r/norm(a-a'))*\<^sub>R(a-a')",OF\<open>?lhs\<close>] by(simpadd:dist_normscaleR_add_left) qed thenshow?rhs by(simpadd:dist_norm) qed qedmetric
lemmacball_subset_ball_iff:"cballar\<subseteq>balla'r'\<longleftrightarrow>distaa'+r<r'\<or>r<0" (is"?lhs\<longleftrightarrow>?rhs") fora::"'a::euclidean_space" proof assume?lhs thenshow?rhs proof(cases"r<0") caseTruethen show?rhsbysimp next caseFalse thenhave[simp]:"r\<ge>0"bysimp have"norm(a-a')+r<r'" proof(cases"a=a'") caseTrue thenshow?thesis usingsubsetD[wherec="a+r*\<^sub>R(SOMEi.i\<in>Basis)",OF\<open>?lhs\<close>]subsetD[wherec=a,OF\<open>?lhs\<close>] by(forcesimp:SOME_Basisdist_norm) next caseFalse haveFalseif"norm(a-a')+r\<ge>r'" proof- fromthathave"\<bar>r'-norm(a-a')\<bar>\<le>r" by(smt(verit,best)\<open>0\<le>r\<close>\<open>?lhs\<close>ball_subset_cballcball_subset_cball_iffdist_normorder_trans) thenshow?thesis usingsubsetD[wherec="a+(r'/norm(a-a')-1)*\<^sub>R(a-a')",OF\<open>?lhs\<close>]\<open>a\<noteq>a'\<close> apply(simpadd:dist_norm) apply(simpadd:scaleR_left_diff_distrib) apply(simpadd:field_simps) done qed thenshow?thesisbyforce qed thenshow?rhsby(simpadd:dist_norm) qed next assume?rhs thenshow?lhs bymetric qed
lemmaball_subset_cball_iff:"ballar\<subseteq>cballa'r'\<longleftrightarrow>distaa'+r\<le>r'\<or>r\<le>0" (is"?lhs=?rhs") fora::"'a::euclidean_space" proof(cases"r\<le>0") caseTrue thenshow?thesis bymetric next caseFalse show?thesis proof assume?lhs thenhave"(cballar\<subseteq>cballa'r')" by(metisFalseclosed_cballclosure_ballclosure_closedclosure_mononot_less) withFalseshow?rhs by(fastforceiff:cball_subset_cball_iff) next assume?rhs withFalseshow?lhs bymetric qed qed
lemmaball_subset_ball_iff: fixesa::"'a::euclidean_space" shows"ballar\<subseteq>balla'r'\<longleftrightarrow>distaa'+r\<le>r'\<or>r\<le>0" (is"?lhs=?rhs") proof(cases"r\<le>0") caseTruethenshow?thesis bymetric next caseFalseshow?thesis proof assume?lhs thenhave"0<r'" usingFalsebymetric thenhave"cballar\<subseteq>cballa'r'" by(metisFalse\<open>?lhs\<close>closure_ballclosure_mononot_less) thenshow?rhs usingFalsecball_subset_cball_iffbyfastforce qedmetric qed
lemmasubset_box: fixesa::"'a::euclidean_space" shows"cboxcd\<subseteq>cboxab\<longleftrightarrow>(\<forall>i\<in>Basis.c\<bullet>i\<le>d\<bullet>i)\<longrightarrow>(\<forall>i\<in>Basis.a\<bullet>i\<le>c\<bullet>i\<and>d\<bullet>i\<le>b\<bullet>i)"(is?th1) and"cboxcd\<subseteq>boxab\<longleftrightarrow>(\<forall>i\<in>Basis.c\<bullet>i\<le>d\<bullet>i)\<longrightarrow>(\<forall>i\<in>Basis.a\<bullet>i<c\<bullet>i\<and>d\<bullet>i<b\<bullet>i)"(is?th2) and"boxcd\<subseteq>cboxab\<longleftrightarrow>(\<forall>i\<in>Basis.c\<bullet>i<d\<bullet>i)\<longrightarrow>(\<forall>i\<in>Basis.a\<bullet>i\<le>c\<bullet>i\<and>d\<bullet>i\<le>b\<bullet>i)"(is?th3) and"boxcd\<subseteq>boxab\<longleftrightarrow>(\<forall>i\<in>Basis.c\<bullet>i<d\<bullet>i)\<longrightarrow>(\<forall>i\<in>Basis.a\<bullet>i\<le>c\<bullet>i\<and>d\<bullet>i\<le>b\<bullet>i)"(is?th4) proof- let?lesscd="\<forall>i\<in>Basis.c\<bullet>i<d\<bullet>i" let?lerhs="\<forall>i\<in>Basis.a\<bullet>i\<le>c\<bullet>i\<and>d\<bullet>i\<le>b\<bullet>i" show?th1?th2 by(fastforcesimp:mem_box)+ haveacdb:"a\<bullet>i\<le>c\<bullet>i\<and>d\<bullet>i\<le>b\<bullet>i" ifi:"i\<in>Basis"andbox:"boxcd\<subseteq>cboxab"andcd:"\<And>i.i\<in>Basis\<Longrightarrow>c\<bullet>i<d\<bullet>i"fori proof- have"boxcd\<noteq>{}" usingthat unfoldingbox_eq_emptybyforce {let?x="(\<Sum>j\<in>Basis.(ifj=ithen((min(a\<bullet>j)(d\<bullet>j))+c\<bullet>j)/2else(c\<bullet>j+d\<bullet>j)/2)*\<^sub>Rj)::'a" assume*:"a\<bullet>i>c\<bullet>i" thenhave"c\<bullet>j<?x\<bullet>j\<and>?x\<bullet>j<d\<bullet>j"if"j\<in>Basis"forj
using cd 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<..<Re b} ∧ Im x ∈ {Im a<..<Im b}" 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<..<Re b} ∧ Im x ∈ {Im a<..<Im b}}" 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). r2)" by (intro real_sqrt_le_mono sum_mono power_mono)
(auto simp: dist_norm d_def cbox_def algebra_simps) alsohave"… = sqrt (DIM('a) * r2)"by simp alsohave"DIM('a) * r2 = (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<..<b ∙ i}" proof safe fix x assume x: "x ∈ {a ∙ i<..<b ∙ 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 case1 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 <e a} = (∩i∈Basis. {x. x ∙ i < a ∙ i})" "{x. a <e x} = (∩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 <e a}""open {x. a <e x}" 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 < e› 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-valuetheorem 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)asbdisjoint_iffempty_iffmem_Collect_eqxy) qed
lemmauniv_second_countable_sequence: obtainsB::"nat\<Rightarrow>'a::euclidean_spaceset" where"injB""\<And>n.open(Bn)""\<And>S.openS\<Longrightarrow>\<exists>k.S=\<Union>{Bn|n.n\<in>k}" proof- obtain\<B>::"'asetset" where"countable\<B>" andopn:"\<And>C.C\<in>\<B>\<Longrightarrow>openC" andUn:"\<And>S.openS\<Longrightarrow>\<exists>U.U\<subseteq>\<B>\<and>S=\<Union>U" usinguniv_second_countablebyblast have*:"infinite(range(\<lambda>n.ball(0::'a)(inverse(Sucn))))" by(simpadd:inj_on_defball_eq_ball_iffInfinite_Set.range_inj_infinite) have"infinite\<B>" proof assume"finite\<B>" thenhave"finite(Union`(Pow\<B>))" bysimp moreoverhave"range(\<lambda>n.ball0(inverse(real(Sucn))))\<subseteq>\<Union>`Pow\<B>" by(metis(no_types,lifting)PowIimage_eqIimage_subset_iffUn[OFopen_ball]) ultimatelyshowFalse
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 < e›U‹x ∈ S›by auto next case False thenshow ?thesis by (metis IntI Union_iff U‹0 < e›‹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<..<b} = (if b < a then 0 else b-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\<delta>where"\<delta>\<equiv>e/B/DIM('b)" show"\<exists>e>0.\<forall>y.disty(fx)<e\<longrightarrow>y\<in>f`A" proof(introexIconjI) show"\<delta>>0" using\<open>e>0\<close>\<open>B>0\<close>by(simpadd:\<delta>_deffield_split_simps) have"y\<in>f`A"if"disty(fx)*(B*realDIM('b))<e"fory proof- defineuwhere"u\<equiv>y-fx" show?thesis proof(ruleimage_eqI) show"y=f(x+(\<Sum>i\<in>Basis.(u\<bullet>i)*\<^sub>Rinvfi))" apply(simpadd:linear_addlinear_sumlinear.scaleR\<open>linearf\<close>surj_f_inv_f\<open>surjf\<close>) apply(simpadd:euclidean_representationu_def) done have"dist(x+(\<Sum>i\<in>Basis.(u\<bullet>i)*\<^sub>Rinvfi))x\<le>(\<Sum>i\<in>Basis.norm((u\<bullet>i)*\<^sub>Rinvfi))" by(simpadd:dist_normsum_norm_le) alsohave"...=(\<Sum>i\<in>Basis.\<bar>u\<bullet>i\<bar>*norm(invfi))" bysimp alsohave"...\<le>(\<Sum>i\<in>Basis.\<bar>u\<bullet>i\<bar>)*B" by(simpadd:Bsum_distrib_rightsum_monomult_left_mono) alsohave"...\<le>DIM('b)*disty(fx)*B" apply(rulemult_right_mono[OFsum_bounded_above]) using\<open>0<B\<close>by(autosimp:Basis_le_normdist_normu_def) alsohave"...<e" by(metismult.commutemult.left_commutethat) finallyshow"x+(\<Sum>i\<in>Basis.(u\<bullet>i)*\<^sub>Rinvfi)\<in>A" by(rulee) qed qed thenshow"\<forall>y.disty(fx)<\<delta>\<longrightarrow>y\<in>f`A" using\<open>e>0\<close>\<open>B>0\<close> by(autosimp:\<delta>_deffield_split_simps) qed qed
corollaryopen_bijective_linear_image_eq: fixesf::"'a::euclidean_space\<Rightarrow>'b::euclidean_space" assumes"linearf""bijf" shows"open(f`A)\<longleftrightarrow>openA" proof assume"open(f`A)" thenshow"openA" by(metisassmsbij_is_injcontinuous_open_vimageinj_vimage_image_eqlinear_continuous_atlinear_linear) next assume"openA" thenshow"open(f`A)" by(simpadd:assmsbij_is_surjopen_surjective_linear_image) 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.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.