(* Title: HOL/Analysis/Arcwise_Connected.thy Authors: LC Paulson, based on material from HOL Light *)
section‹Arcwise-Connected Sets›
theory Arcwise_Connected imports Path_Connected Ordered_Euclidean_Space "HOL-Computational_Algebra.Primes" begin
lemma path_connected_interval [simp]: fixes a b::"'a::ordered_euclidean_space" shows"path_connected {a..b}" using is_interval_cc is_interval_path_connected by blast
lemma segment_to_closest_point: fixes S :: "'a :: euclidean_space set" shows"[closed S; S ≠ {}]==> open_segment a (closest_point S a) ∩ S = {}" unfolding disjoint_iff by (metis closest_point_le dist_commute dist_in_open_segment not_le)
lemma segment_to_point_exists: fixes S :: "'a :: euclidean_space set" assumes"closed S""S ≠ {}" obtains b where"b ∈ S""open_segment a b ∩ S = {}" by (metis assms segment_to_closest_point closest_point_exists that)
subsection‹The Brouwer reduction theorem›
theorem Brouwer_reduction_theorem_gen: fixes S :: "'a::euclidean_space set" assumes"closed S""φ S" and φ: "∧F. [∧n. closed(F n); ∧n. φ(F n); ∧n. F(Suc n) ⊆ F n]==> φ(∩(range F))" obtains T where"T ⊆ S""closed T""φ T""∧U. [U ⊆ S; closed U; φ U]==>¬ (U ⊂ T)" proof - obtain B :: "nat ==> 'a set" where"inj B""∧n. open(B n)"and open_cov: "∧S. open S ==>∃K. S = ∪(B ` K)" by (metis Setcompr_eq_image that univ_second_countable_sequence)
define A where"A ≡ rec_nat S (λn a. if ∃U. U ⊆ a ∧ closed U ∧ φ U ∧ U ∩ (B n) = {} then SOME U. U ⊆ a ∧ closed U ∧ φ U ∧ U ∩ (B n) = {} else a)" have [simp]: "A 0 = S" by (simp add: A_def) have ASuc: "A(Suc n) = (if ∃U. U ⊆ A n ∧ closed U ∧ φ U ∧ U ∩ (B n) = {} then SOME U. U ⊆ A n ∧ closed U ∧ φ U ∧ U ∩ (B n) = {} else A n)"for n by (auto simp: A_def) have sub: "∧n. A(Suc n) ⊆ A n" by (auto simp: ASuc dest!: someI_ex) have subS: "A n ⊆ S"for n by (induction n) (use sub in auto) have clo: "closed (A n) ∧ φ (A n)"for n by (induction n) (auto simp: assms ASuc dest!: someI_ex) show ?thesis proof show"∩(range A) ⊆ S" using‹∧n. A n ⊆ S›by blast show"closed (∩(A ` UNIV))" using clo by blast show"φ (∩(A ` UNIV))" by (simp add: clo φ sub) show"¬ U ⊂∩(A ` UNIV)"if"U ⊆ S""closed U""φ U"for U proof - have"∃y. x ∉ A y"if"x ∉ U"and Usub: "U ⊆ (∩x. A x)"for x proof - obtain e where"e > 0"and e: "ball x e ⊆ -U" using‹closed U›‹x ∉ U› openE [of "-U"] by blast moreoverobtain K where K: "ball x e = ∪(B ` K)" using open_cov [of "ball x e"] by auto ultimatelyhave"∪(B ` K) ⊆ -U" by blast have"K ≠ {}" using‹0 🚫›‹ball x e = ∪(B ` K)›by auto thenobtain n where"n ∈ K""x ∈ B n" by (metis K UN_E ‹0 🚫› centre_in_ball) thenhave"U ∩ B n = {}" using K e by auto show ?thesis proof (cases "∃U⊆A n. closed U ∧ φ U ∧ U ∩ B n = {}") case True thenshow ?thesis apply (rule_tac x="Suc n"in exI) apply (simp add: ASuc) apply (erule someI2_ex) using‹x ∈ B n›by blast next case False thenshow ?thesis by (meson Inf_lower Usub ‹U ∩ B n = {}›‹φ U›‹closed U› range_eqI subset_trans) qed qed with that show ?thesis by (meson Inter_iff psubsetE rangeI subsetI) qed qed qed
corollary Brouwer_reduction_theorem: fixes S :: "'a::euclidean_space set" assumes"compact S""φ S""S ≠ {}" and φ: "∧F. [∧n. compact(F n); ∧n. F n ≠ {}; ∧n. φ(F n); ∧n. F(Suc n) ⊆ F n]==> φ(∩(range F))" obtains T where"T ⊆ S""compact T""T ≠ {}""φ T" "∧U. [U ⊆ S; closed U; U ≠ {}; φ U]==>¬ (U ⊂ T)" proof (rule Brouwer_reduction_theorem_gen [of S "λT. T ≠ {} ∧ T ⊆ S ∧ φ T"]) fix F assume cloF: "∧n. closed (F n)" and F: "∧n. F n ≠ {} ∧ F n ⊆ S ∧ φ (F n)"and Fsub: "∧n. F (Suc n) ⊆ F n" show"∩(F ` UNIV) ≠ {} ∧∩(F ` UNIV) ⊆ S ∧ φ (∩(F ` UNIV))" proof (intro conjI) show"∩(F ` UNIV) ≠ {}" by (metis F Fsub ‹compact S› cloF closed_Int_compact compact_nest inf.orderE lift_Suc_antimono_le) show" ∩(F ` UNIV) ⊆ S" using F by blast show"φ (∩(F ` UNIV))" by (metis F Fsub φ ‹compact S› cloF closed_Int_compact inf.orderE) qed next show"S ≠ {} ∧ S ⊆ S ∧ φ S" by (simp add: assms) qed (meson assms compact_imp_closed seq_compact_closed_subset seq_compact_eq_compact)+
subsection🍋‹tag unimportant›\<open>Arcwise Connections›(*FIX ME this subsection is empty(?) *)
subsection‹Density of points with dyadic rational coordinates›
proposition closure_dyadic_rationals: "closure (∪k. ∪f ∈ Basis →ℤ. { ∑i :: 'a :: euclidean_space ∈ Basis. (f i / 2^k) *🪙R i }) = UNIV" proof - have"x ∈ closure (∪k. ∪f ∈ Basis →ℤ. {∑i ∈ Basis. (f i / 2^k) *🪙R i})"for x::'a proof (clarsimp simp: closure_approachable) fix e::real assume"e > 0" thenobtain k where k: "(1/2)^k < e/DIM('a)" by (meson DIM_positive divide_less_eq_1_pos of_nat_0_less_iff one_less_numeral_iff real_arch_pow_inv semiring_norm(76) zero_less_divide_iff zero_less_numeral) have"dist (∑i∈Basis. (real_of_int ⌊2^k*(x ∙ i)⌋ / 2^k) *🪙R i) x = dist (∑i∈Basis. (real_of_int ⌊2^k*(x ∙ i)⌋ / 2^k) *🪙R i) (∑i∈Basis. (x ∙ i) *🪙R i)" by (simp add: euclidean_representation) alsohave"... = norm ((∑i∈Basis. (real_of_int ⌊2^k*(x ∙ i)⌋ / 2^k) *🪙R i - (x ∙ i) *🪙R i))" by (simp add: dist_norm sum_subtractf) alsohave"... ≤ DIM('a)*((1/2)^k)" proof (rule sum_norm_bound, simp add: algebra_simps) fix i::'a assume"i ∈ Basis" thenhave"norm ((real_of_int ⌊x ∙ i*2^k⌋ / 2^k) *🪙R i - (x ∙ i) *🪙R i) = ∣real_of_int ⌊x ∙ i*2^k⌋ / 2^k - x ∙ i∣" by (simp add: scaleR_left_diff_distrib [symmetric]) alsohave"... ≤ (1/2) ^ k" by (simp add: divide_simps) linarith finallyshow"norm ((real_of_int ⌊x ∙ i*2^k⌋ / 2^k) *🪙R i - (x ∙ i) *🪙R i) ≤ (1/2) ^ k" . qed alsohave"... < DIM('a)*(e/DIM('a))" using DIM_positive k linordered_comm_semiring_strict_class.comm_mult_strict_left_mono of_nat_0_less_iff by blast alsohave"... = e" by simp finallyhave"dist (∑i∈Basis. (⌊2^k*(x ∙ i)⌋ / 2^k) *🪙R i) x < e" . with Ints_of_int show"∃k. ∃f ∈ Basis →ℤ. dist (∑b∈Basis. (f b / 2^k) *🪙R b) x < e" by fastforce qed thenshow ?thesis by auto qed
corollary closure_rational_coordinates: "closure (∪f ∈ Basis →ℚ. { ∑i :: 'a :: euclidean_space ∈ Basis. f i *🪙R i }) = UNIV" proof - have *: "(∪k. ∪f ∈ Basis →ℤ. { ∑i::'a ∈ Basis. (f i / 2^k) *🪙R i }) ⊆ (∪f ∈ Basis →ℚ. { ∑i ∈ Basis. f i *🪙R i })" proof clarsimp fix k and f :: "'a ==> real" assume f: "f ∈ Basis →ℤ" show"∃x ∈ Basis →ℚ. (∑i ∈ Basis. (f i / 2^k) *🪙R i) = (∑i ∈ Basis. x i *🪙R i)" apply (rule_tac x="λi. f i / 2^k"in bexI) using Ints_subset_Rats f by auto qed show ?thesis using closure_dyadic_rationals closure_mono [OF *] by blast qed
lemma closure_dyadic_rationals_in_convex_set: "[convex S; interior S ≠ {}] ==> closure(S ∩ (∪k. ∪f ∈ Basis →ℤ. { ∑i :: 'a :: euclidean_space ∈ Basis. (f i / 2^k) *🪙R i })) = closure S" by (simp add: closure_dyadic_rationals closure_convex_Int_superset)
lemma closure_rationals_in_convex_set: "[convex S; interior S ≠ {}] ==> closure(S ∩ (∪f ∈ Basis →ℚ. { ∑i :: 'a :: euclidean_space ∈ Basis. f i *🪙R i })) = closure S" by (simp add: closure_rational_coordinates closure_convex_Int_superset)
text‹ Every path between distinct points contains an arc, and hence path connection is equivalent to arcwise connection for distinct points. The proof is based on Whyburn's "Topological Analysis".›
lemma closure_dyadic_rationals_in_convex_set_pos_1: fixes S :: "real set" assumes"convex S"and intnz: "interior S ≠ {}"and pos: "∧x. x ∈ S ==> 0 ≤ x" shows"closure(S ∩ (∪k m. {of_nat m / 2^k})) = closure S" proof - have"∃m. f 1/2^k = real m / 2^k"if"(f 1) / 2^k ∈ S""f 1 ∈ℤ"for k and f :: "real ==>real" using that by (force simp: Ints_def zero_le_divide_iff power_le_zero_eq dest: pos zero_le_imp_eq_int) thenhave"S ∩ (∪k m. {real m / 2^k}) = S ∩ (∪k. ∪f∈Basis →ℤ. {∑i∈Basis. (f i / 2^k) *🪙R i})" by force thenshow ?thesis using closure_dyadic_rationals_in_convex_set [OF ‹convex S› intnz] by simp qed
definition🍋‹tag unimportant› dyadics :: "'a::field_char_0 set"where"dyadics ≡∪k m. {of_nat m / 2^k}"
lemma real_in_dyadics [simp]: "real m ∈ dyadics" by (simp add: dyadics_def) (metis divide_numeral_1 numeral_One power_0)
lemma nat_neq_4k1: "of_nat m ≠ (4 * of_nat k + 1) / (2 * 2^n :: 'a::field_char_0)" proof assume"of_nat m = (4 * of_nat k + 1) / (2 * 2^n :: 'a)" thenhave"of_nat (m * (2 * 2^n)) = (of_nat (Suc (4 * k)) :: 'a)" by (simp add: field_split_simps) thenhave"m * (2 * 2^n) = Suc (4 * k)" using of_nat_eq_iff by blast thenhave"odd (m * (2 * 2^n))" by simp thenshow False by simp qed
lemma nat_neq_4k3: "of_nat m ≠ (4 * of_nat k + 3) / (2 * 2^n :: 'a::field_char_0)" proof assume"of_nat m = (4 * of_nat k + 3) / (2 * 2^n :: 'a)" thenhave"of_nat (m * (2 * 2^n)) = (of_nat (4 * k + 3) :: 'a)" by (simp add: field_split_simps) thenhave"m * (2 * 2^n) = (4 * k) + 3" using of_nat_eq_iff by blast thenhave"odd (m * (2 * 2^n))" by simp thenshow False by simp qed
lemma iff_4k: assumes"r = real k""odd k" shows"(4 * real m + r) / (2 * 2^n) = (4 * real m' + r) / (2 * 2 ^ n') ⟷ m=m' ∧ n=n'" proof -
{ assume"(4 * real m + r) / (2 * 2^n) = (4 * real m' + r) / (2 * 2 ^ n')" thenhave"real ((4 * m + k) * (2 * 2 ^ n')) = real ((4 * m' + k) * (2 * 2^n))" using assms by (auto simp: field_simps) thenhave"(4 * m + k) * (2 * 2 ^ n') = (4 * m' + k) * (2 * 2^n)" using of_nat_eq_iff by blast thenhave"(4 * m + k) * (2 ^ n') = (4 * m' + k) * (2^n)" by linarith thenobtain"4*m + k = 4*m' + k""n=n'" using prime_power_cancel2 [OF two_is_prime_nat] assms by (metis even_mult_iff even_numeral odd_add) thenhave"m=m'""n=n'" by auto
} thenshow ?thesis by blast qed
lemma neq_4k1_k43: "(4 * real m + 1) / (2 * 2^n) ≠ (4 * real m' + 3) / (2 * 2 ^ n')" proof assume"(4 * real m + 1) / (2 * 2^n) = (4 * real m' + 3) / (2 * 2 ^ n')" thenhave"real (Suc (4 * m) * (2 * 2 ^ n')) = real ((4 * m' + 3) * (2 * 2^n))" by (auto simp: field_simps) thenhave"Suc (4 * m) * (2 * 2 ^ n') = (4 * m' + 3) * (2 * 2^n)" using of_nat_eq_iff by blast thenhave"Suc (4 * m) * (2 ^ n') = (4 * m' + 3) * (2^n)" by linarith thenhave"Suc (4 * m) = (4 * m' + 3)" by (rule prime_power_cancel2 [OF two_is_prime_nat]) auto thenhave"1 + 2 * m' = 2 * m" using‹Suc (4 * m) = 4 * m' + 3›by linarith thenshow False using even_Suc by presburger qed
lemma dyadic_413_cases: obtains"(of_nat m::'a::field_char_0) / 2^k ∈ Nats"
| m' k' where"k' < k""(of_nat m:: 'a) / 2^k = of_nat (4*m' + 1) / 2^Suc k'"
| m' k' where"k' < k""(of_nat m:: 'a) / 2^k = of_nat (4*m' + 3) / 2^Suc k'" proof (cases "m>0") case False thenhave"m=0"by simp with that show ?thesis by auto next case True obtain k' m' where m': "odd m'"and k': "m = m' * 2^k'" using prime_power_canonical [OF two_is_prime_nat True] by blast thenobtain q r where q: "m' = 4*q + r"and r: "r < 4" by (metis not_add_less2 split_div zero_neq_numeral) show ?thesis proof (cases "k ≤ k'") case True have"(of_nat m:: 'a) / 2^k = of_nat m' * (2 ^ k' / 2^k)" using k' by (simp add: field_simps) alsohave"... = (of_nat m'::'a) * 2 ^ (k'-k)" using k' True by (simp add: power_diff) alsohave"... ∈ℕ" by (metis Nats_mult of_nat_in_Nats of_nat_numeral of_nat_power) finallyshow ?thesis by (auto simp: that) next case False thenobtain kd where kd: "Suc kd = k - k'" using Suc_diff_Suc not_less by blast have"(of_nat m:: 'a) / 2^k = of_nat m' * (2 ^ k' / 2^k)" using k' by (simp add: field_simps) alsohave"... = (of_nat m'::'a) / 2 ^ (k-k')" using k' False by (simp add: power_diff) alsohave"... = ((of_nat r + 4 * of_nat q)::'a) / 2 ^ (k-k')" using q by force finallyhave meq: "(of_nat m:: 'a) / 2^k = (of_nat r + 4 * of_nat q) / 2 ^ (k - k')" . have"r ≠ 0""r ≠ 2" using q m' by presburger+ with r consider "r = 1" | "r = 3" by linarith thenshow ?thesis proof cases assume"r = 1" with meq kd that(2) [of kd q] show ?thesis by simp next assume"r = 3" with meq kd that(3) [of kd q] show ?thesis by simp qed qed qed
lemma dyadics_iff: "(dyadics :: 'a::field_char_0 set) = Nats ∪ (∪k m. {of_nat (4*m + 1) / 2^Suc k}) ∪ (∪k m. {of_nat (4*m + 3) / 2^Suc k})"
(is"_ = ?rhs") proof show"dyadics ⊆ ?rhs" unfolding dyadics_def apply clarify apply (rule dyadic_413_cases, force+) done next have"range of_nat ⊆ (∪k m. {(of_nat m::'a) / 2 ^ k})" by clarsimp (metis divide_numeral_1 numeral_One power_0) moreoverhave"∧k m. ∃k' m'. ((1::'a) + 4 * of_nat m) / 2 ^ Suc k = of_nat m' / 2 ^ k'" by (metis (no_types) of_nat_Suc of_nat_mult of_nat_numeral) moreoverhave"∧k m. ∃k' m'. (4 * of_nat m + (3::'a)) / 2 ^ Suc k = of_nat m' / 2 ^ k'" by (metis of_nat_add of_nat_mult of_nat_numeral) ultimatelyshow"?rhs ⊆ dyadics" by (auto simp: dyadics_def Nats_def) qed
function🍋‹tag unimportant› (domintros) dyad_rec :: "[nat ==> 'a, 'a==>'a, 'a==>'a, real] ==> 'a"where "dyad_rec b l r (real m) = b m"
| "dyad_rec b l r ((4 * real m + 1) / 2 ^ (Suc n)) = l (dyad_rec b l r ((2*m + 1) / 2^n))"
| "dyad_rec b l r ((4 * real m + 3) / 2 ^ (Suc n)) = r (dyad_rec b l r ((2*m + 1) / 2^n))"
| "x ∉ dyadics ==> dyad_rec b l r x = undefined" using iff_4k [of _ 1] iff_4k [of _ 3] apply (simp_all add: nat_neq_4k1 nat_neq_4k3 neq_4k1_k43 dyadics_iff Nats_def) by (fastforce simp: field_simps)+
lemma dyadics_levels: "dyadics = (∪K. ∪k∪ m. {of_nat m / 2^k})" unfolding dyadics_def by auto
lemma dyad_rec_level_termination: assumes"k < K" shows"dyad_rec_dom(b, l, r, real m / 2^k)" using assms proof (induction K arbitrary: k m) case 0 thenshow ?caseby auto next case (Suc K) then consider "k = K" | "k < K" using less_antisym by blast thenshow ?case proof cases assume"k = K" show ?case proof (rule dyadic_413_cases [of m k, where 'a=real]) show"real m / 2^k ∈ℕ==> dyad_rec_dom (b, l, r, real m / 2^k)" by (force simp: Nats_def nat_neq_4k1 nat_neq_4k3 intro: dyad_rec.domintros) show ?caseif"k' < k"and eq: "real m / 2^k = real (4 * m' + 1) / 2^Suc k'"for m' k' proof - have"dyad_rec_dom (b, l, r, (4 * real m' + 1) / 2^Suc k')" proof (rule dyad_rec.domintros) fix m n assume"(4 * real m' + 1) / (2 * 2 ^ k') = (4 * real m + 1) / (2 * 2^n)" thenhave"m' = m""k' = n"using iff_4k [of _ 1] by auto have"dyad_rec_dom (b, l, r, real (2 * m + 1) / 2 ^ k')" using Suc.IH ‹k = K›‹k' 🚫›by blast thenshow"dyad_rec_dom (b, l, r, (2 * real m + 1) / 2^n)" using‹k' = n›by (auto simp: algebra_simps) next fix m n assume"(4 * real m' + 1) / (2 * 2 ^ k') = (4 * real m + 3) / (2 * 2^n)" thenhave"False" by (metis neq_4k1_k43) thenshow"dyad_rec_dom (b, l, r, (2 * real m + 1) / 2^n)" .. qed thenshow ?caseby (simp add: eq add_ac) qed show ?caseif"k' < k"and eq: "real m / 2^k = real (4 * m' + 3) / 2^Suc k'"for m' k' proof - have"dyad_rec_dom (b, l, r, (4 * real m' + 3) / 2^Suc k')" proof (rule dyad_rec.domintros) fix m n assume"(4 * real m' + 3) / (2 * 2 ^ k') = (4 * real m + 1) / (2 * 2^n)" thenhave"False" by (metis neq_4k1_k43) thenshow"dyad_rec_dom (b, l, r, (2 * real m + 1) / 2^n)" .. next fix m n assume"(4 * real m' + 3) / (2 * 2 ^ k') = (4 * real m + 3) / (2 * 2^n)" thenhave"m' = m""k' = n"using iff_4k [of _ 3] by auto have"dyad_rec_dom (b, l, r, real (2 * m + 1) / 2 ^ k')" using Suc.IH ‹k = K›‹k' 🚫›by blast thenshow"dyad_rec_dom (b, l, r, (2 * real m + 1) / 2^n)" using‹k' = n›by (auto simp: algebra_simps) qed thenshow ?caseby (simp add: eq add_ac) qed qed next assume"k < K" thenshow ?case using Suc.IH by blast qed qed
lemma dyad_rec_of_nat [simp]: "dyad_rec b l r (real m) = b m" by (simp add: dyad_rec.psimps dyad_rec_termination)
lemma dyad_rec_41 [simp]: "dyad_rec b l r ((4 * real m + 1) / 2 ^ (Suc n)) = l (dyad_rec b l r ((2*m + 1) / 2^n))" proof (rule dyad_rec.psimps) show"dyad_rec_dom (b, l, r, (4 * real m + 1) / 2 ^ Suc n)" by (metis add.commute dyad_rec_level_termination lessI of_nat_Suc of_nat_mult of_nat_numeral) qed
lemma dyad_rec_43 [simp]: "dyad_rec b l r ((4 * real m + 3) / 2 ^ (Suc n)) = r (dyad_rec b l r ((2*m + 1) / 2^n))" proof (rule dyad_rec.psimps) show"dyad_rec_dom (b, l, r, (4 * real m + 3) / 2 ^ Suc n)" by (metis dyad_rec_level_termination lessI of_nat_add of_nat_mult of_nat_numeral) qed
lemma dyad_rec_41_times2: assumes"n > 0" shows"dyad_rec b l r (2 * ((4 * real m + 1) / 2^Suc n)) = l (dyad_rec b l r (2 * (2 * real m + 1) / 2^n))" proof - obtain n' where n': "n = Suc n'" using assms not0_implies_Suc by blast have"dyad_rec b l r (2 * ((4 * real m + 1) / 2^Suc n)) = dyad_rec b l r ((2 * (4 * real m + 1)) / (2 * 2^n))" by auto alsohave"... = dyad_rec b l r ((4 * real m + 1) / 2^n)" by (subst mult_divide_mult_cancel_left) auto alsohave"... = l (dyad_rec b l r ((2 * real m + 1) / 2 ^ n'))" by (simp add: add.commute [of 1] n' del: power_Suc) alsohave"... = l (dyad_rec b l r ((2 * (2 * real m + 1)) / (2 * 2 ^ n')))" by (subst mult_divide_mult_cancel_left) auto alsohave"... = l (dyad_rec b l r (2 * (2 * real m + 1) / 2^n))" by (simp add: add.commute n') finallyshow ?thesis . qed
lemma dyad_rec_43_times2: assumes"n > 0" shows"dyad_rec b l r (2 * ((4 * real m + 3) / 2^Suc n)) = r (dyad_rec b l r (2 * (2 * real m + 1) / 2^n))" proof - obtain n' where n': "n = Suc n'" using assms not0_implies_Suc by blast have"dyad_rec b l r (2 * ((4 * real m + 3) / 2^Suc n)) = dyad_rec b l r ((2 * (4 * real m + 3)) / (2 * 2^n))" by auto alsohave"... = dyad_rec b l r ((4 * real m + 3) / 2^n)" by (subst mult_divide_mult_cancel_left) auto alsohave"... = r (dyad_rec b l r ((2 * real m + 1) / 2 ^ n'))" by (simp add: n' del: power_Suc) alsohave"... = r (dyad_rec b l r ((2 * (2 * real m + 1)) / (2 * 2 ^ n')))" by (subst mult_divide_mult_cancel_left) auto alsohave"... = r (dyad_rec b l r (2 * (2 * real m + 1) / 2^n))" by (simp add: n') finallyshow ?thesis . qed
definition🍋‹tag unimportant› dyad_rec2 where"dyad_rec2 u v lc rc x = dyad_rec (λz. (u,v)) (λ(a,b). (a, lc a b (midpoint a b))) (λ(a,b). (rc a b (midpoint a b), b)) (2*x)"
abbreviation🍋‹tag unimportant› leftrec where"leftrec u v lc rc x ≡ fst (dyad_rec2 u v lc rc x)" abbreviation🍋‹tag unimportant› rightrec where"rightrec u v lc rc x ≡ snd (dyad_rec2 u v lc rc x)"
lemma leftrec_base: "leftrec u v lc rc (real m / 2) = u" by (simp add: dyad_rec2_def)
lemma leftrec_41: "n > 0 ==> leftrec u v lc rc ((4 * real m + 1) / 2 ^ (Suc n)) = leftrec u v lc rc ((2 * real m + 1) / 2^n)" unfolding dyad_rec2_def dyad_rec_41_times2 by (simp add: case_prod_beta)
lemma leftrec_43: "n > 0 ==> leftrec u v lc rc ((4 * real m + 3) / 2 ^ (Suc n)) = rc (leftrec u v lc rc ((2 * real m + 1) / 2^n)) (rightrec u v lc rc ((2 * real m + 1) / 2^n)) (midpoint (leftrec u v lc rc ((2 * real m + 1) / 2^n)) (rightrec u v lc rc ((2 * real m + 1) / 2^n)))" unfolding dyad_rec2_def dyad_rec_43_times2 by (simp add: case_prod_beta)
lemma rightrec_base: "rightrec u v lc rc (real m / 2) = v" by (simp add: dyad_rec2_def)
lemma rightrec_41: "n > 0 ==> rightrec u v lc rc ((4 * real m + 1) / 2 ^ (Suc n)) = lc (leftrec u v lc rc ((2 * real m + 1) / 2^n)) (rightrec u v lc rc ((2 * real m + 1) / 2^n)) (midpoint (leftrec u v lc rc ((2 * real m + 1) / 2^n)) (rightrec u v lc rc ((2 * real m + 1) / 2^n)))" unfolding dyad_rec2_def dyad_rec_41_times2 by (simp add: case_prod_beta)
lemma rightrec_43: "n > 0 ==> rightrec u v lc rc ((4 * real m + 3) / 2 ^ (Suc n)) = rightrec u v lc rc ((2 * real m + 1) / 2^n)" unfolding dyad_rec2_def dyad_rec_43_times2 by (simp add: case_prod_beta)
lemma dyadics_in_open_unit_interval: "{0<..<1} ∩ (∪k m. {real m / 2^k}) = (∪k. ∪m ∈ {0<..<2^k}. {real m / 2^k})" by (auto simp: field_split_simps)
lemma padic_rational_approximation_straddle: assumes"ε > 0""p > 1" obtains n q r where"of_int q / p^n < x""x < of_int r / p^n""∣q / p^n - r / p^n ∣ < ε" proof - obtain n where n: "2 / ε < p ^ n" using‹p>1› real_arch_pow by blast
define q where"q ≡⌊p ^ n * x⌋ - 1" show thesis proof show"q / p ^ n < x""x < real_of_int (q+2) / p ^ n" using assms by (simp_all add: q_def divide_simps floor_less_cancel mult.commute) show"∣q / p ^ n - real_of_int (q+2) / p ^ n∣ < ε" using assms n by (simp add: q_def divide_simps mult.commute) qed qed
lemma padic_rational_approximation_straddle_pos: assumes"ε > 0""p > 1""x > 0" obtains n q r where"of_nat q / p^n < x""x < of_nat r / p^n""∣q / p^n - r / p^n ∣ < ε" proof - obtain n q r where *: "of_int q / p^n < x""x < of_int r / p^n""∣q / p^n - r / p^n ∣ < ε" using padic_rational_approximation_straddle assms by metis thenhave"r ≥ 0" using assms by (smt (verit, best) divide_nonpos_pos of_int_0_le_iff zero_less_power) show thesis proof show"real (max 0 (nat q)) / p ^ n < x" using * by (metis assms(3) div_0 max_nat.left_neutral nat_eq_iff2 of_nat_0 of_nat_nat) show"x < real (nat r) / p ^ n" using‹r ≥ 0› * by force show"∣real (max 0 (nat q)) / p ^ n - real (nat r) / p ^ n∣ < ε" using * assms by (simp add: divide_simps) qed qed
lemma padic_rational_approximation_straddle_pos_le: assumes"ε > 0""p > 1""x ≥ 0" obtains n q r where"of_nat q / p^n ≤ x""x < of_nat r / p^n""∣q / p^n - r / p^n ∣ < ε" proof - obtain n q r where *: "of_int q / p^n < x""x < of_int r / p^n""∣q / p^n - r / p^n ∣ < ε" using padic_rational_approximation_straddle assms by metis thenhave"r ≥ 0" using assms by (smt (verit, best) divide_nonpos_pos of_int_0_le_iff zero_less_power) show thesis proof show"real (max 0 (nat q)) / p ^ n ≤ x" using * assms(3) nle_le by fastforce show"x < real (nat r) / p ^ n" using‹r ≥ 0› * by force show"∣real (max 0 (nat q)) / p ^ n - real (nat r) / p ^ n∣ < ε" using * assms by (simp add: divide_simps) qed qed
subsubsection ‹Definition by recursion on dyadic rationals in [0,1]›
lemma recursion_on_dyadic_fractions: assumes base: "R a b" and step: "∧x y. R x y ==>∃z. R x z ∧ R z y"and trans: "∧x y z. [R x y; R y z]==>R x z" shows"∃f :: real ==> 'a. f 0 = a ∧ f 1 = b ∧ (∀x ∈ dyadics ∩ {0..1}. ∀y ∈ dyadics ∩ {0..1}. x < y ⟶ R (f x) (f y))" proof - obtain mid where mid: "R x y ==> R x (mid x y)""R x y ==> R (mid x y) y"for x y using step by metis
define g where"g ≡ rec_nat (λk. if k = 0 then a else b) (λn r k. if even k then r (k div 2) else mid (r ((k - 1) div 2)) (r ((Suc k) div 2)))" have g0 [simp]: "g 0 = (λk. if k = 0 then a else b)" by (simp add: g_def) have gSuc [simp]: "∧n. g(Suc n) = (λk. if even k then g n (k div 2) else mid (g n ((k - 1) div 2)) (g n ((Suc k) div 2)))" by (auto simp: g_def) have g_eq_g: "2 ^ d * k = k' ==> g n k = g (n + d) k'"for n d k k' by (induction d arbitrary: k k') auto have"g n k = g n' k'"if"real k / 2^n = real k' / 2^n'""n' ≤ n"for k n k' n' proof - have"real k = real k' * 2 ^ (n-n')" using that by (simp add: power_diff divide_simps) thenhave"k = k' * 2 ^ (n-n')" using of_nat_eq_iff by fastforce with g_eq_g show ?thesis by (metis le_add_diff_inverse mult.commute that(2)) qed thenhave g_eq_g: "g n k = g n' k'"if"real k / 2 ^ n = real k' / 2 ^ n'"for k n k' n' by (metis nat_le_linear that) thenobtain f where"(λ(k,n). g n k) = f ∘ (λ(k,n). k / 2 ^ n)" using function_factors_left by (smt (verit, del_insts) case_prod_beta') thenhave f_eq_g: "∧k n. f(real k / 2 ^ n) = g n k" by (simp add: fun_eq_iff) show ?thesis proof (intro exI conjI strip) show"f 0 = a" by (metis f_eq_g g0 div_0 of_nat_0) show"f 1 = b" by (metis f_eq_g g0 div_by_1 of_nat_1_eq_iff power_0 zero_neq_one) show"R (f x) (f y)" if x: "x ∈ dyadics ∩ {0..1}"and y: "y ∈ dyadics ∩ {0..1}"and"x < y"for x y proof - obtain n1 k1 where xeq: "x = real k1 / 2^n1""k1 ≤ 2^n1" using x by (auto simp: dyadics_def) obtain n2 k2 where yeq: "y = real k2 / 2^n2""k2 ≤ 2^n2" using y by (auto simp: dyadics_def) have xcommon: "x = real(2^n2 * k1) / 2 ^ (n1+n2)" using xeq by (simp add: power_add) have ycommon: "y = real(2^n1 * k2) / 2 ^ (n1+n2)" using yeq by (simp add: power_add) have *: "R (g n j) (g n k)"if"j < k""k ≤ 2^n"for n j k using that proof (induction n arbitrary: j k) case 0 thenshow ?case by (simp add: base) next case (Suc n) show ?case proof (cases "even j") case True thenobtain a where [simp]: "j = 2*a" by blast show ?thesis proof (cases "even k") case True with Suc show ?thesis by (auto elim!: evenE) next case False thenobtain b where [simp]: "k = Suc (2*b)" using oddE by fastforce show ?thesis using Suc apply simp by (smt (verit, ccfv_SIG) less_Suc_eq linorder_not_le local.trans mid(1) nat_mult_less_cancel1 pos2) qed next case False thenobtain a where [simp]: "j = Suc (2*a)" using oddE by fastforce show ?thesis proof (cases "even k") case True thenobtain b where [simp]: "k = 2*b" by blast show ?thesis using Suc apply simp by (smt (verit, ccfv_SIG) Suc_leI Suc_lessD le_trans lessI linorder_neqE_nat linorder_not_le local.trans mid(2) nat_mult_less_cancel1 pos2) next case False thenobtain b where [simp]: "k = Suc (2*b)" using oddE by fastforce show ?thesis using Suc apply simp by (smt (verit) Suc_leI le_trans lessI less_or_eq_imp_le linorder_neqE_nat linorder_not_le local.trans mid(1) mid(2) nat_mult_less_cancel1 pos2) qed qed qed show ?thesis unfolding xcommon ycommon f_eq_g proof (rule *) show"2 ^ n2 * k1 < 2 ^ n1 * k2" using of_nat_less_iff ‹x 🚫›by (fastforce simp: xeq yeq field_simps) show"2 ^ n1 * k2 ≤ 2 ^ (n1 + n2)" by (simp add: power_add yeq) qed qed qed qed
lemma dyadics_add: assumes"x ∈ dyadics""y ∈ dyadics" shows"x+y ∈ dyadics" proof - obtain i j m n where x: "x = of_nat i / 2 ^ m"and y: "y = of_nat j / 2 ^ n" using assms by (auto simp: dyadics_def) have xcommon: "x = of_nat(2^n * i) / 2 ^ (m+n)" using x by (simp add: power_add) moreover have ycommon: "y = of_nat(2^m * j) / 2 ^ (m+n)" using y by (simp add: power_add) ultimatelyhave"x+y = (of_nat(2^n * i + 2^m * j)) / 2 ^ (m+n)" by (simp add: field_simps) thenshow ?thesis unfolding dyadics_def by blast qed
lemma dyadics_diff: fixes x :: "'a::linordered_field" assumes"x ∈ dyadics""y ∈ dyadics""y ≤ x" shows"x-y ∈ dyadics" proof - obtain i j m n where x: "x = of_nat i / 2 ^ m"and y: "y = of_nat j / 2 ^ n" using assms by (auto simp: dyadics_def) have j_le_i: "j * 2 ^ m ≤ i * 2 ^ n" using of_nat_le_iff ‹y ≤ x›unfolding x y by (fastforce simp add: divide_simps) have xcommon: "x = of_nat(2^n * i) / 2 ^ (m+n)" using x by (simp add: power_add) moreover have ycommon: "y = of_nat(2^m * j) / 2 ^ (m+n)" using y by (simp add: power_add) ultimatelyhave"x-y = (of_nat(2^n * i - 2^m * j)) / 2 ^ (m+n)" by (simp add: xcommon ycommon field_simps j_le_i of_nat_diff) thenshow ?thesis unfolding dyadics_def by blast qed
theorem homeomorphic_monotone_image_interval: fixes f :: "real ==> 'a::{real_normed_vector,complete_space}" assumes cont_f: "continuous_on {0..1} f" and conn: "∧y. connected ({0..1} ∩ f -` {y})" and f_1not0: "f 1 ≠ f 0" shows"(f ` {0..1}) homeomorphic {0..1::real}" proof - have"∃c d. a ≤ c ∧ c ≤ m ∧ m ≤ d ∧ d ≤ b ∧ (∀x ∈ {c..d}. f x = f m) ∧ (∀x ∈ {a..≠ f m)) ∧ (∀x ∈ {d<..b}. (f x ≠ f m)) ∧ (∀x ∈ {a..∀y ∈ {d<..b}. f x ≠ f y)" if m: "m ∈ {a..b}"and ab01: "{a..b} ⊆ {0..1}"for a b m proof - have comp: "compact (f -` {f m} ∩ {0..1})" by (simp add: compact_eq_bounded_closed bounded_Int closed_vimage_Int cont_f) obtain c0 d0 where cd0: "{0..1} ∩ f -` {f m} = {c0..d0}" using connected_compact_interval_1 [of "{0..1} ∩ f -` {f m}"] conn comp by (metis Int_commute) with that have"m ∈ cbox c0 d0" by auto obtain c d wherecd: "{a..b} ∩ f -` {f m} = {c..d}" using ab01 cd0 by (rule_tac c="max a c0"and d="min b d0"in that) auto thenhave cdab: "{c..d} ⊆ {a..b}" by blast show ?thesis proof (intro exI conjI ballI) show"a ≤ c""d ≤ b" using cdab cd m by auto show"c ≤ m""m ≤ d" usingcd m by auto show"∧x. x ∈ {c..d} ==> f x = f m" usingcdby blast show"f x ≠ f m"if"x ∈ {a..for x using that m cd [THEN equalityD1, THEN subsetD] ‹c ≤ m›by force show"f x ≠ f m"if"x ∈ {d<..b}"for x using that m cd [THEN equalityD1, THEN subsetD, of x] ‹m ≤ d›by force show"f x ≠ f y"if"x ∈ {a.."y ∈ {d<..b}"for x y proof (cases "f x = f m ∨ f y = f m") case True thenshow ?thesis using‹∧x. x ∈ {a..🚫==> f x ≠ f m› that by auto next case False have False if"f x = f y" proof - have"x ≤ m""m ≤ y" using‹c ≤ m›‹x ∈ {a..🚫›‹m ≤ d›‹y ∈ {d🚫b}›by auto thenhave"x ∈ ({0..1} ∩ f -` {f y})""y ∈ ({0..1} ∩ f -` {f y})" using‹x ∈ {a..🚫›‹y ∈ {d🚫b}› ab01 by (auto simp: that) thenhave"m ∈ ({0..1} ∩ f -` {f y})" by (meson ‹m ≤ y›‹x ≤ m› is_interval_connected_1 conn [of "f y"] is_interval_1) with False show False by auto qed thenshow ?thesis by auto qed qed qed thenobtain leftcut rightcut where LR: "∧a b m. [m ∈ {a..b}; {a..b} ⊆ {0..1}]==> (a ≤ leftcut a b m ∧ leftcut a b m ≤ m ∧ m ≤ rightcut a b m ∧ rightcut a b m ≤ b∧ (∀x ∈ {leftcut a b m..rightcut a b m}. f x = f m) ∧ (∀x ∈ {a..≠ f m) ∧ (∀x ∈ {rightcut a b m<..b}. f x ≠ f m) ∧ (∀x ∈ {a..∀y ∈ {rightcut a b m<..b}. f x ≠ f y))" apply atomize apply (clarsimp simp only: imp_conjL [symmetric] choice_iff choice_iff') apply (rule that, blast) done thenhave left_right: "∧a b m. [m ∈ {a..b}; {a..b} ⊆ {0..1}]==> a ≤ leftcut a b m ∧ rightcut a b m ≤ b" and left_right_m: "∧a b m. [m ∈ {a..b}; {a..b} ⊆ {0..1}]==> leftcut a b m ≤ m ∧ m≤ rightcut a b m" by auto have left_neq: "[a ≤ x; x < leftcut a b m; a ≤ m; m ≤ b; {a..b} ⊆ {0..1}]==> f x ≠ f m" and right_neq: "[rightcut a b m < x; x ≤ b; a ≤ m; m ≤ b; {a..b} ⊆ {0..1}]==> f x ≠ f m" and left_right_neq: "[a ≤ x; x < leftcut a b m; rightcut a b m < y; y ≤ b; a ≤ m; m ≤ b; {a..b} ⊆ {0..1}]==> f x ≠ f m" and feqm: "[leftcut a b m ≤ x; x ≤ rightcut a b m; a ≤ m; m ≤ b; {a..b} ⊆ {0..1}] ==> f x = f m"for a b m x y by (meson atLeastAtMost_iff greaterThanAtMost_iff atLeastLessThan_iff LR)+ have f_eqI: "∧a b m x y. [leftcut a b m ≤ x; x ≤ rightcut a b m; leftcut a b m ≤ y; y ≤ rightcut a b m; a ≤ m; m ≤ b; {a..b} ⊆ {0..1}]==> f x = f y" by (metis feqm)
define u where"u ≡ rightcut 0 1 0" have lc[simp]: "leftcut 0 1 0 = 0"and u01: "0 ≤ u""u ≤ 1" using LR [of 0 0 1] by (auto simp: u_def) have f0u: "∧x. x ∈ {0..u} ==> f x = f 0" using LR [of 0 0 1] unfolding u_def [symmetric] by (metis ‹leftcut 0 1 0 = 0› atLeastAtMost_iff order_refl zero_le_one) have fu1: "∧x. x ∈ {u<..1} ==> f x ≠ f 0" using LR [of 0 0 1] unfolding u_def [symmetric] by fastforce
define v where"v ≡ leftcut u 1 1" have rc[simp]: "rightcut u 1 1 = 1"and v01: "u ≤ v""v ≤ 1" using LR [of 1 u 1] u01 by (auto simp: v_def) have fuv: "∧x. x ∈ {u..==> f x ≠ f 1" using LR [of 1 u 1] u01 v_def by fastforce have f0v: "∧x. x ∈ {0..==> f x ≠ f 1" by (metis f_1not0 atLeastAtMost_iff atLeastLessThan_iff f0u fuv linear) have fv1: "∧x. x ∈ {v..1} ==> f x = f 1" using LR [of 1 u 1] u01 v_def by (metis atLeastAtMost_iff atLeastatMost_subset_iff order_refl rc)
define a where"a ≡ leftrec u v leftcut rightcut"
define b where"b ≡ rightrec u v leftcut rightcut"
define c where"c ≡ λx. midpoint (a x) (b x)" have a_real [simp]: "a (real j) = u"for j using a_def leftrec_base by (metis nonzero_mult_div_cancel_right of_nat_mult of_nat_numeral zero_neq_numeral) have b_real [simp]: "b (real j) = v"for j using b_def rightrec_base by (metis nonzero_mult_div_cancel_right of_nat_mult of_nat_numeral zero_neq_numeral) have a41: "a ((4 * real m + 1) / 2^Suc n) = a ((2 * real m + 1) / 2^n)"if"n > 0"for m n using that a_def leftrec_41 by blast have b41: "b ((4 * real m + 1) / 2^Suc n) = leftcut (a ((2 * real m + 1) / 2^n)) (b ((2 * real m + 1) / 2^n)) (c ((2 * real m + 1) / 2^n))"if"n > 0"for m n using that a_def b_def c_def rightrec_41 by blast have a43: "a ((4 * real m + 3) / 2^Suc n) = rightcut (a ((2 * real m + 1) / 2^n)) (b ((2 * real m + 1) / 2^n)) (c ((2 * real m + 1) / 2^n))"if"n > 0"for m n using that a_def b_def c_def leftrec_43 by blast have b43: "b ((4 * real m + 3) / 2^Suc n) = b ((2 * real m + 1) / 2^n)"if"n > 0"for m n using that b_def rightrec_43 by blast have uabv: "u ≤ a (real m / 2 ^ n) ∧ a (real m / 2 ^ n) ≤ b (real m / 2 ^ n) ∧ b (real m / 2 ^ n) ≤ v"for m n proof (induction n arbitrary: m) case 0 thenshow ?caseby (simp add: v01) next case (Suc n p) show ?case proof (cases "even p") case True thenobtain m where"p = 2*m"by (metis evenE) thenshow ?thesis by (simp add: Suc.IH) next case False thenobtain m where m: "p = 2*m + 1"by (metis oddE) show ?thesis proof (cases n) case 0 thenshow ?thesis by (simp add: a_def b_def leftrec_base rightrec_base v01) next case (Suc n') thenhave"n > 0"by simp have a_le_c: "a (real m / 2^n) ≤ c (real m / 2^n)"for m unfolding c_def by (metis Suc.IH ge_midpoint_1) have c_le_b: "c (real m / 2^n) ≤ b (real m / 2^n)"for m unfolding c_def by (metis Suc.IH le_midpoint_1) have c_ge_u: "c (real m / 2^n) ≥ u"for m using Suc.IH a_le_c order_trans by blast have c_le_v: "c (real m / 2^n) ≤ v"for m using Suc.IH c_le_b order_trans by blast have a_ge_0: "0 ≤ a (real m / 2^n)"for m using Suc.IH order_trans u01(1) by blast have b_le_1: "b (real m / 2^n) ≤ 1"for m using Suc.IH order_trans v01(2) by blast have left_le: "leftcut (a ((real m) / 2^n)) (b ((real m) / 2^n)) (c ((real m) / 2^n)) ≤ c ((real m) / 2^n)"for m by (simp add: LR a_ge_0 a_le_c b_le_1 c_le_b) have right_ge: "rightcut (a ((real m) / 2^n)) (b ((real m) / 2^n)) (c ((real m) / 2^n)) ≥ c ((real m) / 2^n)"for m by (simp add: LR a_ge_0 a_le_c b_le_1 c_le_b) show ?thesis proof (cases "even m") case True thenobtain r where r: "m = 2*r"by (metis evenE) show ?thesis using order_trans [OF left_le c_le_v, of "1+2*r"] Suc.IH [of "m+1"] using a_le_c [of "m+1"] c_le_b [of "m+1"] a_ge_0 [of "m+1"] b_le_1 [of "m+1"] left_right ‹n > 0› by (simp_all add: r m add.commute [of 1] a41 b41 del: power_Suc) next case False thenobtain r where r: "m = 2*r + 1"by (metis oddE) show ?thesis using order_trans [OF c_ge_u right_ge, of "1+2*r"] Suc.IH [of "m"] using a_le_c [of "m"] c_le_b [of "m"] a_ge_0 [of "m"] b_le_1 [of "m"] left_right ‹n > 0› apply (simp_all add: r m add.commute [of 3] a43 b43 del: power_Suc) by (simp add: add.commute) qed qed qed qed have a_ge_0 [simp]: "0 ≤ a(m / 2^n)"and b_le_1 [simp]: "b(m / 2^n) ≤ 1"for m::nat and n using uabv order_trans u01 v01 by blast+ thenhave b_ge_0 [simp]: "0 ≤ b(m / 2^n)"and a_le_1 [simp]: "a(m / 2^n) ≤ 1"for m::nat and n using uabv order_trans by blast+ have alec [simp]: "a(m / 2^n) ≤ c(m / 2^n)"and cleb [simp]: "c(m / 2^n) ≤ b(m / 2^n)"for m::nat and n by (auto simp: c_def ge_midpoint_1 le_midpoint_1 uabv) have c_ge_0 [simp]: "0 ≤ c(m / 2^n)"and c_le_1 [simp]: "c(m / 2^n) ≤ 1"for m::nat and n using a_ge_0 alec b_le_1 cleb order_trans by blast+ have"[d = m-n; odd j; ∣real i / 2^m - real j / 2^n∣ < 1/2 ^ n] ==> (a(j / 2^n)) ≤ (c(i / 2^m)) ∧ (c(i / 2^m)) ≤ (b(j / 2^n))"for d i j m n proof (induction d arbitrary: j n rule: less_induct) case (less d j n) show ?case proof (cases "m ≤ n") case True have"∣2^n∣ * ∣real i / 2^m - real j / 2^n∣ = 0" proof (rule Ints_nonzero_abs_less1) have"(real i * 2^n - real j * 2^m) / 2^m = (real i * 2^n) / 2^m - (real j * 2^m) / 2^m" using diff_divide_distrib by blast alsohave"... = (real i * 2 ^ (n-m)) - (real j)" using True by (auto simp: power_diff field_simps) alsohave"... ∈ℤ" by simp finallyhave"(real i * 2^n - real j * 2^m) / 2^m ∈ℤ" . with True Ints_abs show"∣2^n∣ * ∣real i / 2^m - real j / 2^n∣∈ℤ" by (fastforce simp: field_split_simps) show"∣∣2^n∣ * ∣real i / 2^m - real j / 2^n∣∣ < 1" using less.prems by (auto simp: field_split_simps) qed thenhave"real i / 2^m = real j / 2^n" by auto thenshow ?thesis by auto next case False thenhave"n < m"by auto obtain k where k: "j = Suc (2*k)" using‹odd j› oddE by fastforce show ?thesis proof (cases "n > 0") case False thenhave"a (real j / 2^n) = u" by simp alsohave"... ≤ c (real i / 2^m)" using alec uabv by (blast intro: order_trans) finallyhave ac: "a (real j / 2^n) ≤ c (real i / 2^m)" . have"c (real i / 2^m) ≤ v" using cleb uabv by (blast intro: order_trans) alsohave"... = b (real j / 2^n)" using False by simp finallyshow ?thesis by (auto simp: ac) next case True show ?thesis proof (cases "i / 2^m""j / 2^n" rule: linorder_cases) case less moreoverhave"real (4 * k + 1) / 2 ^ Suc n + 1 / (2 ^ Suc n) = real j / 2 ^ n" using k by (force simp: field_split_simps) moreoverhave"∣real i / 2 ^ m - j / 2 ^ n∣ < 2 / (2 ^ Suc n)" using less.prems by simp ultimatelyhave closer: "∣real i / 2 ^ m - real (4 * k + 1) / 2 ^ Suc n∣ < 1 / (2 ^ Suc n)" using less.prems by linarith have"a (real (4 * k + 1) / 2 ^ Suc n) ≤ c (i / 2 ^ m) ∧ c (real i / 2 ^ m) ≤ b (real (4 * k + 1) / 2 ^ Suc n)" proof (rule less.IH [OF _ refl]) show"m - Suc n < d" using‹n 🚫› diff_less_mono2 less.prems(1) lessI by presburger show"∣real i / 2 ^ m - real (4 * k + 1) / 2 ^ Suc n∣ < 1 / 2 ^ Suc n" using closer ‹n 🚫›‹d = m - n›by (auto simp: field_split_simps ‹n 🚫› diff_less_mono2) qed auto thenshow ?thesis using LR [of "c((2*k + 1) / 2^n)""a((2*k + 1) / 2^n)""b((2*k + 1) / 2^n)"] using alec [of "2*k+1"] cleb [of "2*k+1"] a_ge_0 [of "2*k+1"] b_le_1 [of "2*k+1"] using k a41 b41 ‹0 🚫› by (simp add: add.commute) next case equal thenshow ?thesis by simp next case greater moreoverhave"real (4 * k + 3) / 2 ^ Suc n - 1 / (2 ^ Suc n) = real j / 2 ^ n" using k by (force simp: field_split_simps) moreoverhave"∣real i / 2 ^ m - real j / 2 ^ n∣ < 2 * 1 / (2 ^ Suc n)" using less.prems by simp ultimatelyhave closer: "∣real i / 2 ^ m - real (4 * k + 3) / 2 ^ Suc n∣ < 1 / (2 ^ Suc n)" using less.prems by linarith have"a (real (4 * k + 3) / 2 ^ Suc n) ≤ c (real i / 2 ^ m) ∧ c (real i / 2 ^ m) ≤ b (real (4 * k + 3) / 2 ^ Suc n)" proof (rule less.IH [OF _ refl]) show"m - Suc n < d" using‹n 🚫› diff_less_mono2 less.prems(1) by blast show"∣real i / 2 ^ m - real (4 * k + 3) / 2 ^ Suc n∣ < 1 / 2 ^ Suc n" using closer ‹n 🚫›‹d = m - n›by (auto simp: field_split_simps ‹n 🚫› diff_less_mono2) qed auto thenshow ?thesis using LR [of "c((2*k + 1) / 2^n)""a((2*k + 1) / 2^n)""b((2*k + 1) / 2^n)"] using alec [of "2*k+1"] cleb [of "2*k+1"] a_ge_0 [of "2*k+1"] b_le_1 [of "2*k+1"] using k a43 b43 ‹0 🚫› by (simp add: add.commute) qed qed qed qed thenhave aj_le_ci: "a (real j / 2 ^ n) ≤ c (real i / 2 ^ m)" and ci_le_bj: "c (real i / 2 ^ m) ≤ b (real j / 2 ^ n)"if"odd j""∣real i / 2^m - real j / 2^n∣ < 1/2 ^ n"for i j m n using that by blast+ have close_ab: "odd m ==>∣a (real m / 2 ^ n) - b (real m / 2 ^ n)∣≤ 2 / 2^n"for m n proof (induction n arbitrary: m) case 0 with u01 v01 show ?caseby auto next case (Suc n m) with oddE obtain k where k: "m = Suc (2*k)"by fastforce show ?case proof (cases "n > 0") case False with u01 v01 show ?thesis by (simp add: a_def b_def leftrec_base rightrec_base) next case True show ?thesis proof (cases "even k") case True thenobtain j where j: "k = 2*j"by (metis evenE) have"∣a ((2 * real j + 1) / 2 ^ n) - (b ((2 * real j + 1) / 2 ^ n))∣≤ 2/2 ^ n" proof - have"odd (Suc k)" using True by auto thenshow ?thesis by (metis (no_types) Groups.add_ac(2) Suc.IH j of_nat_Suc of_nat_mult of_nat_numeral) qed moreoverhave"a ((2 * real j + 1) / 2 ^ n) ≤ leftcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n))" using alec [of "2*j+1"] cleb [of "2*j+1"] a_ge_0 [of "2*j+1"] b_le_1 [of "2*j+1"] by (auto simp: add.commute left_right) moreoverhave"leftcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n)) ≤ c ((2 * real j + 1) / 2 ^ n)" using alec [of "2*j+1"] cleb [of "2*j+1"] a_ge_0 [of "2*j+1"] b_le_1 [of "2*j+1"] by (auto simp: add.commute left_right_m) ultimatelyhave"∣a ((2 * real j + 1) / 2 ^ n) - leftcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n))∣ ≤ 2/2 ^ Suc n" by (simp add: c_def midpoint_def) with j k ‹n > 0›show ?thesis by (simp add: add.commute [of 1] a41 b41 del: power_Suc) next case False thenobtain j where j: "k = 2*j + 1"by (metis oddE) have"∣a ((2 * real j + 1) / 2 ^ n) - (b ((2 * real j + 1) / 2 ^ n))∣≤ 2/2 ^ n" using Suc.IH [OF False] j by (auto simp: algebra_simps) moreoverhave"c ((2 * real j + 1) / 2 ^ n) ≤ rightcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n))" using alec [of "2*j+1"] cleb [of "2*j+1"] a_ge_0 [of "2*j+1"] b_le_1 [of "2*j+1"] by (auto simp: add.commute left_right_m) moreoverhave"rightcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n)) ≤ b ((2 * real j + 1) / 2 ^ n)" using alec [of "2*j+1"] cleb [of "2*j+1"] a_ge_0 [of "2*j+1"] b_le_1 [of "2*j+1"] by (auto simp: add.commute left_right) ultimatelyhave"∣rightcut (a ((2 * real j + 1) / 2 ^ n)) (b ((2 * real j + 1) / 2 ^ n)) (c ((2 * real j + 1) / 2 ^ n)) - b ((2 * real j + 1) / 2 ^ n)∣≤ 2/2 ^ Suc n" by (simp add: c_def midpoint_def) with j k ‹n > 0›show ?thesis by (simp add: add.commute [of 3] a43 b43 del: power_Suc) qed qed qed have m1_to_3: "4 * real k - 1 = real (4 * (k-1)) + 3"if"0 < k"for k using that by auto have fb_eq_fa: "[0 < j; 2*j < 2 ^ n]==> f(b((2 * real j - 1) / 2^n)) = f(a((2 * real j + 1) / 2^n))"for n j proof (induction n arbitrary: j) case 0 thenshow ?caseby auto next case (Suc n j) show ?case proof (cases "n > 0") case False with Suc.prems show ?thesis by auto next case True show ?thesis proof (cases "even j") case True thenobtain k where k: "j = 2*k"by (metis evenE) with‹0 🚫›have"k > 0""2 * k < 2 ^ n" using Suc.prems(2) k by auto with k ‹0 🚫› Suc.IH [of k] show ?thesis apply (simp add: m1_to_3 a41 b43 del: power_Suc of_nat_diff) by simp next case False thenobtain k where k: "j = 2*k + 1"by (metis oddE) have"f (leftcut (a ((2 * k + 1) / 2^n)) (b ((2 * k + 1) / 2^n)) (c ((2 * k + 1) / 2^n))) = f (c ((2 * k + 1) / 2^n))" "f (c ((2 * k + 1) / 2^n)) = f (rightcut (a ((2 * k + 1) / 2^n)) (b ((2 * k + 1) / 2^n)) (c ((2 * k + 1) / 2^n)))" using alec [of "2*k+1" n] cleb [of "2*k+1" n] a_ge_0 [of "2*k+1" n] b_le_1 [of "2*k+1" n] k using left_right_m [of "c((2*k + 1) / 2^n)""a((2*k + 1) / 2^n)""b((2*k + 1) / 2^n)"] by (auto simp: add.commute feqm [OF order_refl] feqm [OF _ order_refl, symmetric]) then show ?thesis by (simp add: k add.commute [of 1] add.commute [of 3] a43 b41‹0 🚫› del: power_Suc) qed qed qed have f_eq_fc: "[0 < j; j < 2 ^ n] ==> f(b((2*j - 1) / 2 ^ (Suc n))) = f(c(j / 2^n)) ∧ f(a((2*j + 1) / 2 ^ (Suc n))) = f(c(j / 2^n))"for n and j::nat proof (induction n arbitrary: j) case 0 thenshow ?caseby auto next case (Suc n) show ?case proof (cases "even j") case True thenobtain k where k: "j = 2*k"by (metis evenE) thenhave less2n: "k < 2 ^ n" using Suc.prems(2) by auto have"0 < k"using‹0 🚫› k by linarith thenhave m1_to_3: "real (4 * k - Suc 0) = real (4 * (k-1)) + 3" by auto thenshow ?thesis using Suc.IH [of k] k ‹0 🚫› by (simp add: less2n add.commute [of 1] m1_to_3 a41 b43 del: power_Suc of_nat_diff) auto next case False thenobtain k where k: "j = 2*k + 1"by (metis oddE) with Suc.prems have"k < 2^n"by auto show ?thesis using alec [of "2*k+1""Suc n"] cleb [of "2*k+1""Suc n"] a_ge_0 [of "2*k+1""Suc n"] b_le_1 [of "2*k+1""Suc n"] k using left_right_m [of "c((2*k + 1) / 2 ^ Suc n)""a((2*k + 1) / 2 ^ Suc n)""b((2*k + 1) / 2 ^ Suc n)"] apply (simp add: add.commute [of 1] add.commute [of 3] m1_to_3 b41 a43 del: power_Suc) apply (force intro: feqm) done qed qed
define D01 where"D01 ≡ {0<..<1} ∩ (∪k m. {real m / 2^k})" have cloD01 [simp]: "closure D01 = {0..1}" unfolding D01_def by (subst closure_dyadic_rationals_in_convex_set_pos_1) auto have"uniformly_continuous_on D01 (f ∘ c)" proof (clarsimp simp: uniformly_continuous_on_def) fix e::real assume"0 < e" have ucontf: "uniformly_continuous_on {0..1} f" by (simp add: compact_uniformly_continuous [OF cont_f]) thenobtain d where"0 < d"and d: "∧x x'. [x ∈ {0..1}; x' ∈ {0..1}; norm (x' - x) < d]==> norm (f x' - f x) < e/2" unfolding uniformly_continuous_on_def dist_norm by (metis ‹0 🚫› less_divide_eq_numeral1(1) mult_zero_left) obtain n where n: "1/2^n < min d 1" by (metis ‹0 🚫› divide_less_eq_1 less_numeral_extra(1) min_def one_less_numeral_iff power_one_over real_arch_pow_inv semiring_norm(76) zero_less_numeral) with gr0I have"n > 0" by (force simp: field_split_simps) show"∃d>0. ∀x∈D01. ∀x'∈D01. dist x' x < d ⟶ dist (f (c x')) (f (c x)) < e" proof (intro exI ballI impI conjI) show"(0::real) < 1/2^n"by auto next have dist_fc_close: "dist (f(c(real i / 2^m))) (f(c(real j / 2^n))) < e/2" if i: "0 < i""i < 2 ^ m"and j: "0 < j""j < 2 ^ n"and clo: "abs(i / 2^m - j / 2^n) < 1/2 ^ n"for i j m proof - have abs3: "∣x - a∣ < e ==> x = a ∨∣x - (a - e/2)∣ < e/2 ∨∣x - (a + e/2)∣ < e/2"for x a e::real by linarith
consider "i / 2 ^ m = j / 2 ^ n"
| "∣i / 2 ^ m - (2 * j - 1) / 2 ^ Suc n∣ < 1/2 ^ Suc n"
| "∣i / 2 ^ m - (2 * j + 1) / 2 ^ Suc n∣ < 1/2 ^ Suc n" using abs3 [OF clo] j by (auto simp: field_simps of_nat_diff) thenshow ?thesis proof cases case 1 with‹0 🚫›show ?thesis by auto next case 2 have *: "abs(a - b) ≤ 1/2 ^ n ∧ 1/2 ^ n < d ∧ a ≤ c ∧ c ≤ b ==> b - c < d"for a b c by auto have"norm (c (real i / 2 ^ m) - b (real (2 * j - 1) / 2 ^ Suc n)) < d" using 2 j n close_ab [of "2*j-1""Suc n"] using b_ge_0 [of "2*j-1""Suc n"] b_le_1 [of "2*j-1""Suc n"] using aj_le_ci [of "2*j-1" i m "Suc n"] using ci_le_bj [of "2*j-1" i m "Suc n"] apply (simp add: divide_simps of_nat_diff del: power_Suc) apply (auto simp: divide_simps intro!: *) done moreoverhave"f(c(j / 2^n)) = f(b ((2*j - 1) / 2 ^ (Suc n)))" using f_eq_fc [OF j] by metis ultimatelyshow ?thesis by (metis dist_norm atLeastAtMost_iff b_ge_0 b_le_1 c_ge_0 c_le_1 d) next case 3 have *: "abs(a - b) ≤ 1/2 ^ n ∧ 1/2 ^ n < d ∧ a ≤ c ∧ c ≤ b ==> c - a < d"for a b c by auto have"norm (c (real i / 2 ^ m) - a (real (2 * j + 1) / 2 ^ Suc n)) < d" using 3 j n close_ab [of "2*j+1""Suc n"] using b_ge_0 [of "2*j+1""Suc n"] b_le_1 [of "2*j+1""Suc n"] using aj_le_ci [of "2*j+1" i m "Suc n"] using ci_le_bj [of "2*j+1" i m "Suc n"] apply (simp add: divide_simps of_nat_diff del: power_Suc) apply (auto simp: divide_simps intro!: *) done moreoverhave"f(c(j / 2^n)) = f(a ((2*j + 1) / 2 ^ (Suc n)))" using f_eq_fc [OF j] by metis ultimatelyshow ?thesis by (metis dist_norm a_ge_0 atLeastAtMost_iff a_ge_0 a_le_1 c_ge_0 c_le_1 d) qed qed show"dist (f (c x')) (f (c x)) < e" if"x ∈ D01""x' ∈ D01""dist x' x < 1/2^n"for x x' using that unfolding D01_def dyadics_in_open_unit_interval proof clarsimp fix i k::nat and m p assume i: "0 < i""i < 2 ^ m"and k: "0"k < 2 ^ p" assume clo: "dist (real k / 2 ^ p) (real i / 2 ^ m) < 1/2 ^ n" obtain j::nat where"0 < j""j < 2 ^ n" and clo_ij: "abs(i / 2^m - j / 2^n) < 1/2 ^ n" and clo_kj: "abs(k / 2^p - j / 2^n) < 1/2 ^ n" proof - have"max (2^n * i / 2^m) (2^n * k / 2^p) ≥ 0" by (auto simp: le_max_iff_disj) thenobtain j where"floor (max (2^n*i / 2^m) (2^n*k / 2^p)) = int j" using zero_le_floor zero_le_imp_eq_int by blast thenhave j_le: "real j ≤ max (2^n * i / 2^m) (2^n * k / 2^p)" and less_j1: "max (2^n * i / 2^m) (2^n * k / 2^p) < real j + 1" using floor_correct [of "max (2^n * i / 2^m) (2^n * k / 2^p)"] by linarith+ show thesis proof (cases "j = 0") case True show thesis proof show"(1::nat) < 2 ^ n" by (metis Suc_1 ‹0 🚫› lessI one_less_power) show"∣real i / 2 ^ m - real 1/2 ^ n∣ < 1/2 ^ n" using i less_j1 by (simp add: dist_norm field_simps True) show"∣real k / 2 ^ p - real 1/2 ^ n∣ < 1/2 ^ n" using k less_j1 by (simp add: dist_norm field_simps True) qed simp next case False have 1: "real j * 2 ^ m < real i * 2 ^ n" if j: "real j * 2 ^ p ≤ real k * 2 ^ n"and k: "real k * 2 ^ m < real i * 2 ^ p" for i k m p proof - have"real j * 2 ^ p * 2 ^ m ≤ real k * 2 ^ n * 2 ^ m" using j by simp moreoverhave"real k * 2 ^ m * 2 ^ n < real i * 2 ^ p * 2 ^ n" using k by simp ultimatelyhave"real j * 2 ^ p * 2 ^ m < real i * 2 ^ p * 2 ^ n" by (simp only: mult_ac) thenshow ?thesis by simp qed have 2: "real j * 2 ^ m < 2 ^ m + real i * 2 ^ n" if j: "real j * 2 ^ p ≤ real k * 2 ^ n"and k: "real k * (2 ^ m * 2 ^ n) < 2 ^ m * 2 ^ p + real i * (2 ^ n * 2 ^ p)" for i k m p proof - have"real j * 2 ^ p * 2 ^ m ≤ real k * (2 ^ m * 2 ^ n)" using j by simp alsohave"... < 2 ^ m * 2 ^ p + real i * (2 ^ n * 2 ^ p)" by (rule k) finallyhave"(real j * 2 ^ m) * 2 ^ p < (2 ^ m + real i * 2 ^ n) * 2 ^ p" by (simp add: algebra_simps) thenshow ?thesis by simp qed have 3: "real j * 2 ^ p < 2 ^ p + real k * 2 ^ n" if j: "real j * 2 ^ m ≤ real i * 2 ^ n"and i: "real i * 2 ^ p ≤ real k * 2 ^ m" proof - have"real j * 2 ^ m * 2 ^ p ≤ real i * 2 ^ n * 2 ^ p" using j by simp moreoverhave"real i * 2 ^ p * 2 ^ n ≤ real k * 2 ^ m * 2 ^ n" using i by simp ultimatelyhave"real j * 2 ^ m * 2 ^ p ≤ real k * 2 ^ m * 2 ^ n" by (simp only: mult_ac) thenhave"real j * 2 ^ p ≤ real k * 2 ^ n" by simp alsohave"... < 2 ^ p + real k * 2 ^ n" by auto finallyshow ?thesis by simp qed show ?thesis proof have"2 ^ n * real i / 2 ^ m < 2 ^ n""2 ^ n * real k / 2 ^ p < 2 ^ n" using i k by (auto simp: field_simps) thenhave"max (2^n * i / 2^m) (2^n * k / 2^p) < 2^n" by simp with j_le have"real j < 2 ^ n"by linarith thenshow"j < 2 ^ n" by auto have"∣real i * 2 ^ n - real j * 2 ^ m∣ < 2 ^ m" using clo less_j1 j_le by (auto simp: le_max_iff_disj field_split_simps dist_norm abs_if split: if_split_asm dest: 1 2) thenshow"∣real i / 2 ^ m - real j / 2 ^ n∣ < 1/2 ^ n" by (auto simp: field_split_simps) have"∣real k * 2 ^ n - real j * 2 ^ p∣ < 2 ^ p" using clo less_j1 j_le by (auto simp: le_max_iff_disj field_split_simps dist_norm abs_if split: if_split_asm dest: 3 2) thenshow"∣real k / 2 ^ p - real j / 2 ^ n∣ < 1/2 ^ n" by (auto simp: le_max_iff_disj field_split_simps dist_norm) qed (use False in simp) qed qed show"dist (f (c (real k / 2 ^ p))) (f (c (real i / 2 ^ m))) < e" proof (rule dist_triangle_half_l) show"dist (f (c (real k / 2 ^ p))) (f(c(j / 2^n))) < e/2" using‹0 🚫›‹j 🚫 ^ n› k clo_kj by (intro dist_fc_close) auto show"dist (f (c (real i / 2 ^ m))) (f (c (real j / 2 ^ n))) < e/2" using‹0 🚫›‹j 🚫 ^ n› i clo_ij by (intro dist_fc_close) auto qed qed qed qed thenobtain h where ucont_h: "uniformly_continuous_on {0..1} h" and fc_eq: "∧x. x ∈ D01 ==> (f ∘ c) x = h x" proof (rule uniformly_continuous_on_extension_on_closure [of D01 "f ∘ c"]) qed (use closure_subset [of D01] in‹auto intro!: that›) thenhave cont_h: "continuous_on {0..1} h" using uniformly_continuous_imp_continuous by blast have h_eq: "h (real k / 2 ^ m) = f (c (real k / 2 ^ m))"if"0 < k""k < 2^m"for k m using fc_eq that by (force simp: D01_def) have"h ` {0..1} = f ` {0..1}" proof have"h ` (closure D01) ⊆ f ` {0..1}" proof (rule image_closure_subset) show"continuous_on (closure D01) h" using cont_h by simp show"closed (f ` {0..1})" using compact_continuous_image [OF cont_f] compact_imp_closed by blast show"h ` D01 ⊆ f ` {0..1}" by (force simp: dyadics_in_open_unit_interval D01_def h_eq) qed with cloD01 show"h ` {0..1} ⊆ f ` {0..1}"by simp have a12 [simp]: "a (1/2) = u" by (metis a_def leftrec_base numeral_One of_nat_numeral) have b12 [simp]: "b (1/2) = v" by (metis b_def rightrec_base numeral_One of_nat_numeral) have"f ` {0..1} ⊆ closure(h ` D01)" proof (clarsimp simp: closure_approachable dyadics_in_open_unit_interval D01_def) fix x e::real assume"0 ≤ x""x ≤ 1""0 < e" have ucont_f: "uniformly_continuous_on {0..1} f" using compact_uniformly_continuous cont_f by blast thenobtain δ where"δ > 0" and δ: "∧x x'. [x ∈ {0..1}; x' ∈ {0..1}; dist x' x < δ]==> norm (f x' - f x) < e" using‹0 🚫›by (auto simp: uniformly_continuous_on_def dist_norm) have *: "∃m::nat. ∃y. odd m ∧ 0 < m ∧ m < 2 ^ n ∧ y ∈ {a(m / 2^n) .. b(m / 2^n)} ∧ f y = f x" if"n ≠ 0"for n using that proof (induction n) case 0 thenshow ?caseby auto next case (Suc n) show ?case proof (cases "n=0") case True
consider "x ∈ {0..u}" | "x ∈ {u..v}" | "x ∈ {v..1}" using‹0 ≤ x›‹x ≤ 1›by force thenhave"∃y≥a (real 1/2). y ≤ b (real 1/2) ∧ f y = f x" proof cases case 1 thenshow ?thesis using uabv [of 1 1] f0u [of u] f0u [of x] by force next case 2 thenshow ?thesis by (rule_tac x=x in exI) auto next case 3 thenshow ?thesis using uabv [of 1 1] fv1 [of v] fv1 [of x] by force qed with‹n=0›show ?thesis by (rule_tac x=1 in exI) auto next case False with Suc obtain m y where"odd m""0 < m"and mless: "m < 2 ^ n" and y: "y ∈ {a (real m / 2 ^ n)..b (real m / 2 ^ n)}"and feq: "f y = f x" by metis thenobtain j where j: "m = 2*j + 1"by (metis oddE) have j4: "4 * j + 1 < 2 ^ Suc n" using mless j by (simp add: algebra_simps)
consider "y ∈ {a((2*j + 1) / 2^n) .. b((4*j + 1) / 2 ^ (Suc n))}"
| "y ∈ {b((4*j + 1) / 2 ^ (Suc n)) .. a((4*j + 3) / 2 ^ (Suc n))}"
| "y ∈ {a((4*j + 3) / 2 ^ (Suc n)) .. b((2*j + 1) / 2^n)}" using y j by force thenshow ?thesis proof cases case 1 show ?thesis proof (intro exI conjI) show"y ∈ {a (real (4 * j + 1) / 2 ^ Suc n)..b (real (4 * j + 1) / 2 ^ Suc n)}" using mless j ‹n ≠ 0› 1 by (simp add: a41 b41 add.commute [of 1] del: power_Suc) qed (use feq j4 in auto) next case 2 show ?thesis proof (intro exI conjI) show"b (real (4 * j + 1) / 2 ^ Suc n) ∈ {a (real (4 * j + 1) / 2 ^ Suc n)..b (real (4 * j + 1) / 2 ^ Suc n)}" using‹n ≠ 0› alec [of "2*j+1" n] cleb [of "2*j+1" n] a_ge_0 [of "2*j+1" n] b_le_1 [of "2*j+1" n] using left_right [of "c((2*j + 1) / 2^n)""a((2*j + 1) / 2^n)""b((2*j + 1) / 2^n)"] by (simp add: a41 b41 add.commute [of 1] del: power_Suc) show"f (b (real (4 * j + 1) / 2 ^ Suc n)) = f x" using‹n ≠ 0› 2 using alec [of "2*j+1" n] cleb [of "2*j+1" n] a_ge_0 [of "2*j+1" n] b_le_1 [of "2*j+1" n] by (force simp add: b41 a43 add.commute [of 1] feq [symmetric] simp del: power_Suc intro: f_eqI) qed (use j4 in auto) next case 3 show ?thesis proof (intro exI conjI) show"4 * j + 3 < 2 ^ Suc n" using mless j by simp show"f y = f x" by fact show"y ∈ {a (real (4 * j + 3) / 2 ^ Suc n) .. b (real (4 * j + 3) / 2 ^ Suc n)}" using 3 False b43 [of n j] by (simp add: add.commute) qed (use 3 in auto) qed qed qed obtain n where n: "1/2^n < min (δ / 2) 1" by (metis ‹0 🚫δ› divide_less_eq_1 less_numeral_extra(1) min_less_iff_conj one_less_numeral_iff power_one_over real_arch_pow_inv semiring_norm(76) zero_less_divide_iff zero_less_numeral) with gr0I have"n ≠ 0" by fastforce with * obtain m::nat and y where"odd m""0 < m"and mless: "m < 2 ^ n" and y: "a(m / 2^n) ≤ y ∧ y ≤ b(m / 2^n)"and feq: "f x = f y" by (metis atLeastAtMost_iff) thenhave"0 ≤ y""y ≤ 1" by (meson a_ge_0 b_le_1 order.trans)+ moreoverhave"y < δ + c (real m / 2 ^ n)""c (real m / 2 ^ n) < δ + y" using y alec [of m n] cleb [of m n] n field_sum_of_halves close_ab [OF ‹odd m›, of n] by linarith+ moreovernote‹0 🚫› mless ‹0 ≤ x›‹x ≤ 1› ultimatelyhave"dist (h (real m / 2 ^ n)) (f x) < e" by (auto simp: dist_norm h_eq feq δ) thenshow"∃k. ∃m∈{0<..<2 ^ k}. dist (h (real m / 2 ^ k)) (f x) < e" using‹0 🚫› greaterThanLessThan_iff mless by blast qed alsohave"... ⊆ h ` {0..1}" proof (rule closure_minimal) show"h ` D01 ⊆ h ` {0..1}" using cloD01 closure_subset by blast show"closed (h ` {0..1})" using compact_continuous_image [OF cont_h] compact_imp_closed by auto qed finallyshow"f ` {0..1} ⊆ h ` {0..1}" . qed moreoverhave"inj_on h {0..1}" proof - have"u < v" by (metis atLeastAtMost_iff f0u f_1not0 fv1 order.not_eq_order_implies_strict u01(1) u01(2) v01(1)) have f_not_fu: "∧x. [u < x; x ≤ v]==> f x ≠ f u" by (metis atLeastAtMost_iff f0u fu1 greaterThanAtMost_iff order_refl order_trans u01(1) v01(2)) have f_not_fv: "∧x. [u ≤ x; x < v]==> f x ≠ f v" by (metis atLeastAtMost_iff order_refl order_trans v01(2) atLeastLessThan_iff fuv fv1) have a_less_b: "a(j / 2^n) < b(j / 2^n) ∧ (∀x. a(j / 2^n) < x ⟶ x ≤ b(j / 2^n) ⟶ f x ≠ f(a(j / 2^n))) ∧ (∀x. a(j / 2^n) ≤ x ⟶ x < b(j / 2^n) ⟶ f x ≠ f(b(j / 2^n)))"for n and j::nat proof (induction n arbitrary: j) case 0 thenshow ?case by (simp add: ‹u 🚫› f_not_fu f_not_fv) next case (Suc n j) show ?case proof (cases "n > 0") case False thenshow ?thesis by (auto simp: a_def b_def leftrec_base rightrec_base ‹u 🚫› f_not_fu f_not_fv) next case True show ?thesis proof (cases "even j") case True with‹0 🚫› Suc.IH show ?thesis by (auto elim!: evenE) next case False thenobtain k where k: "j = 2*k + 1"by (metis oddE) thenshow ?thesis proof (cases "even k") case True thenobtain m where m: "k = 2*m"by (metis evenE) have fleft: "f (leftcut (a ((2*m + 1) / 2^n)) (b ((2*m + 1) / 2^n)) (c ((2*m + 1) / 2^n))) = f (c((2*m + 1) / 2^n))" using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right_m [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto intro: f_eqI) show ?thesis proof (intro conjI impI notI allI) have False if"b (real j / 2 ^ Suc n) ≤ a (real j / 2 ^ Suc n)" proof - have"f (c ((1 + real m * 2) / 2 ^ n)) = f (a ((1 + real m * 2) / 2 ^ n))" using k m ‹0 🚫› fleft that a41 [of n m] b41 [of n m] using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto simp: algebra_simps) moreoverhave"a (real (1 + m * 2) / 2 ^ n) < c (real (1 + m * 2) / 2 ^ n)" using Suc.IH [of "1 + m * 2"] by (simp add: c_def midpoint_def) moreoverhave"c (real (1 + m * 2) / 2 ^ n) ≤ b (real (1 + m * 2) / 2 ^ n)" using cleb by blast ultimatelyshow ?thesis using Suc.IH [of "1 + m * 2"] by force qed thenshow"a (real j / 2 ^ Suc n) < b (real j / 2 ^ Suc n)"by force next fix x assume"a (real j / 2 ^ Suc n) < x""x ≤ b (real j / 2 ^ Suc n)""f x = f (a (real j / 2 ^ Suc n))" thenshow False using Suc.IH [of "1 + m * 2", THEN conjunct2, THEN conjunct1] using k m ‹0 🚫› a41 [of n m] b41 [of n m] using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right_m [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto simp: algebra_simps) next fix x assume"a (real j / 2 ^ Suc n) ≤ x""x < b (real j / 2 ^ Suc n)""f x = f (b (real j / 2 ^ Suc n))" thenshow False using k m ‹0 🚫› a41 [of n m] b41 [of n m] fleft left_neq using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] by (auto simp: algebra_simps) qed next case False with oddE obtain m where m: "k = Suc (2*m)"by fastforce have fright: "f (rightcut (a ((2*m + 1) / 2^n)) (b ((2*m + 1) / 2^n)) (c ((2*m + 1) / 2^n))) = f (c((2*m + 1) / 2^n))" using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right_m [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto intro: f_eqI [OF _ order_refl]) show ?thesis proof (intro conjI impI notI allI) have False if"b (real j / 2 ^ Suc n) ≤ a (real j / 2 ^ Suc n)" proof - have"f (c ((1 + real m * 2) / 2 ^ n)) = f (b ((1 + real m * 2) / 2 ^ n))" using k m ‹0 🚫› fright that a43 [of n m] b43 [of n m] using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto simp: algebra_simps) moreoverhave"a (real (1 + m * 2) / 2 ^ n) ≤ c (real (1 + m * 2) / 2 ^ n)" using alec by blast moreoverhave"c (real (1 + m * 2) / 2 ^ n) < b (real (1 + m * 2) / 2 ^ n)" using Suc.IH [of "1 + m * 2"] by (simp add: c_def midpoint_def) ultimatelyshow ?thesis using Suc.IH [of "1 + m * 2"] by force qed thenshow"a (real j / 2 ^ Suc n) < b (real j / 2 ^ Suc n)"by force next fix x assume"a (real j / 2 ^ Suc n) < x""x ≤ b (real j / 2 ^ Suc n)""f x = f (a (real j / 2 ^ Suc n))" thenshow False using k m ‹0 🚫› a43 [of n m] b43 [of n m] fright right_neq using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] by (auto simp: algebra_simps) next fix x assume"a (real j / 2 ^ Suc n) ≤ x""x < b (real j / 2 ^ Suc n)""f x = f (b (real j / 2 ^ Suc n))" thenshow False using Suc.IH [of "1 + m * 2", THEN conjunct2, THEN conjunct2] using k m ‹0 🚫› a43 [of n m] b43 [of n m] using alec [of "2*m+1" n] cleb [of "2*m+1" n] a_ge_0 [of "2*m+1" n] b_le_1 [of "2*m+1" n] using left_right_m [of "c((2*m + 1) / 2^n)""a((2*m + 1) / 2^n)""b((2*m + 1) / 2^n)"] by (auto simp: algebra_simps fright simp del: power_Suc) qed qed qed qed qed have c_gt_0 [simp]: "0 < c(m / 2^n)"and c_less_1 [simp]: "c(m / 2^n) < 1"for m::nat and n using a_less_b [of m n] apply (simp_all add: c_def midpoint_def) using a_ge_0 [of m n] b_le_1 [of m n] by linarith+ have approx: "∃j n. odd j ∧ n ≠ 0 ∧ real i / 2^m ≤ real j / 2^n ∧ real j / 2^n ≤ real k / 2^p ∧ ∣real i / 2 ^ m - real j / 2 ^ n∣ < 1/2^n ∧ ∣real k / 2 ^ p - real j / 2 ^ n∣ < 1/2^n" if"0 < i""i < 2 ^ m""0 < k""k < 2 ^ p""i / 2^m < k / 2^p""m + p = N"for N m p i k using that proof (induction N arbitrary: m p i k rule: less_induct) case (less N) then consider "i / 2^m ≤ 1/2""1/2 ≤ k / 2^p" | "k / 2^p < 1/2" | "k / 2^p ≥ 1/2""1/2 < i / 2^m" by linarith thenshow ?case proof cases case 1 with less.prems show ?thesis by (rule_tac x=1 in exI)+ (fastforce simp: field_split_simps) next case 2 show ?thesis proof (cases m) case 0 with less.prems show ?thesis by auto next case (Suc m') show ?thesis proof (cases p) case 0 with less.prems show ?thesis by auto next case (Suc p') have🍋: False if"real i * 2 ^ p' < real k * 2 ^ m'""k < 2 ^ p'""2 ^ m' ≤ i" proof - have"real k * 2 ^ m' < 2 ^ p' * 2 ^ m'" using that by simp thenhave"real i * 2 ^ p' < 2 ^ p' * 2 ^ m'" using that by linarith with that show ?thesis by simp qed moreoverhave *: "real i / 2 ^ m' < real k / 2^p'""k < 2 ^ p'" using less.prems ‹m = Suc m'› 2 Suc by (force simp: field_split_simps)+ moreoverhave"i < 2 ^ m' " using🍋 * by (clarsimp simp: divide_simps linorder_not_le) (meson linorder_not_le) ultimatelyshow ?thesis using less.IH [of "m'+p'" i m' k p'] less.prems ‹m = Suc m'› 2 Suc by (force simp: field_split_simps) qed qed next case 3 show ?thesis proof (cases m) case 0 with less.prems show ?thesis by auto next case (Suc m') show ?thesis proof (cases p) case 0 with less.prems show ?thesis by auto next case (Suc p') have"real (i - 2 ^ m') / 2 ^ m' < real (k - 2 ^ p') / 2 ^ p'" using less.prems ‹m = Suc m'› Suc 3 by (auto simp: field_simps of_nat_diff) moreoverhave"k - 2 ^ p' < 2 ^ p'""i - 2 ^ m' < 2 ^ m'" using less.prems Suc ‹m = Suc m'›by auto moreover have"2 ^ p' ≤ k""2 ^ p' ≠ k" using less.prems ‹m = Suc m'› Suc 3 by auto thenhave"2 ^ p' < k" by linarith ultimatelyshow ?thesis using less.IH [of "m'+p'""i - 2^m'" m' "k - 2 ^ p'" p'] less.prems ‹m = Suc m'› Suc 3 apply (clarsimp simp: field_simps of_nat_diff) apply (rule_tac x="2 ^ n + j"in exI, simp) apply (rule_tac x="Suc n"in exI) apply (auto simp: field_simps) done qed qed qed qed have clec: "c(real i / 2^m) ≤ c(real j / 2^n)" if i: "0 < i""i < 2 ^ m"and j: "0 < j""j < 2 ^ n"and ij: "i / 2^m < j / 2^n"for m i n j proof - obtain j' n' where"odd j'""n' ≠ 0" and i_le_j: "real i / 2 ^ m ≤ real j' / 2 ^ n'" and j_le_j: "real j' / 2 ^ n' ≤ real j / 2 ^ n" and clo_ij: "∣real i / 2 ^ m - real j' / 2 ^ n'∣ < 1/2 ^ n'" and clo_jj: "∣real j / 2 ^ n - real j' / 2 ^ n'∣ < 1/2 ^ n'" using approx [of i m j n "m+n"] that i j ij by auto with oddE obtain q where q: "j' = Suc (2*q)"by fastforce have"c (real i / 2 ^ m) ≤ c((2*q + 1) / 2^n')" proof (cases "i / 2^m = (2*q + 1) / 2^n'") case True thenshow ?thesis by simp next case False with i_le_j clo_ij q have"∣real i / 2 ^ m - real (4 * q + 1) / 2 ^ Suc n'∣ < 1 / 2 ^ Suc n'" by (auto simp: field_split_simps) thenhave"c(i / 2^m) ≤ b(real(4 * q + 1) / 2 ^ (Suc n'))" by (meson ci_le_bj even_mult_iff even_numeral even_plus_one_iff) thenshow ?thesis using alec [of "2*q+1" n'] cleb [of "2*q+1" n'] a_ge_0 [of "2*q+1" n'] b_le_1 [of "2*q+1" n'] b41 [of n' q] ‹n' ≠ 0› using left_right_m [of "c((2*q + 1) / 2^n')""a((2*q + 1) / 2^n')""b((2*q + 1) / 2^n')"] by (auto simp: algebra_simps) qed alsohave"... ≤ c(real j / 2^n)" proof (cases "j / 2^n = (2*q + 1) / 2^n'") case True thenshow ?thesis by simp next case False with j_le_j q have less: "(2*q + 1) / 2^n' < j / 2^n" by auto have *: "[q < i; abs(i - q) < s*2; r = q + s]==> abs(i - r) < s"for i q s r::real by auto have"∣real j / 2 ^ n - real (4 * q + 3) / 2 ^ Suc n'∣ < 1 / 2 ^ Suc n'" by (rule * [OF less]) (use j_le_j clo_jj q in‹auto simp: field_split_simps›) thenhave"a(real(4*q + 3) / 2 ^ (Suc n')) ≤ c(j / 2^n)" by (metis Suc3_eq_add_3 add.commute aj_le_ci even_Suc even_mult_iff even_numeral) thenshow ?thesis using alec [of "2*q+1" n'] cleb [of "2*q+1" n'] a_ge_0 [of "2*q+1" n'] b_le_1 [of "2*q+1" n'] a43 [of n' q] ‹n' ≠ 0› using left_right_m [of "c((2*q + 1) / 2^n')""a((2*q + 1) / 2^n')""b((2*q + 1) / 2^n')"] by (auto simp: algebra_simps) qed finallyshow ?thesis . qed have"x = y"if"0 ≤ x""x ≤ 1""0 ≤ y""y ≤ 1""h x = h y"for x y using that proof (induction x y rule: linorder_class.linorder_less_wlog) case (less x1 x2) obtain m n where m: "0 < m""m < 2 ^ n" and x12: "x1 < m / 2^n""m / 2^n < x2" and neq: "h x1 ≠ h (real m / 2^n)" proof - have"(x1 + x2) / 2 ∈ closure D01" using cloD01 less.hyps less.prems by auto with less obtain y where"y ∈ D01"and dist_y: "dist y ((x1 + x2) / 2) < (x2 - x1) / 64" unfolding closure_approachable by (metis diff_gt_0_iff_gt less_divide_eq_numeral1(1) mult_zero_left) obtain m n where m: "0 < m""m < 2 ^ n" and clo: "∣real m / 2 ^ n - (x1 + x2) / 2∣ < (x2 - x1) / 64" and n: "1/2^n < (x2 - x1) / 128" proof - have"min 1 ((x2 - x1) / 128) > 0""1/2 < (1::real)" using less by auto thenobtain N where N: "1/2^N < min 1 ((x2 - x1) / 128)" by (metis power_one_over real_arch_pow_inv) thenhave"N > 0" using less_divide_eq_1 by force obtain p q where p: "p < 2 ^ q""p ≠ 0"and yeq: "y = real p / 2 ^ q" using‹y ∈ D01›by (auto simp: zero_less_divide_iff D01_def) show ?thesis proof show"0 < 2^N * p" using p by auto show"2 ^ N * p < 2 ^ (N+q)" by (simp add: p power_add) have"∣real (2 ^ N * p) / 2 ^ (N + q) - (x1 + x2) / 2∣ = ∣real p / 2 ^ q - (x1 + x2) / 2∣" by (simp add: power_add) alsohave"... = ∣y - (x1 + x2) / 2∣" by (simp add: yeq) alsohave"... < (x2 - x1) / 64" using dist_y by (simp add: dist_norm) finallyshow"∣real (2 ^ N * p) / 2 ^ (N + q) - (x1 + x2) / 2∣ < (x2 - x1) / 64" . have"(1::real) / 2 ^ (N + q) ≤ 1/2^N" by (simp add: field_simps) alsohave"... < (x2 - x1) / 128" using N by force finallyshow"1/2 ^ (N + q) < (x2 - x1) / 128" . qed qed obtain m' n' m'' n'' where"0 < m'""m' < 2 ^ n'""x1 < m' / 2^n'""m' / 2^n' < x2" and"0 < m''""m'' < 2 ^ n''""x1 < m'' / 2^n''""m'' / 2^n'' < x2" and neq: "h (real m'' / 2^n'') ≠ h (real m' / 2^n')" proof show"0 < Suc (2*m)" by simp show m21: "Suc (2*m) < 2 ^ Suc n" using m by auto show"x1 < real (Suc (2 * m)) / 2 ^ Suc n" using clo by (simp add: field_simps abs_if split: if_split_asm) show"real (Suc (2 * m)) / 2 ^ Suc n < x2" using n clo by (simp add: field_simps abs_if split: if_split_asm) show"0 < 4*m + 3" by simp have"m+1 ≤ 2 ^ n" using m by simp thenhave"4 * (m+1) ≤ 4 * (2 ^ n)" by simp thenshow m43: "4*m + 3 < 2 ^ (n+2)" by (simp add: algebra_simps) show"x1 < real (4 * m + 3) / 2 ^ (n + 2)" using clo by (simp add: field_simps abs_if split: if_split_asm) show"real (4 * m + 3) / 2 ^ (n + 2) < x2" using n clo by (simp add: field_simps abs_if split: if_split_asm) have c_fold: "midpoint (a ((2 * real m + 1) / 2 ^ Suc n)) (b ((2 * real m + 1) / 2 ^ Suc n)) = c ((2 * real m + 1) / 2 ^ Suc n)" by (simp add: c_def)
define R where"R ≡ rightcut (a ((2 * real m + 1) / 2 ^ Suc n)) (b ((2 * real m + 1) / 2 ^ Suc n)) (c ((2 * real m + 1) / 2 ^ Suc n))" have"R < b ((2 * real m + 1) / 2 ^ Suc n)" unfolding R_def using a_less_b [of "4*m + 3""n+2"] a43 [of "Suc n" m] b43 [of "Suc n" m] by simp thenhave Rless: "R < midpoint R (b ((2 * real m + 1) / 2 ^ Suc n))" by (simp add: midpoint_def) have midR_le: "midpoint R (b ((2 * real m + 1) / 2 ^ Suc n)) ≤ b ((2 * real m + 1) / (2 * 2 ^ n))" using‹R 🚫 ((2 * real m + 1) / 2 ^ Suc n)› by (simp add: midpoint_def) have"(real (Suc (2 * m)) / 2 ^ Suc n) ∈ D01""real (4 * m + 3) / 2 ^ (n + 2) ∈ D01" by (simp_all add: D01_def m21 m43 del: power_Suc of_nat_Suc of_nat_add add_2_eq_Suc') blast+ thenshow"h (real (4 * m + 3) / 2 ^ (n + 2)) ≠ h (real (Suc (2 * m)) / 2 ^ Suc n)" using a_less_b [of "4*m + 3""n+2", THEN conjunct1] using a43 [of "Suc n" m] b43 [of "Suc n" m] using alec [of "2*m+1""Suc n"] cleb [of "2*m+1""Suc n"] a_ge_0 [of "2*m+1""Suc n"] b_le_1 [of "2*m+1""Suc n"] apply (simp add: fc_eq [symmetric] c_def del: power_Suc) apply (simp only: add.commute [of 1] c_fold R_def [symmetric]) apply (rule right_neq) using Rless apply (simp add: R_def) apply (rule midR_le, auto) done qed thenshow ?thesis by (metis that) qed have m_div: "0 < m / 2^n""m / 2^n < 1" using m by (auto simp: field_split_simps) have closure0m: "{0..m / 2^n} = closure ({0<..< m / 2^n} ∩ (∪k m. {real m / 2 ^ k}))" by (subst closure_dyadic_rationals_in_convex_set_pos_1, simp_all add: not_le m) have"2^n > m" by (simp add: m(2) not_le) thenhave closurem1: "{m / 2^n .. 1} = closure ({m / 2^n <..< 1} ∩ (∪k m. {real m / 2 ^ k}))" using closure_dyadic_rationals_in_convex_set_pos_1 m_div(1) by fastforce have cont_h': "continuous_on (closure ({u<..∩ (∪k m. {real m / 2 ^ k}))) h" if"0 ≤ u""v ≤ 1"for u v using that by (intro continuous_on_subset [OF cont_h] closure_minimal [OF subsetI]) auto have closed_f': "closed (f ` {u..v})"if"0 ≤ u""v ≤ 1"for u v by (metis compact_continuous_image cont_f compact_interval atLeastatMost_subset_iff
compact_imp_closed continuous_on_subset that) have less_2I: "∧k i. real i / 2 ^ k < 1 ==> i < 2 ^ k" by simp have"h ` ({0<..∩ (∪q p. {real p / 2 ^ q})) ⊆ f ` {0..c (m / 2 ^ n)}" proof clarsimp fix p q assume p: "0 < real p / 2 ^ q""real p / 2 ^ q < real m / 2 ^ n" thenhave [simp]: "0 < p" by (simp add: field_split_simps) have [simp]: "p < 2 ^ q" by (blast intro: p less_2I m_div less_trans) have"f (c (real p / 2 ^ q)) ∈ f ` {0..c (real m / 2 ^ n)}" by (auto simp: clec p m) thenshow"h (real p / 2 ^ q) ∈ f ` {0..c (real m / 2 ^ n)}" by (simp add: h_eq) qed with m_div have"h ` {0 .. m / 2^n} ⊆ f ` {0 .. c(m / 2^n)}" apply (subst closure0m) by (rule image_closure_subset [OF cont_h' closed_f']) auto thenhave hx1: "h x1 ∈ f ` {0 .. c(m / 2^n)}" using x12 less.prems(1) by auto thenobtain t1 where t1: "h x1 = f t1""0 ≤ t1""t1 ≤ c (m / 2 ^ n)" by auto have"h ` ({m / 2 ^ n<..<1} ∩ (∪q p. {real p / 2 ^ q})) ⊆ f ` {c (m / 2 ^ n)..1}" proof clarsimp fix p q assume p: "real m / 2 ^ n < real p / 2 ^ q"and [simp]: "p < 2 ^ q" thenhave [simp]: "0 < p" using gr_zeroI m_div by fastforce have"f (c (real p / 2 ^ q)) ∈ f ` {c (m / 2 ^ n)..1}" by (auto simp: clec p m) thenshow"h (real p / 2 ^ q) ∈ f ` {c (real m / 2 ^ n)..1}" by (simp add: h_eq) qed with m have"h ` {m / 2^n .. 1} ⊆ f ` {c(m / 2^n) .. 1}" apply (subst closurem1) by (rule image_closure_subset [OF cont_h' closed_f']) auto thenhave hx2: "h x2 ∈ f ` {c(m / 2^n)..1}" using x12 less.prems by auto thenobtain t2 where t2: "h x2 = f t2""c (m / 2 ^ n) ≤ t2""t2 ≤ 1" by auto with t1 less neq have False using conn [of "h x2", unfolded is_interval_connected_1 [symmetric] is_interval_1, rule_format, of t1 t2 "c(m / 2^n)"] by (simp add: h_eq m) thenshow ?caseby blast qed auto thenshow ?thesis by (auto simp: inj_on_def) qed ultimatelyhave"{0..1::real} homeomorphic f ` {0..1}" using homeomorphic_compact [OF _ cont_h] by blast thenshow ?thesis using homeomorphic_sym by blast qed
theorem path_contains_arc: fixes p :: "real ==> 'a::{complete_space,real_normed_vector}" assumes"path p"and a: "pathstart p = a"and b: "pathfinish p = b"and"a ≠ b" obtains q where"arc q""path_image q ⊆ path_image p""pathstart q = a""pathfinish q = b" proof - have ucont_p: "uniformly_continuous_on {0..1} p" using‹path p›unfolding path_def by (metis compact_Icc compact_uniformly_continuous)
define φ where"φ ≡ λS. S ⊆ {0..1} ∧ 0 ∈ S ∧ 1 ∈ S ∧ (∀x ∈ S. ∀y ∈ S. open_segment x y ∩ S = {} ⟶ p x = p y)" obtain T where"closed T""φ T"and T: "∧U. [closed U; φ U]==>¬ (U ⊂ T)" proof (rule Brouwer_reduction_theorem_gen [of "{0..1}" φ]) have *: "{x<..∩ {0..1} = {x<..if"0 ≤ x""y ≤ 1""x ≤ y"for x y::real using that by auto show"φ {0..1}" by (auto simp: φ_def open_segment_eq_real_ivl *) show"φ (∩(F ` UNIV))" if"∧n. closed (F n)"and φ: "∧n. φ (F n)"and Fsub: "∧n. F (Suc n) ⊆ F n"for F proof - have F01: "∧n. F n ⊆ {0..1} ∧ 0 ∈ F n ∧ 1 ∈ F n" and peq: "∧n x y. [x ∈ F n; y ∈ F n; open_segment x y ∩ F n = {}]==> p x = p y" by (metis φ φ_def)+ have pqF: False if"∀u. x ∈ F u""∀x. y ∈ F x""open_segment x y ∩ (∩x. F x) = {}"and neg: "p x ≠ p y" for x y using that proof (induction x y rule: linorder_class.linorder_less_wlog) case (less x y) have xy: "x ∈ {0..1}""y ∈ {0..1}" by (metis less.prems subsetCE F01)+ have"norm(p x - p y) / 2 > 0" using less by auto thenobtain e where"e > 0" and e: "∧u v. [u ∈ {0..1}; v ∈ {0..1}; dist v u < e]==> dist (p v) (p u) < norm(p x - p y) / 2" by (metis uniformly_continuous_onE [OF ucont_p]) have minxy: "min e (y - x) < (y - x) * (3 / 2)" by (subst min_less_iff_disj) (simp add: less)
define w where"w ≡ x + (min e (y - x) / 3)"
define z where"z ≡y - (min e (y - x) / 3)" have"w < z"and w: "w ∈ {x<..and z: "z ∈ {x<.. and wxe: "norm(w - x) < e"and zye: "norm(z - y) < e" using minxy ‹0 🚫› less unfolding w_def z_def by auto have Fclo: "∧T. T ∈ range F ==> closed T" by (metis ‹∧n. closed (F n)› image_iff) have eq: "{w..z} ∩∩(F ` UNIV) = {}" using less w z by (simp add: open_segment_eq_real_ivl disjoint_iff) thenobtain K where"finite K"and K: "{w..z} ∩ (∩ (F ` K)) = {}" by (metis finite_subset_image compact_imp_fip [OF compact_interval Fclo]) thenhave"K ≠ {}" using‹w 🚫›‹{w..z} ∩∩(F ` K) = {}›by auto
define n where"n ≡ Max K" have"n ∈ K"unfolding n_def by (metis ‹K ≠ {}›‹finite K› Max_in) have"F n ⊆∩ (F ` K)" unfolding n_def by (metis Fsub Max_ge ‹K ≠ {}›‹finite K› cINF_greatest lift_Suc_antimono_le) with K have wzF_null: "{w..z} ∩ F n = {}" by (metis disjoint_iff_not_equal subset_eq) obtain u where u: "u ∈ F n""u ∈ {x..w}""({u..w} - {u}) ∩ F n = {}" proof (cases "w ∈ F n") case True thenshow ?thesis by (metis wzF_null ‹w 🚫› atLeastAtMost_iff disjoint_iff_not_equal less_eq_real_def) next case False obtain u where"u ∈ F n""u ∈ {x..w}""{u<..∩ F n = {}" proof (rule segment_to_point_exists [of "F n ∩ {x..w}" w]) show"closed (F n ∩ {x..w})" by (metis ‹∧n. closed (F n)› closed_Int closed_real_atLeastAtMost) show"F n ∩ {x..w} ≠ {}" by (metis atLeastAtMost_iff disjoint_iff_not_equal greaterThanLessThan_iff less.prems(1) less_eq_real_def w) qed (auto simp: open_segment_eq_real_ivl intro!: that) with False show thesis by (auto simp add: disjoint_iff less_eq_real_def intro!: that) qed obtain v where v: "v ∈ F n""v ∈ {z..y}""({z..v} - {v}) ∩ F n = {}" proof (cases "z ∈ F n") case True have"z ∈ {w..z}" using‹w 🚫›by auto thenshow ?thesis by (metis wzF_null Int_iff True empty_iff) next case False show ?thesis proof (rule segment_to_point_exists [of "F n ∩ {z..y}" z]) show"closed (F n ∩ {z..y})" by (metis ‹∧n. closed (F n)› closed_Int closed_atLeastAtMost) show"F n ∩ {z..y} ≠ {}" by (metis atLeastAtMost_iff disjoint_iff_not_equal greaterThanLessThan_iff less.prems(2) less_eq_real_def z) show"∧b. [b ∈ F n ∩ {z..y}; open_segment z b ∩ (F n ∩ {z..y}) = {}]==> thesis" proof show"∧b. [b ∈ F n ∩ {z..y}; open_segment z b ∩ (F n ∩ {z..y}) = {}]==> ({z..b} - {b}) ∩ F n = {}" using False by (auto simp: open_segment_eq_real_ivl less_eq_real_def) qed auto qed qed obtain u v where"u ∈ {0..1}""v ∈ {0..1}""norm(u - x) < e""norm(v - y) < e""p u = p v" proof show"u ∈ {0..1}""v ∈ {0..1}" by (metis F01 ‹u ∈ F n›‹v ∈ F n› subsetD)+ show"norm(u - x) < e""norm (v - y) < e" using‹u ∈ {x..w}›‹v ∈ {z..y}› atLeastAtMost_iff real_norm_def wxe zye by auto show"p u = p v" proof (rule peq) show"u ∈ F n""v ∈ F n" by (auto simp: u v) have"False"if"ξ ∈ F n""u < ξ""ξ < v"for ξ proof - have"ξ ∉ {z..v}" by (metis DiffI disjoint_iff_not_equal less_irrefl singletonD that(1,3) v(3)) moreoverhave"ξ ∉ {w..z} ∩ F n" by (metis equals0D wzF_null) ultimatelyhave"ξ ∈ {u..w}" using that by auto thenshow ?thesis by (metis DiffI disjoint_iff_not_equal less_eq_real_def not_le singletonD that(1,2) u(3)) qed moreover have"[ξ ∈ F n; v < ξ; ξ < u]==> False"for ξ using‹u ∈ {x..w}›‹v ∈ {z..y}›‹w 🚫›by simp ultimately show"open_segment u v ∩ F n = {}" by (force simp: open_segment_eq_real_ivl) qed qed thenshow ?case using e [of x u] e [of y v] xy by (metis dist_norm dist_triangle_half_r order_less_irrefl) qed (auto simp: open_segment_commute) show ?thesis unfolding φ_defby (metis (no_types, opaque_lifting) INT_I Inf_lower2 rangeI that(3) F01 subsetCE pqF) qed show"closed {0..1::real}"by auto qed (meson φ_def) thenhave"T ⊆ {0..1}""0 ∈ T""1 ∈ T" and peq: "∧x y. [x ∈ T; y ∈ T; open_segment x y ∩ T = {}]==> p x = p y" unfolding φ_defby metis+ thenhave"T ≠ {}"by auto
define h where"h ≡ λx. p(SOME y. y ∈ T ∧ open_segment x y ∩ T = {})" have"p y = p z"if"y ∈ T""z ∈ T"and xyT: "open_segment x y ∩ T = {}"and xzT: "open_segment x z ∩ T = {}" for x y z proof (cases "x ∈ T") case True with that show ?thesis by (metis ‹φ T› φ_def) next case False have"insert x (open_segment x y ∪ open_segment x z) ∩ T = {}" by (metis False Int_Un_distrib2 Int_insert_left Un_empty_right xyT xzT) moreoverhave"open_segment y z ∩ T ⊆ insert x (open_segment x y ∪ open_segment x z) ∩ T" by (auto simp: open_segment_eq_real_ivl) ultimatelyhave"open_segment y z ∩ T = {}" by blast with that peq show ?thesis by metis qed thenhave h_eq_p_gen: "h x = p y"if"y ∈ T""open_segment x y ∩ T = {}"for x y using that unfolding h_def by (metis (mono_tags, lifting) some_eq_ex) thenhave h_eq_p: "∧x. x ∈ T ==> h x = p x" by simp have disjoint: "∧x. ∃y. y ∈ T ∧ open_segment x y ∩ T = {}" by (meson ‹T ≠ {}›‹closed T› segment_to_point_exists) have heq: "h x = h x'"if"open_segment x x' ∩ T = {}"for x x' proof (cases "x ∈ T ∨ x' ∈ T") case True thenshow ?thesis by (metis h_eq_p h_eq_p_gen open_segment_commute that) next case False obtain y y' where"y ∈ T""open_segment x y ∩ T = {}""h x = p y" "y' ∈ T""open_segment x' y' ∩ T = {}""h x' = p y'" by (meson disjoint h_eq_p_gen) moreoverhave"open_segment y y' ⊆ (insert x (insert x' (open_segment x y ∪ open_segment x' y' ∪ open_segment x x')))" by (auto simp: open_segment_eq_real_ivl) ultimatelyshow ?thesis using False that by (fastforce simp add: h_eq_p intro!: peq) qed have"h ` {0..1} homeomorphic {0..1::real}" proof (rule homeomorphic_monotone_image_interval) show"continuous_on {0..1} h" proof (clarsimp simp add: continuous_on_iff) fix u ε::real assume"0 < ε""0 ≤ u""u ≤ 1" thenobtain δ where"δ > 0"and δ: "∧v. v ∈ {0..1} ==> dist v u < δ ⟶ dist (p v) (p u) < ε / 2" using ucont_p [unfolded uniformly_continuous_on_def] by (metis atLeastAtMost_iff half_gt_zero_iff) thenhave"dist (h v) (h u) < ε"if"v ∈ {0..1}""dist v u < δ"for v proof (cases "open_segment u v ∩ T = {}") case True thenshow ?thesis using‹0 🚫ε› heq by auto next case False have uvT: "closed (closed_segment u v ∩ T)""closed_segment u v ∩ T ≠ {}" using False open_closed_segment by (auto simp: ‹closed T› closed_Int) obtain w where"w ∈ T"and w: "w ∈ closed_segment u v""open_segment u w ∩ T = {}" proof (rule segment_to_point_exists [OF uvT]) fix b assume"b ∈ closed_segment u v ∩ T""open_segment u b ∩ (closed_segment u v ∩ T) = {}" thenshow thesis by (metis IntD1 IntD2 ends_in_segment(1) inf.orderE inf_assoc subset_oc_segment that) qed thenhave puw: "dist (p u) (p w) < ε / 2" by (metis (no_types) ‹T ⊆ {0..1}›‹dist v u 🚫δ› δ dist_commute dist_in_closed_segment le_less_trans subsetCE) obtain z where"z ∈ T"and z: "z ∈ closed_segment u v""open_segment v z ∩ T = {}" proof (rule segment_to_point_exists [OF uvT]) fix b assume"b ∈ closed_segment u v ∩ T""open_segment v b ∩ (closed_segment u v ∩ T) = {}" thenshow thesis by (metis IntD1 IntD2 ends_in_segment(2) inf.orderE inf_assoc subset_oc_segment that) qed thenhave"dist (p u) (p z) < ε / 2" by (metis ‹T ⊆ {0..1}›‹dist v u 🚫δ› δ dist_commute dist_in_closed_segment le_less_trans subsetCE) thenshow ?thesis using puw by (metis (no_types) ‹w ∈ T›‹z ∈ T› dist_commute dist_triangle_half_l h_eq_p_gen w(2) z(2)) qed with‹0 🚫δ›show"∃δ>0. ∀v∈{0..1}. dist v u < δ ⟶ dist (h v) (h u) < ε"by blast qed show"connected ({0..1} ∩ h -` {z})"for z proof (clarsimp simp add: connected_iff_connected_component) fix u v assume huv_eq: "h v = h u"and uv: "0 ≤ u""u ≤ 1""0 ≤ v""v ≤ 1" have"∃T. connected T ∧ T ⊆ {0..1} ∧ T ⊆ h -` {h u} ∧ u ∈ T ∧ v ∈ T" proof (intro exI conjI) show"connected (closed_segment u v)" by simp show"closed_segment u v ⊆ {0..1}" by (simp add: uv closed_segment_eq_real_ivl) have pxy: "p x = p y" if"T ⊆ {0..1}""0 ∈ T""1 ∈ T""x ∈ T""y ∈ T" and disjT: "open_segment x y ∩ (T - open_segment u v) = {}" and xynot: "x ∉ open_segment u v""y ∉ open_segment u v" for x y proof (cases "open_segment x y ∩ open_segment u v = {}") case True thenshow ?thesis by (metis Diff_Int_distrib Diff_empty peq disjT ‹x ∈ T›‹y ∈ T›) next case False thenhave"open_segment x u ∪ open_segment y v ⊆ open_segment x y - open_segment u v ∨ open_segment y u ∪ open_segment x v ⊆ open_segment x y - open_segment u v" (is"?xuyv ∨ ?yuxv") using xynot by (fastforce simp add: open_segment_eq_real_ivl not_le not_less split: if_split_asm) thenshow"p x = p y" proof assume"?xuyv" thenhave"open_segment x u ∩ T = {}""open_segment y v ∩ T = {}" using disjT by auto thenhave"h x = h y" using heq huv_eq by auto thenshow ?thesis using h_eq_p ‹x ∈ T›‹y ∈ T›by auto next assume"?yuxv" thenhave"open_segment y u ∩ T = {}""open_segment x v ∩ T = {}" using disjT by auto thenhave"h x = h y" using heq [of y u] heq [of x v] huv_eq by auto thenshow ?thesis using h_eq_p ‹x ∈ T›‹y ∈ T›by auto qed qed have"¬ T - open_segment u v ⊂ T" proof (rule T) show"closed (T - open_segment u v)" by (simp add: closed_Diff [OF ‹closed T›] open_segment_eq_real_ivl) have"0 ∉ open_segment u v""1 ∉ open_segment u v" using open_segment_eq_real_ivl uv by auto thenshow"φ (T - open_segment u v)" using‹T ⊆ {0..1}›‹0 ∈ T›‹1 ∈ T› by (auto simp: φ_def) (meson peq pxy) qed thenhave"open_segment u v ∩ T = {}" by blast thenshow"closed_segment u v ⊆ h -` {h u}" by (force intro: heq simp: open_segment_eq_real_ivl closed_segment_eq_real_ivl split: if_split_asm)+ qed auto thenshow"connected_component ({0..1} ∩ h -` {h u}) u v" by (simp add: connected_component_def) qed show"h 1 ≠ h 0" by (metis ‹φ T› φ_def a ‹a ≠ b› b h_eq_p pathfinish_def pathstart_def) qed thenobtain f and g :: "real ==> 'a" where gfeq: "(∀x∈h ` {0..1}. (g(f x) = x))"and fhim: "f ` h ` {0..1} = {0..1}"and contf: "continuous_on (h ` {0..1}) f" and fgeq: "(∀y∈{0..1}. (f(g y) = y))"and pag: "path_image g = h ` {0..1}"and contg: "continuous_on {0..1} g" by (auto simp: homeomorphic_def homeomorphism_def path_image_def) thenhave"arc g" by (metis arc_def path_def inj_on_def) obtain u v where"u ∈ {0..1}""a = g u""v ∈ {0..1}""b = g v" by (metis (mono_tags, opaque_lifting) ‹φ T› φ_def a b fhim gfeq h_eq_p imageI path_image_def pathfinish_def pathfinish_in_path_image pathstart_def pathstart_in_path_image) thenhave"a ∈ path_image g""b ∈ path_image g" using path_image_def by blast+ have ph: "path_image h ⊆ path_image p" by (metis image_mono image_subset_iff path_image_def disjoint h_eq_p_gen ‹T ⊆ {0..1}›) show ?thesis proof show"pathstart (subpath u v g) = a""pathfinish (subpath u v g) = b" by (simp_all add: ‹a = g u›‹b = g v›) show"path_image (subpath u v g) ⊆ path_image p" by (metis ‹u ∈ {0..1}›‹v ∈ {0..1}› order_trans pag path_image_def path_image_subpath_subset ph) show"arc (subpath u v g)" using‹arc g›‹a = g u›‹b = g v›‹u ∈ {0..1}›‹v ∈ {0..1}› arc_subpath_arc ‹a ≠ b›by blast qed qed
corollary path_connected_arcwise: fixes S :: "'a::{complete_space,real_normed_vector} set" shows"path_connected S ⟷ (∀x ∈ S. ∀y ∈ S. x ≠ y ⟶ (∃g. arc g ∧ path_image g ⊆ S ∧ pathstart g = x ∧ pathfinish g = y))"
(is"?lhs = ?rhs") proof (intro iffI impI ballI) fix x y assume"path_connected S""x ∈ S""y ∈ S""x ≠ y" thenobtain p where p: "path p""path_image p ⊆ S""pathstart p = x""pathfinish p = y" by (force simp: path_connected_def) thenshow"∃g. arc g ∧ path_image g ⊆ S ∧ pathstart g = x ∧ pathfinish g = y" by (metis ‹x ≠ y› order_trans path_contains_arc) next assume R [rule_format]: ?rhs show ?lhs unfolding path_connected_def proof (intro ballI) fix x y assume"x ∈ S""y ∈ S" show"∃g. path g ∧ path_image g ⊆ S ∧ pathstart g = x ∧ pathfinish g = y" proof (cases "x = y") case True with‹x ∈ S› path_component_def path_component_refl show ?thesis by blast next case False with R [OF ‹x ∈ S›‹y ∈ S›] show ?thesis by (auto intro: arc_imp_path) qed qed qed
corollary arc_connected_trans: fixes g :: "real ==> 'a::{complete_space,real_normed_vector}" assumes"arc g""arc h""pathfinish g = pathstart h""pathstart g ≠ pathfinish h" obtains i where"arc i""path_image i ⊆ path_image g ∪ path_image h" "pathstart i = pathstart g""pathfinish i = pathfinish h" by (metis (no_types, opaque_lifting) arc_imp_path assms path_contains_arc path_image_join path_join pathfinish_join pathstart_join)
subsection‹Accessibility of frontier points›
lemma dense_accessible_frontier_points: fixes S :: "'a::{complete_space,real_normed_vector} set" assumes"open S"and opeSV: "openin (top_of_set (frontier S)) V"and"V ≠ {}" obtains g where"arc g""g ` {0..<1} ⊆ S""pathstart g ∈ S""pathfinish g ∈ V" proof - obtain z where"z ∈ V" using‹V ≠ {}›by auto thenobtain r where"r > 0"and r: "ball z r ∩ frontier S ⊆ V" by (metis openin_contains_ball opeSV) thenhave"z ∈ frontier S" using‹z ∈ V› opeSV openin_contains_ball by blast thenhave"z ∈ closure S""z ∉ S" by (simp_all add: frontier_def assms interior_open) with‹r > 0›have"infinite (S ∩ ball z r)" by (auto simp: closure_def islimpt_eq_infinite_ball) thenobtain y where"y ∈ S"and y: "y ∈ ball z r" using infinite_imp_nonempty by force thenhave"y ∉ frontier S" by (meson ‹open S› disjoint_iff_not_equal frontier_disjoint_eq) have"y ≠ z" using‹y ∈ S›‹z ∉ S›by blast have"path_connected(ball z r)" by (simp add: convex_imp_path_connected) with y ‹r > 0›obtain g where"arc g"and pig: "path_image g ⊆ ball z r" and g: "pathstart g = y""pathfinish g = z" using‹y ≠ z›by (force simp: path_connected_arcwise) have"continuous_on {0..1} g" using‹arc g› arc_imp_path path_def by blast thenhave"compact (g -` frontier S ∩ {0..1})" by (simp add: bounded_Int closed_Diff closed_vimage_Int compact_eq_bounded_closed) moreoverhave"g -` frontier S ∩ {0..1} ≠ {}" proof - have"∃r. r ∈ g -` frontier S ∧ r ∈ {0..1}" by (metis ‹z ∈ frontier S› g(2) imageE path_image_def pathfinish_in_path_image vimageI2) thenshow ?thesis by blast qed ultimatelyobtain t where gt: "g t ∈ frontier S"and"0 ≤ t""t ≤ 1" and t: "∧u. [g u ∈ frontier S; 0 ≤ u; u ≤ 1]==> t ≤ u" by (force simp: dest!: compact_attains_inf) moreoverhave"t ≠ 0" by (metis ‹y ∉ frontier S› g(1) gt pathstart_def) ultimatelyhave t01: "0 < t""t ≤ 1" by auto have"V ⊆ frontier S" using opeSV openin_contains_ball by blast show ?thesis proof show"arc (subpath 0 t g)" by (simp add: ‹0 ≤ t›‹t ≤ 1›‹arc g›‹t ≠ 0› arc_subpath_arc) have"g 0 ∈ S" by (metis ‹y ∈ S› g(1) pathstart_def) thenshow"pathstart (subpath 0 t g) ∈ S" by auto have"g t ∈ V" by (metis IntI atLeastAtMost_iff gt image_eqI path_image_def pig r subsetCE ‹0 ≤ t›‹t ≤ 1›) thenshow"pathfinish (subpath 0 t g) ∈ V" by auto thenhave"inj_on (subpath 0 t g) {0..1}" using t01 ‹arc (subpath 0 t g)› arc_imp_inj_on by blast thenhave"subpath 0 t g ` {0..<1} ⊆ subpath 0 t g ` {0..1} - {subpath 0 t g 1}" by (force simp: dest: inj_onD) moreoverhave False if"subpath 0 t g ` ({0..<1}) - S ≠ {}" proof - have contg: "continuous_on {0..1} g" using‹arc g›by (auto simp: arc_def path_def) have"subpath 0 t g ` {0..<1} ∩ frontier S ≠ {}" proof (rule connected_Int_frontier [OF _ _ that]) show"connected (subpath 0 t g ` {0..<1})" proof (rule connected_continuous_image) show"continuous_on {0..<1} (subpath 0 t g)" by (meson ‹arc (subpath 0 t g)› arc_def atLeastLessThan_subseteq_atLeastAtMost_iff continuous_on_subset order_refl path_def) qed auto show"subpath 0 t g ` {0..<1} ∩ S ≠ {}" using‹y ∈ S› g(1) by (force simp: subpath_def image_def pathstart_def) qed thenobtain x where"x ∈ subpath 0 t g ` {0..<1}""x ∈ frontier S" by blast with t01 ‹0 ≤ t› mult_le_one t show False by (fastforce simp: subpath_def) qed thenhave"subpath 0 t g ` {0..1} - {subpath 0 t g 1} ⊆ S" using subsetD by fastforce ultimatelyshow"subpath 0 t g ` {0..<1} ⊆ S" by auto qed qed
lemma dense_accessible_frontier_points_connected: fixes S :: "'a::{complete_space,real_normed_vector} set" assumes"open S""connected S""x ∈ S""V ≠ {}" and ope: "openin (top_of_set (frontier S)) V" obtains g where"arc g""g ` {0..<1} ⊆ S""pathstart g = x""pathfinish g ∈ V" proof - have"V ⊆ frontier S" using ope openin_imp_subset by blast with‹open S›‹x ∈ S›have"x ∉ V" using interior_open by (auto simp: frontier_def) obtain g where"arc g"and g: "g ` {0..<1} ⊆ S""pathstart g ∈ S""pathfinish g ∈ V" by (metis dense_accessible_frontier_points [OF ‹open S› ope ‹V ≠ {}›]) thenhave"path_connected S" by (simp add: assms connected_open_path_connected) with‹pathstart g ∈ S›‹x ∈ S›have"path_component S x (pathstart g)" by (simp add: path_connected_component) thenobtain f where"path f"and f: "path_image f ⊆ S""pathstart f = x""pathfinish f = pathstart g" by (auto simp: path_component_def) thenhave"path (f +++ g)" by (simp add: ‹arc g› arc_imp_path) thenobtain h where"arc h" and h: "path_image h ⊆ path_image (f +++ g)""pathstart h = x""pathfinish h = pathfinish g" using path_contains_arc [of "f +++ g" x "pathfinish g"] ‹x ∉ V›‹pathfinish g ∈ V› f by (metis pathfinish_join pathstart_join) have"path_image h ⊆ path_image f ∪ path_image g" using h(1) path_image_join_subset by auto thenhave"h ` {0..1} - {h 1} ⊆ S" using f g h apply (simp add: path_image_def pathfinish_def subset_iff image_def Bex_def) by (metis le_less) thenhave"h ` {0..<1} ⊆ S" using‹arc h›by (force simp: arc_def dest: inj_onD) thenshow thesis using‹arc h› g(3) h that by presburger qed
lemma dense_access_fp_aux: fixes S :: "'a::{complete_space,real_normed_vector} set" assumes S: "open S""connected S" and opeSU: "openin (top_of_set (frontier S)) U" and opeSV: "openin (top_of_set (frontier S)) V" and"V ≠ {}""¬ U ⊆ V" obtains g where"arc g""pathstart g ∈ U""pathfinish g ∈ V""g ` {0<..<1} ⊆ S" proof - have"S ≠ {}" using opeSV ‹V ≠ {}›by (metis frontier_empty openin_subtopology_empty) thenobtain x where"x ∈ S"by auto obtain g where"arc g"and g: "g ` {0..<1} ⊆ S""pathstart g = x""pathfinish g ∈ V" using dense_accessible_frontier_points_connected [OF S ‹x ∈ S›‹V ≠ {}› opeSV] by blast obtain h where"arc h"and h: "h ` {0..<1} ⊆ S""pathstart h = x""pathfinish h ∈ U - {pathfinish g}" proof (rule dense_accessible_frontier_points_connected [OF S ‹x ∈ S›]) show"U - {pathfinish g} ≠ {}" using‹pathfinish g ∈ V›‹¬ U ⊆ V›by blast show"openin (top_of_set (frontier S)) (U - {pathfinish g})" by (simp add: opeSU openin_delete) qed auto obtain γ where"arc γ" and γ: "path_image γ ⊆ path_image (reversepath h +++ g)" "pathstart γ = pathfinish h""pathfinish γ = pathfinish g" proof (rule path_contains_arc [of "(reversepath h +++ g)""pathfinish h""pathfinish g"]) show"path (reversepath h +++ g)" by (simp add: ‹arc g›‹arc h›‹pathstart g = x›‹pathstart h = x› arc_imp_path) show"pathstart (reversepath h +++ g) = pathfinish h" "pathfinish (reversepath h +++ g) = pathfinish g" by auto show"pathfinish h ≠ pathfinish g" using‹pathfinish h ∈ U - {pathfinish g}›by auto qed auto show ?thesis proof show"arc γ""pathstart γ ∈ U""pathfinish γ ∈ V" using γ ‹arc γ›‹pathfinish h ∈ U - {pathfinish g}›‹pathfinish g ∈ V›by auto have"path_image γ ⊆ path_image h ∪ path_image g" by (metis γ(1) g(2) h(2) path_image_join path_image_reversepath pathfinish_reversepath) thenhave"γ ` {0..1} - {γ 0, γ 1} ⊆ S" using γ g h apply (simp add: path_image_def pathstart_def pathfinish_def subset_iff image_def Bex_def) by (metis linorder_neqE_linordered_idom not_less) thenshow"γ ` {0<..<1} ⊆ S" using‹arc h›‹arc γ› by (metis arc_imp_simple_path path_image_def pathfinish_def pathstart_def simple_path_endless) qed qed
lemma dense_accessible_frontier_point_pairs: fixes S :: "'a::{complete_space,real_normed_vector} set" assumes S: "open S""connected S" and opeSU: "openin (top_of_set (frontier S)) U" and opeSV: "openin (top_of_set (frontier S)) V" and"U ≠ {}""V ≠ {}""U ≠ V" obtains g where"arc g""pathstart g ∈ U""pathfinish g ∈ V""g ` {0<..<1} ⊆ S" proof -
consider "¬ U ⊆ V" | "¬ V ⊆ U" using‹U ≠ V›by blast thenshow ?thesis proof cases case 1 thenshow ?thesis using assms dense_access_fp_aux [OF S opeSU opeSV] that by blast next case 2 obtain g where"arc g"and g: "pathstart g ∈ V""pathfinish g ∈ U""g ` {0<..<1} ⊆ S" using assms dense_access_fp_aux [OF S opeSV opeSU] "2"by blast show ?thesis proof show"arc (reversepath g)" by (simp add: ‹arc g› arc_reversepath) show"pathstart (reversepath g) ∈ U""pathfinish (reversepath g) ∈ V" using g by auto show"reversepath g ` {0<..<1} ⊆ S" using g by (auto simp: reversepath_def) qed qed qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.91 Sekunden
(vorverarbeitet am 2026-04-30)
¤
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.