# HG changeset patch # User wenzelm # Date 1379876693 -7200 # Node ID b319a0c8b8a277c44997a59c51666e03e057ef28 # Parent e64389fe2d2cf16301c49272dfbf7117d8983ae7 tuned proofs; diff -r e64389fe2d2c -r b319a0c8b8a2 src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy --- a/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Sun Sep 22 19:50:48 2013 +0200 +++ b/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Sun Sep 22 21:04:53 2013 +0200 @@ -12,13 +12,13 @@ begin lemma convergent_limsup_cl: - fixes X :: "nat \ 'a::{complete_linorder, linorder_topology}" + fixes X :: "nat \ 'a::{complete_linorder,linorder_topology}" shows "convergent X \ limsup X = lim X" by (auto simp: convergent_def limI lim_imp_Limsup) lemma lim_increasing_cl: assumes "\n m. n \ m \ f n \ f m" - obtains l where "f ----> (l::'a::{complete_linorder, linorder_topology})" + obtains l where "f ----> (l::'a::{complete_linorder,linorder_topology})" proof show "f ----> (SUP n. f n)" using assms @@ -28,7 +28,7 @@ lemma lim_decreasing_cl: assumes "\n m. n \ m \ f n \ f m" - obtains l where "f ----> (l::'a::{complete_linorder, linorder_topology})" + obtains l where "f ----> (l::'a::{complete_linorder,linorder_topology})" proof show "f ----> (INF n. f n)" using assms @@ -37,33 +37,42 @@ qed lemma compact_complete_linorder: - fixes X :: "nat \ 'a::{complete_linorder, linorder_topology}" + fixes X :: "nat \ 'a::{complete_linorder,linorder_topology}" shows "\l r. subseq r \ (X \ r) ----> l" proof - obtain r where "subseq r" and mono: "monoseq (X \ r)" - using seq_monosub[of X] unfolding comp_def by auto + using seq_monosub[of X] + unfolding comp_def + by auto then have "(\n m. m \ n \ (X \ r) m \ (X \ r) n) \ (\n m. m \ n \ (X \ r) n \ (X \ r) m)" by (auto simp add: monoseq_def) - then obtain l where "(X\r) ----> l" - using lim_increasing_cl[of "X \ r"] lim_decreasing_cl[of "X \ r"] by auto - then show ?thesis using `subseq r` by auto + then obtain l where "(X \ r) ----> l" + using lim_increasing_cl[of "X \ r"] lim_decreasing_cl[of "X \ r"] + by auto + then show ?thesis + using `subseq r` by auto qed -lemma compact_UNIV: "compact (UNIV :: 'a::{complete_linorder, linorder_topology, second_countable_topology} set)" +lemma compact_UNIV: + "compact (UNIV :: 'a::{complete_linorder,linorder_topology,second_countable_topology} set)" using compact_complete_linorder by (auto simp: seq_compact_eq_compact[symmetric] seq_compact_def) lemma compact_eq_closed: - fixes S :: "'a::{complete_linorder, linorder_topology, second_countable_topology} set" + fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set" shows "compact S \ closed S" - using closed_inter_compact[of S, OF _ compact_UNIV] compact_imp_closed by auto + using closed_inter_compact[of S, OF _ compact_UNIV] compact_imp_closed + by auto lemma closed_contains_Sup_cl: - fixes S :: "'a::{complete_linorder, linorder_topology, second_countable_topology} set" - assumes "closed S" "S \ {}" shows "Sup S \ S" + fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set" + assumes "closed S" + and "S \ {}" + shows "Sup S \ S" proof - from compact_eq_closed[of S] compact_attains_sup[of S] assms - obtain s where S: "s \ S" "\t\S. t \ s" by auto + obtain s where S: "s \ S" "\t\S. t \ s" + by auto then have "Sup S = s" by (auto intro!: Sup_eqI) with S show ?thesis @@ -71,26 +80,31 @@ qed lemma closed_contains_Inf_cl: - fixes S :: "'a::{complete_linorder, linorder_topology, second_countable_topology} set" - assumes "closed S" "S \ {}" shows "Inf S \ S" + fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set" + assumes "closed S" + and "S \ {}" + shows "Inf S \ S" proof - from compact_eq_closed[of S] compact_attains_inf[of S] assms - obtain s where S: "s \ S" "\t\S. s \ t" by auto + obtain s where S: "s \ S" "\t\S. s \ t" + by auto then have "Inf S = s" by (auto intro!: Inf_eqI) with S show ?thesis by simp qed -lemma ereal_dense3: - fixes x y :: ereal shows "x < y \ \r::rat. x < real_of_rat r \ real_of_rat r < y" +lemma ereal_dense3: + fixes x y :: ereal + shows "x < y \ \r::rat. x < real_of_rat r \ real_of_rat r < y" proof (cases x y rule: ereal2_cases, simp_all) - fix r q :: real assume "r < q" - from Rats_dense_in_real[OF this] - show "\x. r < real_of_rat x \ real_of_rat x < q" + fix r q :: real + assume "r < q" + from Rats_dense_in_real[OF this] show "\x. r < real_of_rat x \ real_of_rat x < q" by (fastforce simp: Rats_def) next - fix r :: real show "\x. r < real_of_rat x" "\x. real_of_rat x < r" + fix r :: real + show "\x. r < real_of_rat x" "\x. real_of_rat x < r" using gt_ex[of r] lt_ex[of r] Rats_dense_in_real by (auto simp: Rats_def) qed @@ -98,15 +112,18 @@ instance ereal :: second_countable_topology proof (default, intro exI conjI) let ?B = "(\r\\. {{..< r}, {r <..}} :: ereal set set)" - show "countable ?B" by (auto intro: countable_rat) + show "countable ?B" + by (auto intro: countable_rat) show "open = generate_topology ?B" proof (intro ext iffI) - fix S :: "ereal set" assume "open S" + fix S :: "ereal set" + assume "open S" then show "generate_topology ?B S" unfolding open_generated_order proof induct case (Basis b) - then obtain e where "b = {..< e} \ b = {e <..}" by auto + then obtain e where "b = {.. b = {e<..}" + by auto moreover have "{..{{.. \ \ x < e}" "{e<..} = \{{x<..}|x. x \ \ \ e < x}" by (auto dest: ereal_dense3 simp del: ex_simps @@ -115,27 +132,35 @@ by (auto intro: generate_topology.intros) qed (auto intro: generate_topology.intros) next - fix S assume "generate_topology ?B S" then show "open S" by induct auto + fix S + assume "generate_topology ?B S" + then show "open S" + by induct auto qed qed lemma continuous_on_ereal[intro, simp]: "continuous_on A ereal" - unfolding continuous_on_topological open_ereal_def by auto + unfolding continuous_on_topological open_ereal_def + by auto lemma continuous_at_ereal[intro, simp]: "continuous (at x) ereal" - using continuous_on_eq_continuous_at[of UNIV] by auto + using continuous_on_eq_continuous_at[of UNIV] + by auto lemma continuous_within_ereal[intro, simp]: "x \ A \ continuous (at x within A) ereal" - using continuous_on_eq_continuous_within[of A] by auto + using continuous_on_eq_continuous_within[of A] + by auto lemma ereal_open_uminus: fixes S :: "ereal set" - assumes "open S" shows "open (uminus ` S)" + assumes "open S" + shows "open (uminus ` S)" using `open S`[unfolded open_generated_order] proof induct have "range uminus = (UNIV :: ereal set)" by (auto simp: image_iff ereal_uminus_eq_reorder) - then show "open (range uminus :: ereal set)" by simp + then show "open (range uminus :: ereal set)" + by simp qed (auto simp add: image_Union image_Int) lemma ereal_uminus_complement: @@ -147,57 +172,91 @@ fixes S :: "ereal set" assumes "closed S" shows "closed (uminus ` S)" - using assms unfolding closed_def ereal_uminus_complement[symmetric] by (rule ereal_open_uminus) + using assms + unfolding closed_def ereal_uminus_complement[symmetric] + by (rule ereal_open_uminus) lemma ereal_open_closed_aux: fixes S :: "ereal set" - assumes "open S" "closed S" - and S: "(-\) ~: S" + assumes "open S" + and "closed S" + and S: "(-\) \ S" shows "S = {}" proof (rule ccontr) - assume "S ~= {}" - then have *: "(Inf S):S" by (metis assms(2) closed_contains_Inf_cl) - { assume "Inf S=(-\)" - then have False using * assms(3) by auto } + assume "\ ?thesis" + then have *: "Inf S \ S" + by (metis assms(2) closed_contains_Inf_cl) + { + assume "Inf S = -\" + then have False + using * assms(3) by auto + } moreover - { assume "Inf S=\" - then have "S={\}" by (metis Inf_eq_PInfty `S ~= {}`) - then have False by (metis assms(1) not_open_singleton) } + { + assume "Inf S = \" + then have "S = {\}" + by (metis Inf_eq_PInfty `S \ {}`) + then have False + by (metis assms(1) not_open_singleton) + } moreover - { assume fin: "\Inf S\ \ \" - from ereal_open_cont_interval[OF assms(1) * fin] guess e . note e = this - then obtain b where b_def: "Inf S-eInf S\ \ \" + from ereal_open_cont_interval[OF assms(1) * fin] + obtain e where e: "e > 0" "{Inf S - e<.. S" . + then obtain b where b: "Inf S - e < b" "b < Inf S" + using fin ereal_between[of "Inf S" e] dense[of "Inf S - e"] by auto - then have "b:S" using e by auto - then have False using b_def by (metis complete_lattice_class.Inf_lower leD) - } ultimately show False by auto + then have "b: {Inf S - e <..< Inf S + e}" + using e fin ereal_between[of "Inf S" e] + by auto + then have "b \ S" + using e by auto + then have False + using b by (metis complete_lattice_class.Inf_lower leD) + } + ultimately show False + by auto qed lemma ereal_open_closed: fixes S :: "ereal set" - shows "(open S & closed S) <-> (S = {} | S = UNIV)" + shows "open S \ closed S \ S = {} \ S = UNIV" proof - - { assume lhs: "open S & closed S" - { assume "(-\) ~: S" - then have "S={}" using lhs ereal_open_closed_aux by auto } + { + assume lhs: "open S \ closed S" + { + assume "-\ \ S" + then have "S = {}" + using lhs ereal_open_closed_aux by auto + } moreover - { assume "(-\) : S" - then have "(- S)={}" using lhs ereal_open_closed_aux[of "-S"] by auto } - ultimately have "S = {} | S = UNIV" by auto - } then show ?thesis by auto + { + assume "-\ \ S" + then have "- S = {}" + using lhs ereal_open_closed_aux[of "-S"] by auto + } + ultimately have "S = {} \ S = UNIV" + by auto + } + then show ?thesis + by auto qed lemma ereal_open_affinity_pos: fixes S :: "ereal set" - assumes "open S" and m: "m \ \" "0 < m" and t: "\t\ \ \" + assumes "open S" + and m: "m \ \" "0 < m" + and t: "\t\ \ \" shows "open ((\x. m * x + t) ` S)" proof - - obtain r where r[simp]: "m = ereal r" using m by (cases m) auto - obtain p where p[simp]: "t = ereal p" using t by auto - have "r \ 0" "0 < r" and m': "m \ \" "m \ -\" "m \ 0" using m by auto - from `open S`[THEN ereal_openE] guess l u . note T = this + obtain r where r[simp]: "m = ereal r" + using m by (cases m) auto + obtain p where p[simp]: "t = ereal p" + using t by auto + have "r \ 0" "0 < r" and m': "m \ \" "m \ -\" "m \ 0" + using m by auto + from `open S` [THEN ereal_openE] guess l u . note T = this let ?f = "(\x. m * x + t)" show ?thesis unfolding open_ereal_def @@ -210,32 +269,45 @@ using `r \ 0` by (cases x) (auto intro!: image_eqI[of _ _ "real x"] split: split_if_asm) qed force then show "open (ereal -` ?f ` S)" - using open_affinity[OF T(1) `r \ 0`] by (auto simp: ac_simps) + using open_affinity[OF T(1) `r \ 0`] + by (auto simp: ac_simps) next assume "\ \ ?f`S" - with `0 < r` have "\ \ S" by auto + with `0 < r` have "\ \ S" + by auto fix x assume "x \ {ereal (r * l + p)<..}" - then have [simp]: "ereal (r * l + p) < x" by auto + then have [simp]: "ereal (r * l + p) < x" + by auto show "x \ ?f`S" proof (rule image_eqI) show "x = m * ((x - t) / m) + t" - using m t by (cases rule: ereal3_cases[of m x t]) auto - have "ereal l < (x - t)/m" - using m t by (simp add: ereal_less_divide_pos ereal_less_minus) - then show "(x - t)/m \ S" using T(2)[OF `\ \ S`] by auto + using m t + by (cases rule: ereal3_cases[of m x t]) auto + have "ereal l < (x - t) / m" + using m t + by (simp add: ereal_less_divide_pos ereal_less_minus) + then show "(x - t) / m \ S" + using T(2)[OF `\ \ S`] by auto qed next - assume "-\ \ ?f`S" with `0 < r` have "-\ \ S" by auto + assume "-\ \ ?f ` S" + with `0 < r` have "-\ \ S" + by auto fix x assume "x \ {.. ?f`S" proof (rule image_eqI) show "x = m * ((x - t) / m) + t" - using m t by (cases rule: ereal3_cases[of m x t]) auto + using m t + by (cases rule: ereal3_cases[of m x t]) auto have "(x - t)/m < ereal u" - using m t by (simp add: ereal_divide_less_pos ereal_minus_less) - then show "(x - t)/m \ S" using T(3)[OF `-\ \ S`] by auto + using m t + by (simp add: ereal_divide_less_pos ereal_minus_less) + then show "(x - t)/m \ S" + using T(3)[OF `-\ \ S`] + by auto qed qed qed @@ -249,14 +321,18 @@ proof cases assume "0 < m" then show ?thesis - using ereal_open_affinity_pos[OF `open S` _ _ t, of m] m by auto + using ereal_open_affinity_pos[OF `open S` _ _ t, of m] m + by auto next assume "\ 0 < m" then - have "0 < -m" using `m \ 0` by (cases m) auto - then have m: "-m \ \" "0 < -m" using `\m\ \ \` + have "0 < -m" + using `m \ 0` + by (cases m) auto + then have m: "-m \ \" "0 < -m" + using `\m\ \ \` by (auto simp: ereal_uminus_eq_reorder) - from ereal_open_affinity_pos[OF ereal_open_uminus[OF `open S`] m t] - show ?thesis unfolding image_image by simp + from ereal_open_affinity_pos[OF ereal_open_uminus[OF `open S`] m t] show ?thesis + unfolding image_image by simp qed lemma ereal_lim_mult: @@ -269,18 +345,22 @@ show ?thesis proof (rule topological_tendstoI) fix S - assume "open S" "a * L \ S" + assume "open S" and "a * L \ S" have "a * L / a = L" - using `a \ 0` a by (cases rule: ereal2_cases[of a L]) auto + using `a \ 0` a + by (cases rule: ereal2_cases[of a L]) auto then have L: "L \ ((\x. x / a) ` S)" - using `a * L \ S` by (force simp: image_iff) + using `a * L \ S` + by (force simp: image_iff) moreover have "open ((\x. x / a) ` S)" using ereal_open_affinity[OF `open S`, of "inverse a" 0] `a \ 0` a by (auto simp: ereal_divide_eq ereal_inverse_eq_0 divide_ereal_def ac_simps) note * = lim[THEN topological_tendstoD, OF this L] - { fix x + { + fix x from a `a \ 0` have "a * (x / a) = x" - by (cases rule: ereal2_cases[of a x]) auto } + by (cases rule: ereal2_cases[of a x]) auto + } note this[simp] show "eventually (\x. a * X x \ S) net" by (rule eventually_mono[OF _ *]) auto @@ -289,28 +369,39 @@ lemma ereal_lim_uminus: fixes X :: "'a \ ereal" - shows "((\i. - X i) ---> -L) net \ (X ---> L) net" + shows "((\i. - X i) ---> - L) net \ (X ---> L) net" using ereal_lim_mult[of X L net "ereal (-1)"] ereal_lim_mult[of "(\i. - X i)" "-L" net "ereal (-1)"] by (auto simp add: algebra_simps) -lemma ereal_open_atLeast: fixes x :: ereal shows "open {x..} \ x = -\" +lemma ereal_open_atLeast: + fixes x :: ereal + shows "open {x..} \ x = -\" proof - assume "x = -\" then have "{x..} = UNIV" by auto - then show "open {x..}" by auto + assume "x = -\" + then have "{x..} = UNIV" + by auto + then show "open {x..}" + by auto next assume "open {x..}" - then have "open {x..} \ closed {x..}" by auto - then have "{x..} = UNIV" unfolding ereal_open_closed by auto - then show "x = -\" by (simp add: bot_ereal_def atLeast_eq_UNIV_iff) + then have "open {x..} \ closed {x..}" + by auto + then have "{x..} = UNIV" + unfolding ereal_open_closed by auto + then show "x = -\" + by (simp add: bot_ereal_def atLeast_eq_UNIV_iff) qed -lemma open_uminus_iff: "open (uminus ` S) \ open (S::ereal set)" - using ereal_open_uminus[of S] ereal_open_uminus[of "uminus`S"] by auto +lemma open_uminus_iff: + fixes S :: "ereal set" + shows "open (uminus ` S) \ open S" + using ereal_open_uminus[of S] ereal_open_uminus[of "uminus ` S"] + by auto lemma ereal_Liminf_uminus: - fixes f :: "'a => ereal" - shows "Liminf net (\x. - (f x)) = -(Limsup net f)" + fixes f :: "'a \ ereal" + shows "Liminf net (\x. - (f x)) = - Limsup net f" using ereal_Limsup_uminus[of _ "(\x. - (f x))"] by auto lemma ereal_Lim_uminus: @@ -325,16 +416,20 @@ fixes f :: "'a \ ereal" assumes "\ trivial_limit net" shows "(f ---> \) net \ Liminf net f = \" - unfolding tendsto_iff_Liminf_eq_Limsup[OF assms] using Liminf_le_Limsup[OF assms, of f] by auto + unfolding tendsto_iff_Liminf_eq_Limsup[OF assms] + using Liminf_le_Limsup[OF assms, of f] + by auto lemma Limsup_MInfty: fixes f :: "'a \ ereal" assumes "\ trivial_limit net" shows "(f ---> -\) net \ Limsup net f = -\" - unfolding tendsto_iff_Liminf_eq_Limsup[OF assms] using Liminf_le_Limsup[OF assms, of f] by auto + unfolding tendsto_iff_Liminf_eq_Limsup[OF assms] + using Liminf_le_Limsup[OF assms, of f] + by auto lemma convergent_ereal: - fixes X :: "nat \ 'a :: {complete_linorder, linorder_topology}" + fixes X :: "nat \ 'a :: {complete_linorder,linorder_topology}" shows "convergent X \ limsup X = liminf X" using tendsto_iff_Liminf_eq_Limsup[of sequentially] by (auto simp: convergent_def) @@ -350,49 +445,64 @@ by (metis Limsup_MInfty trivial_limit_sequentially) lemma ereal_lim_mono: - fixes X Y :: "nat => 'a::linorder_topology" - assumes "\n. N \ n \ X n <= Y n" - and "X ----> x" "Y ----> y" - shows "x <= y" + fixes X Y :: "nat \ 'a::linorder_topology" + assumes "\n. N \ n \ X n \ Y n" + and "X ----> x" + and "Y ----> y" + shows "x \ y" using assms(1) by (intro LIMSEQ_le[OF assms(2,3)]) auto lemma incseq_le_ereal: fixes X :: "nat \ 'a::linorder_topology" - assumes inc: "incseq X" and lim: "X ----> L" + assumes inc: "incseq X" + and lim: "X ----> L" shows "X N \ L" - using inc by (intro ereal_lim_mono[of N, OF _ tendsto_const lim]) (simp add: incseq_def) + using inc + by (intro ereal_lim_mono[of N, OF _ tendsto_const lim]) (simp add: incseq_def) lemma decseq_ge_ereal: assumes dec: "decseq X" and lim: "X ----> (L::'a::linorder_topology)" - shows "X N >= L" + shows "X N \ L" using dec by (intro ereal_lim_mono[of N, OF _ lim tendsto_const]) (simp add: decseq_def) lemma bounded_abs: - assumes "(a::real)<=x" "x<=b" - shows "abs x <= max (abs a) (abs b)" + fixes a :: real + assumes "a \ x" + and "x \ b" + shows "abs x \ max (abs a) (abs b)" by (metis abs_less_iff assms leI le_max_iff_disj less_eq_real_def less_le_not_le less_minus_iff minus_minus) lemma ereal_Sup_lim: - assumes "\n. b n \ s" "b ----> (a::'a::{complete_linorder, linorder_topology})" + fixes a :: "'a::{complete_linorder,linorder_topology}" + assumes "\n. b n \ s" + and "b ----> a" shows "a \ Sup s" by (metis Lim_bounded_ereal assms complete_lattice_class.Sup_upper) lemma ereal_Inf_lim: - assumes "\n. b n \ s" "b ----> (a::'a::{complete_linorder, linorder_topology})" + fixes a :: "'a::{complete_linorder,linorder_topology}" + assumes "\n. b n \ s" + and "b ----> a" shows "Inf s \ a" by (metis Lim_bounded2_ereal assms complete_lattice_class.Inf_lower) lemma SUP_Lim_ereal: - fixes X :: "nat \ 'a::{complete_linorder, linorder_topology}" - assumes inc: "incseq X" and l: "X ----> l" shows "(SUP n. X n) = l" - using LIMSEQ_SUP[OF inc] tendsto_unique[OF trivial_limit_sequentially l] by simp + fixes X :: "nat \ 'a::{complete_linorder,linorder_topology}" + assumes inc: "incseq X" + and l: "X ----> l" + shows "(SUP n. X n) = l" + using LIMSEQ_SUP[OF inc] tendsto_unique[OF trivial_limit_sequentially l] + by simp lemma INF_Lim_ereal: - fixes X :: "nat \ 'a::{complete_linorder, linorder_topology}" - assumes dec: "decseq X" and l: "X ----> l" shows "(INF n. X n) = l" - using LIMSEQ_INF[OF dec] tendsto_unique[OF trivial_limit_sequentially l] by simp + fixes X :: "nat \ 'a::{complete_linorder,linorder_topology}" + assumes dec: "decseq X" + and l: "X ----> l" + shows "(INF n. X n) = l" + using LIMSEQ_INF[OF dec] tendsto_unique[OF trivial_limit_sequentially l] + by simp lemma SUP_eq_LIMSEQ: assumes "mono f" @@ -400,13 +510,15 @@ proof have inc: "incseq (\i. ereal (f i))" using `mono f` unfolding mono_def incseq_def by auto - { assume "f ----> x" - then have "(\i. ereal (f i)) ----> ereal x" by auto - from SUP_Lim_ereal[OF inc this] - show "(SUP n. ereal (f n)) = ereal x" . } - { assume "(SUP n. ereal (f n)) = ereal x" - with LIMSEQ_SUP[OF inc] - show "f ----> x" by auto } + { + assume "f ----> x" + then have "(\i. ereal (f i)) ----> ereal x" + by auto + from SUP_Lim_ereal[OF inc this] show "(SUP n. ereal (f n)) = ereal x" . + next + assume "(SUP n. ereal (f n)) = ereal x" + with LIMSEQ_SUP[OF inc] show "f ----> x" by auto + } qed lemma liminf_ereal_cminus: @@ -415,7 +527,8 @@ shows "liminf (\x. c - f x) = c - limsup f" proof (cases c) case PInf - then show ?thesis by (simp add: Liminf_const) + then show ?thesis + by (simp add: Liminf_const) next case (real r) then show ?thesis @@ -435,156 +548,225 @@ assumes "\x0\ \ \" shows "continuous (at x0) real" proof - - { fix T - assume T_def: "open T & real x0 : T" - def S == "ereal ` T" - then have "ereal (real x0) : S" using T_def by auto - then have "x0 : S" using assms ereal_real by auto - moreover have "open S" using open_ereal S_def T_def by auto - moreover have "ALL y:S. real y : T" using S_def T_def by auto - ultimately have "EX S. x0 : S & open S & (ALL y:S. real y : T)" by auto + { + fix T + assume T: "open T" "real x0 \ T" + def S \ "ereal ` T" + then have "ereal (real x0) \ S" + using T by auto + then have "x0 \ S" + using assms ereal_real by auto + moreover have "open S" + using open_ereal S_def T by auto + moreover have "\y\S. real y \ T" + using S_def T by auto + ultimately have "\S. x0 \ S \ open S \ (\y\S. real y \ T)" + by auto } - then show ?thesis unfolding continuous_at_open by blast + then show ?thesis + unfolding continuous_at_open by blast qed - lemma continuous_at_iff_ereal: - fixes f :: "'a::t2_space => real" - shows "continuous (at x0) f <-> continuous (at x0) (ereal o f)" + fixes f :: "'a::t2_space \ real" + shows "continuous (at x0) f \ continuous (at x0) (ereal \ f)" proof - - { assume "continuous (at x0) f" - then have "continuous (at x0) (ereal o f)" - using continuous_at_ereal continuous_at_compose[of x0 f ereal] by auto + { + assume "continuous (at x0) f" + then have "continuous (at x0) (ereal \ f)" + using continuous_at_ereal continuous_at_compose[of x0 f ereal] + by auto } moreover - { assume "continuous (at x0) (ereal o f)" - then have "continuous (at x0) (real o (ereal o f))" - using continuous_at_of_ereal by (intro continuous_at_compose[of x0 "ereal o f"]) auto - moreover have "real o (ereal o f) = f" using real_ereal_id by (simp add: o_assoc) - ultimately have "continuous (at x0) f" by auto - } ultimately show ?thesis by auto + { + assume "continuous (at x0) (ereal \ f)" + then have "continuous (at x0) (real \ (ereal \ f))" + using continuous_at_of_ereal + by (intro continuous_at_compose[of x0 "ereal \ f"]) auto + moreover have "real \ (ereal \ f) = f" + using real_ereal_id by (simp add: o_assoc) + ultimately have "continuous (at x0) f" + by auto + } + ultimately show ?thesis + by auto qed lemma continuous_on_iff_ereal: fixes f :: "'a::t2_space => real" - fixes A assumes "open A" - shows "continuous_on A f <-> continuous_on A (ereal o f)" - using continuous_at_iff_ereal assms by (auto simp add: continuous_on_eq_continuous_at cong del: continuous_on_cong) + assumes "open A" + shows "continuous_on A f \ continuous_on A (ereal \ f)" + using continuous_at_iff_ereal assms + by (auto simp add: continuous_on_eq_continuous_at cong del: continuous_on_cong) - -lemma continuous_on_real: "continuous_on (UNIV-{\,(-\::ereal)}) real" - using continuous_at_of_ereal continuous_on_eq_continuous_at open_image_ereal by auto - +lemma continuous_on_real: "continuous_on (UNIV - {\, -\::ereal}) real" + using continuous_at_of_ereal continuous_on_eq_continuous_at open_image_ereal + by auto lemma continuous_on_iff_real: - fixes f :: "'a::t2_space => ereal" + fixes f :: "'a::t2_space \ ereal" assumes "\x. x \ A \ \f x\ \ \" shows "continuous_on A f \ continuous_on A (real \ f)" proof - - have "f ` A <= UNIV-{\,(-\)}" using assms by force + have "f ` A \ UNIV - {\, -\}" + using assms by force then have *: "continuous_on (f ` A) real" using continuous_on_real by (simp add: continuous_on_subset) - have **: "continuous_on ((real o f) ` A) ereal" - using continuous_on_ereal continuous_on_subset[of "UNIV" "ereal" "(real o f) ` A"] by blast - { assume "continuous_on A f" - then have "continuous_on A (real o f)" + have **: "continuous_on ((real \ f) ` A) ereal" + using continuous_on_ereal continuous_on_subset[of "UNIV" "ereal" "(real \ f) ` A"] + by blast + { + assume "continuous_on A f" + then have "continuous_on A (real \ f)" apply (subst continuous_on_compose) - using * apply auto + using * + apply auto done } moreover - { assume "continuous_on A (real o f)" - then have "continuous_on A (ereal o (real o f))" + { + assume "continuous_on A (real \ f)" + then have "continuous_on A (ereal \ (real \ f))" apply (subst continuous_on_compose) - using ** apply auto + using ** + apply auto done then have "continuous_on A f" - apply (subst continuous_on_eq[of A "ereal o (real o f)" f]) - using assms ereal_real apply auto + apply (subst continuous_on_eq[of A "ereal \ (real \ f)" f]) + using assms ereal_real + apply auto done } - ultimately show ?thesis by auto + ultimately show ?thesis + by auto qed - lemma continuous_at_const: - fixes f :: "'a::t2_space => ereal" - assumes "ALL x. (f x = C)" - shows "ALL x. continuous (at x) f" - unfolding continuous_at_open using assms t1_space by auto - + fixes f :: "'a::t2_space \ ereal" + assumes "\x. f x = C" + shows "\x. continuous (at x) f" + unfolding continuous_at_open + using assms t1_space + by auto lemma mono_closed_real: fixes S :: "real set" - assumes mono: "ALL y z. y:S & y<=z --> z:S" + assumes mono: "\y z. y \ S \ y \ z \ z \ S" and "closed S" - shows "S = {} | S = UNIV | (EX a. S = {a ..})" + shows "S = {} \ S = UNIV \ (\a. S = {a..})" proof - - { assume "S ~= {}" - { assume ex: "EX B. ALL x:S. B<=x" - then have *: "ALL x:S. Inf S <= x" using cInf_lower_EX[of _ S] ex by metis - then have "Inf S : S" apply (subst closed_contains_Inf) using ex `S ~= {}` `closed S` by auto - then have "ALL x. (Inf S <= x <-> x:S)" using mono[rule_format, of "Inf S"] * by auto - then have "S = {Inf S ..}" by auto - then have "EX a. S = {a ..}" by auto + { + assume "S \ {}" + { assume ex: "\B. \x\S. B \ x" + then have *: "\x\S. Inf S \ x" + using cInf_lower_EX[of _ S] ex by metis + then have "Inf S \ S" + apply (subst closed_contains_Inf) + using ex `S \ {}` `closed S` + apply auto + done + then have "\x. Inf S \ x \ x \ S" + using mono[rule_format, of "Inf S"] * + by auto + then have "S = {Inf S ..}" + by auto + then have "\a. S = {a ..}" + by auto } moreover - { assume "~(EX B. ALL x:S. B<=x)" - then have nex: "ALL B. EX x:S. x (\B. \x\S. B \ x)" + then have nex: "\B. \x\S. x < B" + by (simp add: not_le) + { + fix y + obtain x where "x\S" and "x < y" + using nex by auto + then have "y \ S" + using mono[rule_format, of x y] by auto + } + then have "S = UNIV" + by auto } - ultimately have "S = UNIV | (EX a. S = {a ..})" by blast - } then show ?thesis by blast + ultimately have "S = UNIV \ (\a. S = {a ..})" + by blast + } + then show ?thesis + by blast qed - lemma mono_closed_ereal: fixes S :: "real set" - assumes mono: "ALL y z. y:S & y<=z --> z:S" + assumes mono: "\y z. y \ S \ y \ z \ z \ S" and "closed S" - shows "EX a. S = {x. a <= ereal x}" + shows "\a. S = {x. a \ ereal x}" proof - - { assume "S = {}" - then have ?thesis apply(rule_tac x=PInfty in exI) by auto } + { + assume "S = {}" + then have ?thesis + apply (rule_tac x=PInfty in exI) + apply auto + done + } moreover - { assume "S = UNIV" - then have ?thesis apply(rule_tac x="-\" in exI) by auto } + { + assume "S = UNIV" + then have ?thesis + apply (rule_tac x="-\" in exI) + apply auto + done + } moreover - { assume "EX a. S = {a ..}" - then obtain a where "S={a ..}" by auto - then have ?thesis apply(rule_tac x="ereal a" in exI) by auto + { + assume "\a. S = {a ..}" + then obtain a where "S = {a ..}" + by auto + then have ?thesis + apply (rule_tac x="ereal a" in exI) + apply auto + done } - ultimately show ?thesis using mono_closed_real[of S] assms by auto + ultimately show ?thesis + using mono_closed_real[of S] assms by auto qed + subsection {* Sums *} lemma setsum_ereal[simp]: "(\x\A. ereal (f x)) = ereal (\x\A. f x)" -proof cases - assume "finite A" +proof (cases "finite A") + case True then show ?thesis by induct auto -qed simp +next + case False + then show ?thesis by simp +qed lemma setsum_Pinfty: fixes f :: "'a \ ereal" - shows "(\x\P. f x) = \ \ (finite P \ (\i\P. f i = \))" + shows "(\x\P. f x) = \ \ finite P \ (\i\P. f i = \)" proof safe assume *: "setsum f P = \" show "finite P" - proof (rule ccontr) assume "infinite P" with * show False by auto qed + proof (rule ccontr) + assume "infinite P" + with * show False + by auto + qed show "\i\P. f i = \" proof (rule ccontr) - assume "\ ?thesis" then have "\i. i \ P \ f i \ \" by auto - from `finite P` this have "setsum f P \ \" + assume "\ ?thesis" + then have "\i. i \ P \ f i \ \" + by auto + with `finite P` have "setsum f P \ \" by induct auto - with * show False by auto + with * show False + by auto qed next - fix i assume "finite P" "i \ P" "f i = \" + fix i + assume "finite P" and "i \ P" and "f i = \" then show "setsum f P = \" proof induct case (insert x A) @@ -594,23 +776,30 @@ lemma setsum_Inf: fixes f :: "'a \ ereal" - shows "\setsum f A\ = \ \ (finite A \ (\i\A. \f i\ = \))" + shows "\setsum f A\ = \ \ finite A \ (\i\A. \f i\ = \)" proof assume *: "\setsum f A\ = \" - have "finite A" by (rule ccontr) (insert *, auto) + have "finite A" + by (rule ccontr) (insert *, auto) moreover have "\i\A. \f i\ = \" proof (rule ccontr) - assume "\ ?thesis" then have "\i\A. \r. f i = ereal r" by auto - from bchoice[OF this] guess r .. - with * show False by auto + assume "\ ?thesis" + then have "\i\A. \r. f i = ereal r" + by auto + from bchoice[OF this] obtain r where "\x\A. f x = ereal (r x)" .. + with * show False + by auto qed - ultimately show "finite A \ (\i\A. \f i\ = \)" by auto + ultimately show "finite A \ (\i\A. \f i\ = \)" + by auto next assume "finite A \ (\i\A. \f i\ = \)" - then obtain i where "finite A" "i \ A" "\f i\ = \" by auto + then obtain i where "finite A" "i \ A" and "\f i\ = \" + by auto then show "\setsum f A\ = \" proof induct - case (insert j A) then show ?case + case (insert j A) + then show ?case by (cases rule: ereal3_cases[of "f i" "f j" "setsum f A"]) auto qed simp qed @@ -622,26 +811,33 @@ proof - have "\x\S. \r. f x = ereal r" proof - fix x assume "x \ S" - from assms[OF this] show "\r. f x = ereal r" by (cases "f x") auto + fix x + assume "x \ S" + from assms[OF this] show "\r. f x = ereal r" + by (cases "f x") auto qed - from bchoice[OF this] guess r .. - then show ?thesis by simp + from bchoice[OF this] obtain r where "\x\S. f x = ereal (r x)" .. + then show ?thesis + by simp qed lemma setsum_ereal_0: - fixes f :: "'a \ ereal" assumes "finite A" "\i. i \ A \ 0 \ f i" + fixes f :: "'a \ ereal" + assumes "finite A" + and "\i. i \ A \ 0 \ f i" shows "(\x\A. f x) = 0 \ (\i\A. f i = 0)" proof assume *: "(\x\A. f x) = 0" - then have "(\x\A. f x) \ \" by auto - then have "\i\A. \f i\ \ \" using assms by (force simp: setsum_Pinfty) - then have "\i\A. \r. f i = ereal r" by auto + then have "(\x\A. f x) \ \" + by auto + then have "\i\A. \f i\ \ \" + using assms by (force simp: setsum_Pinfty) + then have "\i\A. \r. f i = ereal r" + by auto from bchoice[OF this] * assms show "\i\A. f i = 0" using setsum_nonneg_eq_0_iff[of A "\i. real (f i)"] by auto qed (rule setsum_0') - lemma setsum_ereal_right_distrib: fixes f :: "'a \ ereal" assumes "\i. i \ A \ 0 \ f i" @@ -658,29 +854,35 @@ shows "f sums (SUP n. \ii. \j=0.. ereal" assumes "\i. 0 \ f i" shows "summable f" - using sums_ereal_positive[of f, OF assms] unfolding summable_def by auto + using sums_ereal_positive[of f, OF assms] + unfolding summable_def + by auto lemma suminf_ereal_eq_SUPR: fixes f :: "nat \ ereal" assumes "\i. 0 \ f i" shows "(\x. f x) = (SUP n. \ix. ereal (f x)) sums ereal x \ f sums x" unfolding sums_def by simp lemma suminf_bound: fixes f :: "nat \ ereal" - assumes "\N. (\n x" and pos: "\n. 0 \ f n" + assumes "\N. (\n x" + and pos: "\n. 0 \ f n" shows "suminf f \ x" proof (rule Lim_bounded_ereal) have "summable f" using pos[THEN summable_ereal_pos] . @@ -700,7 +902,8 @@ case (real r) then have "\N. (\n x - y" using assms by (simp add: ereal_le_minus) - then have "(\ n. f n) \ x - y" using pos by (rule suminf_bound) + then have "(\ n. f n) \ x - y" + using pos by (rule suminf_bound) then show "(\ n. f n) + y \ x" using assms real by (simp add: ereal_le_minus) qed (insert assms, auto) @@ -716,28 +919,37 @@ fixes f :: "nat \ ereal" assumes "\n. 0 \ f n" shows "0 \ (\n. f n)" - using suminf_upper[of f 0, OF assms] by simp + using suminf_upper[of f 0, OF assms] + by simp lemma suminf_le_pos: fixes f g :: "nat \ ereal" - assumes "\N. f N \ g N" "\N. 0 \ f N" + assumes "\N. f N \ g N" + and "\N. 0 \ f N" shows "suminf f \ suminf g" proof (safe intro!: suminf_bound) fix n - { fix N have "0 \ g N" using assms(2,1)[of N] by auto } + { + fix N + have "0 \ g N" + using assms(2,1)[of N] by auto + } have "setsum f {.. setsum g {.. suminf g" using `\N. 0 \ g N` by (rule suminf_upper) + also have "\ \ suminf g" + using `\N. 0 \ g N` + by (rule suminf_upper) finally show "setsum f {.. suminf g" . qed (rule assms(2)) -lemma suminf_half_series_ereal: "(\n. (1/2 :: ereal)^Suc n) = 1" +lemma suminf_half_series_ereal: "(\n. (1/2 :: ereal) ^ Suc n) = 1" using sums_ereal[THEN iffD2, OF power_half_series, THEN sums_unique, symmetric] by (simp add: one_ereal_def) lemma suminf_add_ereal: fixes f g :: "nat \ ereal" - assumes "\i. 0 \ f i" "\i. 0 \ g i" + assumes "\i. 0 \ f i" + and "\i. 0 \ g i" shows "(\i. f i + g i) = suminf f + suminf g" apply (subst (1 2 3) suminf_ereal_eq_SUPR) unfolding setsum_addf @@ -746,36 +958,45 @@ lemma suminf_cmult_ereal: fixes f g :: "nat \ ereal" - assumes "\i. 0 \ f i" "0 \ a" + assumes "\i. 0 \ f i" + and "0 \ a" shows "(\i. a * f i) = a * suminf f" by (auto simp: setsum_ereal_right_distrib[symmetric] assms - ereal_zero_le_0_iff setsum_nonneg suminf_ereal_eq_SUPR - intro!: SUPR_ereal_cmult ) + ereal_zero_le_0_iff setsum_nonneg suminf_ereal_eq_SUPR + intro!: SUPR_ereal_cmult ) lemma suminf_PInfty: fixes f :: "nat \ ereal" - assumes "\i. 0 \ f i" "suminf f \ \" + assumes "\i. 0 \ f i" + and "suminf f \ \" shows "f i \ \" proof - from suminf_upper[of f "Suc i", OF assms(1)] assms(2) - have "(\i \" by auto - then show ?thesis unfolding setsum_Pinfty by simp + have "(\i \" + by auto + then show ?thesis + unfolding setsum_Pinfty by simp qed lemma suminf_PInfty_fun: - assumes "\i. 0 \ f i" "suminf f \ \" + assumes "\i. 0 \ f i" + and "suminf f \ \" shows "\f'. f = (\x. ereal (f' x))" proof - have "\i. \r. f i = ereal r" proof - fix i show "\r. f i = ereal r" - using suminf_PInfty[OF assms] assms(1)[of i] by (cases "f i") auto + fix i + show "\r. f i = ereal r" + using suminf_PInfty[OF assms] assms(1)[of i] + by (cases "f i") auto qed - from choice[OF this] show ?thesis by auto + from choice[OF this] show ?thesis + by auto qed lemma summable_ereal: - assumes "\i. 0 \ f i" "(\i. ereal (f i)) \ \" + assumes "\i. 0 \ f i" + and "(\i. ereal (f i)) \ \" shows "summable f" proof - have "0 \ (\i. ereal (f i))" @@ -783,37 +1004,53 @@ with assms obtain r where r: "(\i. ereal (f i)) = ereal r" by (cases "\i. ereal (f i)") auto from summable_ereal_pos[of "\x. ereal (f x)"] - have "summable (\x. ereal (f x))" using assms by auto + have "summable (\x. ereal (f x))" + using assms by auto from summable_sums[OF this] - have "(\x. ereal (f x)) sums (\x. ereal (f x))" by auto + have "(\x. ereal (f x)) sums (\x. ereal (f x))" + by auto then show "summable f" unfolding r sums_ereal summable_def .. qed lemma suminf_ereal: - assumes "\i. 0 \ f i" "(\i. ereal (f i)) \ \" + assumes "\i. 0 \ f i" + and "(\i. ereal (f i)) \ \" shows "(\i. ereal (f i)) = ereal (suminf f)" proof (rule sums_unique[symmetric]) from summable_ereal[OF assms] show "(\x. ereal (f x)) sums (ereal (suminf f))" - unfolding sums_ereal using assms by (intro summable_sums summable_ereal) + unfolding sums_ereal + using assms + by (intro summable_sums summable_ereal) qed lemma suminf_ereal_minus: fixes f g :: "nat \ ereal" - assumes ord: "\i. g i \ f i" "\i. 0 \ g i" and fin: "suminf f \ \" "suminf g \ \" + assumes ord: "\i. g i \ f i" "\i. 0 \ g i" + and fin: "suminf f \ \" "suminf g \ \" shows "(\i. f i - g i) = suminf f - suminf g" proof - - { fix i have "0 \ f i" using ord[of i] by auto } + { + fix i + have "0 \ f i" + using ord[of i] by auto + } moreover - from suminf_PInfty_fun[OF `\i. 0 \ f i` fin(1)] guess f' .. note this[simp] - from suminf_PInfty_fun[OF `\i. 0 \ g i` fin(2)] guess g' .. note this[simp] - { fix i have "0 \ f i - g i" using ord[of i] by (auto simp: ereal_le_minus_iff) } + from suminf_PInfty_fun[OF `\i. 0 \ f i` fin(1)] obtain f' where [simp]: "f = (\x. ereal (f' x))" .. + from suminf_PInfty_fun[OF `\i. 0 \ g i` fin(2)] obtain g' where [simp]: "g = (\x. ereal (g' x))" .. + { + fix i + have "0 \ f i - g i" + using ord[of i] by (auto simp: ereal_le_minus_iff) + } moreover have "suminf (\i. f i - g i) \ suminf f" using assms by (auto intro!: suminf_le_pos simp: field_simps) - then have "suminf (\i. f i - g i) \ \" using fin by auto - ultimately show ?thesis using assms `\i. 0 \ f i` + then have "suminf (\i. f i - g i) \ \" + using fin by auto + ultimately show ?thesis + using assms `\i. 0 \ f i` apply simp apply (subst (1 2 3) suminf_ereal) apply (auto intro!: suminf_diff[symmetric] summable_ereal) @@ -822,8 +1059,10 @@ lemma suminf_ereal_PInf [simp]: "(\x. \::ereal) = \" proof - - have "(\i) \ (\x. \::ereal)" by (rule suminf_upper) auto - then show ?thesis by simp + have "(\i) \ (\x. \::ereal)" + by (rule suminf_upper) auto + then show ?thesis + by simp qed lemma summable_real_of_ereal: @@ -832,27 +1071,42 @@ and fin: "(\i. f i) \ \" shows "summable (\i. real (f i))" proof (rule summable_def[THEN iffD2]) - have "0 \ (\i. f i)" using assms by (auto intro: suminf_0_le) - with fin obtain r where r: "ereal r = (\i. f i)" by (cases "(\i. f i)") auto - { fix i have "f i \ \" using f by (intro suminf_PInfty[OF _ fin]) auto - then have "\f i\ \ \" using f[of i] by auto } + have "0 \ (\i. f i)" + using assms by (auto intro: suminf_0_le) + with fin obtain r where r: "ereal r = (\i. f i)" + by (cases "(\i. f i)") auto + { + fix i + have "f i \ \" + using f by (intro suminf_PInfty[OF _ fin]) auto + then have "\f i\ \ \" + using f[of i] by auto + } note fin = this have "(\i. ereal (real (f i))) sums (\i. ereal (real (f i)))" - using f by (auto intro!: summable_ereal_pos summable_sums simp: ereal_le_real_iff zero_ereal_def) - also have "\ = ereal r" using fin r by (auto simp: ereal_real) - finally show "\r. (\i. real (f i)) sums r" by (auto simp: sums_ereal) + using f + by (auto intro!: summable_ereal_pos summable_sums simp: ereal_le_real_iff zero_ereal_def) + also have "\ = ereal r" + using fin r by (auto simp: ereal_real) + finally show "\r. (\i. real (f i)) sums r" + by (auto simp: sums_ereal) qed lemma suminf_SUP_eq: fixes f :: "nat \ nat \ ereal" - assumes "\i. incseq (\n. f n i)" "\n i. 0 \ f n i" + assumes "\i. incseq (\n. f n i)" + and "\n i. 0 \ f n i" shows "(\i. SUP n. f n i) = (SUP n. \i. f n i)" proof - - { fix n :: nat + { + fix n :: nat have "(\ii _ \ ereal" assumes nonneg: "\i a. a \ A \ 0 \ f i a" shows "(\i. \a\A. f i a) = (\a\A. \i. f i a)" -proof cases - assume "finite A" - then show ?thesis using nonneg +proof (cases "finite A") + case True + then show ?thesis + using nonneg by induct (simp_all add: suminf_add_ereal setsum_nonneg) -qed simp +next + case False + then show ?thesis by simp +qed lemma suminf_ereal_eq_0: fixes f :: "nat \ ereal" @@ -877,14 +1135,21 @@ shows "(\i. f i) = 0 \ (\i. f i = 0)" proof assume "(\i. f i) = 0" - { fix i assume "f i \ 0" - with nneg have "0 < f i" by (auto simp: less_le) + { + fix i + assume "f i \ 0" + with nneg have "0 < f i" + by (auto simp: less_le) also have "f i = (\j. if j = i then f i else 0)" by (subst suminf_finite[where N="{i}"]) auto also have "\ \ (\i. f i)" - using nneg by (auto intro!: suminf_le_pos) - finally have False using `(\i. f i) = 0` by auto } - then show "\i. f i = 0" by auto + using nneg + by (auto intro!: suminf_le_pos) + finally have False + using `(\i. f i) = 0` by auto + } + then show "\i. f i = 0" + by auto qed simp lemma Liminf_within: @@ -892,13 +1157,15 @@ shows "Liminf (at x within S) f = (SUP e:{0<..}. INF y:(S \ ball x e - {x}). f y)" unfolding Liminf_def eventually_at proof (rule SUPR_eq, simp_all add: Ball_def Bex_def, safe) - fix P d assume "0 < d" "\y. y \ S \ y \ x \ dist y x < d \ P y" + fix P d + assume "0 < d" and "\y. y \ S \ y \ x \ dist y x < d \ P y" then have "S \ ball x d - {x} \ {x. P x}" by (auto simp: zero_less_dist_iff dist_commute) then show "\r>0. INFI (Collect P) f \ INFI (S \ ball x r - {x}) f" by (intro exI[of _ d] INF_mono conjI `0 < d`) auto next - fix d :: real assume "0 < d" + fix d :: real + assume "0 < d" then show "\P. (\d>0. \xa. xa \ S \ xa \ x \ dist xa x < d \ P xa) \ INFI (S \ ball x d - {x}) f \ INFI (Collect P) f" by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) @@ -906,17 +1173,19 @@ qed lemma Limsup_within: - fixes f :: "'a::metric_space => 'b::complete_lattice" + fixes f :: "'a::metric_space \ 'b::complete_lattice" shows "Limsup (at x within S) f = (INF e:{0<..}. SUP y:(S \ ball x e - {x}). f y)" unfolding Limsup_def eventually_at proof (rule INFI_eq, simp_all add: Ball_def Bex_def, safe) - fix P d assume "0 < d" "\y. y \ S \ y \ x \ dist y x < d \ P y" + fix P d + assume "0 < d" and "\y. y \ S \ y \ x \ dist y x < d \ P y" then have "S \ ball x d - {x} \ {x. P x}" by (auto simp: zero_less_dist_iff dist_commute) then show "\r>0. SUPR (S \ ball x r - {x}) f \ SUPR (Collect P) f" by (intro exI[of _ d] SUP_mono conjI `0 < d`) auto next - fix d :: real assume "0 < d" + fix d :: real + assume "0 < d" then show "\P. (\d>0. \xa. xa \ S \ xa \ x \ dist xa x < d \ P xa) \ SUPR (Collect P) f \ SUPR (S \ ball x d - {x}) f" by (intro exI[of _ "\y. y \ S \ ball x d - {x}"]) @@ -924,17 +1193,17 @@ qed lemma Liminf_at: - fixes f :: "'a::metric_space => _" + fixes f :: "'a::metric_space \ _" shows "Liminf (at x) f = (SUP e:{0<..}. INF y:(ball x e - {x}). f y)" using Liminf_within[of x UNIV f] by simp lemma Limsup_at: - fixes f :: "'a::metric_space => _" + fixes f :: "'a::metric_space \ _" shows "Limsup (at x) f = (INF e:{0<..}. SUP y:(ball x e - {x}). f y)" using Limsup_within[of x UNIV f] by simp lemma min_Liminf_at: - fixes f :: "'a::metric_space => 'b::complete_linorder" + fixes f :: "'a::metric_space \ 'b::complete_linorder" shows "min (f x) (Liminf (at x) f) = (SUP e:{0<..}. INF y:ball x e. f y)" unfolding inf_min[symmetric] Liminf_at apply (subst inf_commute) @@ -944,6 +1213,7 @@ apply (simp add: INF_def del: inf_ereal_def) done + subsection {* monoset *} definition (in order) mono_set: @@ -957,10 +1227,11 @@ lemma (in complete_linorder) mono_set_iff: fixes S :: "'a set" defines "a \ Inf S" - shows "mono_set S \ (S = {a <..} \ S = {a..})" (is "_ = ?c") + shows "mono_set S \ S = {a <..} \ S = {a..}" (is "_ = ?c") proof assume "mono_set S" - then have mono: "\x y. x \ y \ x \ S \ y \ S" by (auto simp: mono_set) + then have mono: "\x y. x \ y \ x \ S \ y \ S" + by (auto simp: mono_set) show ?c proof cases assume "a \ S" @@ -972,12 +1243,16 @@ have "S = {a <..}" proof safe fix x assume "x \ S" - then have "a \ x" unfolding a_def by (rule Inf_lower) - then show "a < x" using `x \ S` `a \ S` by (cases "a = x") auto + then have "a \ x" + unfolding a_def by (rule Inf_lower) + then show "a < x" + using `x \ S` `a \ S` by (cases "a = x") auto next fix x assume "a < x" - then obtain y where "y < x" "y \ S" unfolding a_def Inf_less_iff .. - with mono[of y x] show "x \ S" by auto + then obtain y where "y < x" "y \ S" + unfolding a_def Inf_less_iff .. + with mono[of y x] show "x \ S" + by auto qed then show ?c .. qed @@ -985,29 +1260,34 @@ lemma ereal_open_mono_set: fixes S :: "ereal set" - shows "(open S \ mono_set S) \ (S = UNIV \ S = {Inf S <..})" + shows "open S \ mono_set S \ S = UNIV \ S = {Inf S <..}" by (metis Inf_UNIV atLeast_eq_UNIV_iff ereal_open_atLeast ereal_open_closed mono_set_iff open_ereal_greaterThan) lemma ereal_closed_mono_set: fixes S :: "ereal set" - shows "(closed S \ mono_set S) \ (S = {} \ S = {Inf S ..})" + shows "closed S \ mono_set S \ S = {} \ S = {Inf S ..}" by (metis Inf_UNIV atLeast_eq_UNIV_iff closed_ereal_atLeast ereal_open_closed mono_empty mono_set_iff open_ereal_greaterThan) lemma ereal_Liminf_Sup_monoset: - fixes f :: "'a => ereal" + fixes f :: "'a \ ereal" shows "Liminf net f = Sup {l. \S. open S \ mono_set S \ l \ S \ eventually (\x. f x \ S) net}" (is "_ = Sup ?A") proof (safe intro!: Liminf_eqI complete_lattice_class.Sup_upper complete_lattice_class.Sup_least) - fix P assume P: "eventually P net" - fix S assume S: "mono_set S" "INFI (Collect P) f \ S" - { fix x assume "P x" + fix P + assume P: "eventually P net" + fix S + assume S: "mono_set S" "INFI (Collect P) f \ S" + { + fix x + assume "P x" then have "INFI (Collect P) f \ f x" by (intro complete_lattice_class.INF_lower) simp with S have "f x \ S" - by (simp add: mono_set) } + by (simp add: mono_set) + } with P show "eventually (\x. f x \ S) net" by (auto elim: eventually_elim1) next @@ -1016,7 +1296,8 @@ assume P: "\P. eventually P net \ INFI (Collect P) f \ y" show "l \ y" proof (rule dense_le) - fix B assume "B < l" + fix B + assume "B < l" then have "eventually (\x. f x \ {B <..}) net" by (intro S[rule_format]) auto then have "INFI {x. B < f x} f \ y" @@ -1029,14 +1310,18 @@ qed lemma ereal_Limsup_Inf_monoset: - fixes f :: "'a => ereal" + fixes f :: "'a \ ereal" shows "Limsup net f = Inf {l. \S. open S \ mono_set (uminus ` S) \ l \ S \ eventually (\x. f x \ S) net}" (is "_ = Inf ?A") proof (safe intro!: Limsup_eqI complete_lattice_class.Inf_lower complete_lattice_class.Inf_greatest) - fix P assume P: "eventually P net" - fix S assume S: "mono_set (uminus`S)" "SUPR (Collect P) f \ S" - { fix x assume "P x" + fix P + assume P: "eventually P net" + fix S + assume S: "mono_set (uminus`S)" "SUPR (Collect P) f \ S" + { + fix x + assume "P x" then have "f x \ SUPR (Collect P) f" by (intro complete_lattice_class.SUP_upper) simp with S(1)[unfolded mono_set, rule_format, of "- SUPR (Collect P) f" "- f x"] S(2) @@ -1050,7 +1335,8 @@ assume P: "\P. eventually P net \ y \ SUPR (Collect P) f" show "y \ l" proof (rule dense_ge) - fix B assume "l < B" + fix B + assume "l < B" then have "eventually (\x. f x \ {..< B}) net" by (intro S[rule_format]) auto then have "y \ SUPR {x. f x < B} f" @@ -1073,19 +1359,31 @@ by (intro complete_lattice_class.Sup_upper) auto next assume "x0 \ liminf x" - { fix S :: "ereal set" - assume om: "open S & mono_set S & x0:S" - { assume "S = UNIV" then have "EX N. (ALL n>=N. x n : S)" by auto } + { + fix S :: "ereal set" + assume om: "open S" "mono_set S" "x0 \ S" + { + assume "S = UNIV" + then have "\N. \n\N. x n \ S" + by auto + } moreover - { assume "~(S=UNIV)" - then obtain B where B_def: "S = {B<..}" using om ereal_open_mono_set by auto - then have "B=N. x n : S" - unfolding B_def using `x0 \ liminf x` liminf_bounded_iff by auto + { + assume "S \ UNIV" + then obtain B where B: "S = {B<..}" + using om ereal_open_mono_set by auto + then have "B < x0" + using om by auto + then have "\N. \n\N. x n \ S" + unfolding B + using `x0 \ liminf x` liminf_bounded_iff + by auto } - ultimately have "EX N. (ALL n>=N. x n : S)" by auto + ultimately have "\N. \n\N. x n \ S" + by auto } - then show "?P x0" by auto + then show "?P x0" + by auto qed end