1 (* Title: HOL/Multivariate_Analysis/Extended_Real_Limits.thy
2 Author: Johannes Hölzl, TU München
3 Author: Robert Himmelmann, TU München
4 Author: Armin Heller, TU München
5 Author: Bogdan Grechuk, University of Edinburgh
8 header {* Limits on the Extended real number line *}
10 theory Extended_Real_Limits
11 imports Topology_Euclidean_Space "~~/src/HOL/Library/Extended_Real"
14 lemma convergent_limsup_cl:
15 fixes X :: "nat \<Rightarrow> 'a::{complete_linorder,linorder_topology}"
16 shows "convergent X \<Longrightarrow> limsup X = lim X"
17 by (auto simp: convergent_def limI lim_imp_Limsup)
19 lemma lim_increasing_cl:
20 assumes "\<And>n m. n \<ge> m \<Longrightarrow> f n \<ge> f m"
21 obtains l where "f ----> (l::'a::{complete_linorder,linorder_topology})"
23 show "f ----> (SUP n. f n)"
25 by (intro increasing_tendsto)
26 (auto simp: SUP_upper eventually_sequentially less_SUP_iff intro: less_le_trans)
29 lemma lim_decreasing_cl:
30 assumes "\<And>n m. n \<ge> m \<Longrightarrow> f n \<le> f m"
31 obtains l where "f ----> (l::'a::{complete_linorder,linorder_topology})"
33 show "f ----> (INF n. f n)"
35 by (intro decreasing_tendsto)
36 (auto simp: INF_lower eventually_sequentially INF_less_iff intro: le_less_trans)
39 lemma compact_complete_linorder:
40 fixes X :: "nat \<Rightarrow> 'a::{complete_linorder,linorder_topology}"
41 shows "\<exists>l r. subseq r \<and> (X \<circ> r) ----> l"
43 obtain r where "subseq r" and mono: "monoseq (X \<circ> r)"
44 using seq_monosub[of X]
47 then have "(\<forall>n m. m \<le> n \<longrightarrow> (X \<circ> r) m \<le> (X \<circ> r) n) \<or> (\<forall>n m. m \<le> n \<longrightarrow> (X \<circ> r) n \<le> (X \<circ> r) m)"
48 by (auto simp add: monoseq_def)
49 then obtain l where "(X \<circ> r) ----> l"
50 using lim_increasing_cl[of "X \<circ> r"] lim_decreasing_cl[of "X \<circ> r"]
53 using `subseq r` by auto
57 "compact (UNIV :: 'a::{complete_linorder,linorder_topology,second_countable_topology} set)"
58 using compact_complete_linorder
59 by (auto simp: seq_compact_eq_compact[symmetric] seq_compact_def)
61 lemma compact_eq_closed:
62 fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set"
63 shows "compact S \<longleftrightarrow> closed S"
64 using closed_inter_compact[of S, OF _ compact_UNIV] compact_imp_closed
67 lemma closed_contains_Sup_cl:
68 fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set"
73 from compact_eq_closed[of S] compact_attains_sup[of S] assms
74 obtain s where S: "s \<in> S" "\<forall>t\<in>S. t \<le> s"
77 by (auto intro!: Sup_eqI)
82 lemma closed_contains_Inf_cl:
83 fixes S :: "'a::{complete_linorder,linorder_topology,second_countable_topology} set"
88 from compact_eq_closed[of S] compact_attains_inf[of S] assms
89 obtain s where S: "s \<in> S" "\<forall>t\<in>S. s \<le> t"
92 by (auto intro!: Inf_eqI)
99 shows "x < y \<Longrightarrow> \<exists>r::rat. x < real_of_rat r \<and> real_of_rat r < y"
100 proof (cases x y rule: ereal2_cases, simp_all)
103 from Rats_dense_in_real[OF this] show "\<exists>x. r < real_of_rat x \<and> real_of_rat x < q"
104 by (fastforce simp: Rats_def)
107 show "\<exists>x. r < real_of_rat x" "\<exists>x. real_of_rat x < r"
108 using gt_ex[of r] lt_ex[of r] Rats_dense_in_real
109 by (auto simp: Rats_def)
112 instance ereal :: second_countable_topology
113 proof (default, intro exI conjI)
114 let ?B = "(\<Union>r\<in>\<rat>. {{..< r}, {r <..}} :: ereal set set)"
116 by (auto intro: countable_rat)
117 show "open = generate_topology ?B"
118 proof (intro ext iffI)
121 then show "generate_topology ?B S"
122 unfolding open_generated_order
125 then obtain e where "b = {..<e} \<or> b = {e<..}"
127 moreover have "{..<e} = \<Union>{{..<x}|x. x \<in> \<rat> \<and> x < e}" "{e<..} = \<Union>{{x<..}|x. x \<in> \<rat> \<and> e < x}"
128 by (auto dest: ereal_dense3
130 simp add: ex_simps[symmetric] conj_commute Rats_def image_iff)
131 ultimately show ?case
132 by (auto intro: generate_topology.intros)
133 qed (auto intro: generate_topology.intros)
136 assume "generate_topology ?B S"
142 lemma continuous_on_ereal[intro, simp]: "continuous_on A ereal"
143 unfolding continuous_on_topological open_ereal_def
146 lemma continuous_at_ereal[intro, simp]: "continuous (at x) ereal"
147 using continuous_on_eq_continuous_at[of UNIV]
150 lemma continuous_within_ereal[intro, simp]: "x \<in> A \<Longrightarrow> continuous (at x within A) ereal"
151 using continuous_on_eq_continuous_within[of A]
154 lemma ereal_open_uminus:
155 fixes S :: "ereal set"
157 shows "open (uminus ` S)"
158 using `open S`[unfolded open_generated_order]
160 have "range uminus = (UNIV :: ereal set)"
161 by (auto simp: image_iff ereal_uminus_eq_reorder)
162 then show "open (range uminus :: ereal set)"
164 qed (auto simp add: image_Union image_Int)
166 lemma ereal_uminus_complement:
167 fixes S :: "ereal set"
168 shows "uminus ` (- S) = - uminus ` S"
169 by (auto intro!: bij_image_Compl_eq surjI[of _ uminus] simp: bij_betw_def)
171 lemma ereal_closed_uminus:
172 fixes S :: "ereal set"
174 shows "closed (uminus ` S)"
176 unfolding closed_def ereal_uminus_complement[symmetric]
177 by (rule ereal_open_uminus)
179 lemma ereal_open_closed_aux:
180 fixes S :: "ereal set"
183 and S: "(-\<infinity>) \<notin> S"
186 assume "\<not> ?thesis"
187 then have *: "Inf S \<in> S"
188 by (metis assms(2) closed_contains_Inf_cl)
190 assume "Inf S = -\<infinity>"
192 using * assms(3) by auto
196 assume "Inf S = \<infinity>"
197 then have "S = {\<infinity>}"
198 by (metis Inf_eq_PInfty `S \<noteq> {}`)
200 by (metis assms(1) not_open_singleton)
204 assume fin: "\<bar>Inf S\<bar> \<noteq> \<infinity>"
205 from ereal_open_cont_interval[OF assms(1) * fin]
206 obtain e where e: "e > 0" "{Inf S - e<..<Inf S + e} \<subseteq> S" .
207 then obtain b where b: "Inf S - e < b" "b < Inf S"
208 using fin ereal_between[of "Inf S" e] dense[of "Inf S - e"]
210 then have "b: {Inf S - e <..< Inf S + e}"
211 using e fin ereal_between[of "Inf S" e]
213 then have "b \<in> S"
216 using b by (metis complete_lattice_class.Inf_lower leD)
218 ultimately show False
222 lemma ereal_open_closed:
223 fixes S :: "ereal set"
224 shows "open S \<and> closed S \<longleftrightarrow> S = {} \<or> S = UNIV"
227 assume lhs: "open S \<and> closed S"
229 assume "-\<infinity> \<notin> S"
231 using lhs ereal_open_closed_aux by auto
235 assume "-\<infinity> \<in> S"
237 using lhs ereal_open_closed_aux[of "-S"] by auto
239 ultimately have "S = {} \<or> S = UNIV"
246 lemma ereal_open_affinity_pos:
247 fixes S :: "ereal set"
249 and m: "m \<noteq> \<infinity>" "0 < m"
250 and t: "\<bar>t\<bar> \<noteq> \<infinity>"
251 shows "open ((\<lambda>x. m * x + t) ` S)"
253 obtain r where r[simp]: "m = ereal r"
254 using m by (cases m) auto
255 obtain p where p[simp]: "t = ereal p"
257 have "r \<noteq> 0" "0 < r" and m': "m \<noteq> \<infinity>" "m \<noteq> -\<infinity>" "m \<noteq> 0"
259 from `open S` [THEN ereal_openE] guess l u . note T = this
260 let ?f = "(\<lambda>x. m * x + t)"
262 unfolding open_ereal_def
263 proof (intro conjI impI exI subsetI)
264 have "ereal -` ?f ` S = (\<lambda>x. r * x + p) ` (ereal -` S)"
267 assume "ereal y = m * x + t" "x \<in> S"
268 then show "y \<in> (\<lambda>x. r * x + p) ` ereal -` S"
269 using `r \<noteq> 0` by (cases x) (auto intro!: image_eqI[of _ _ "real x"] split: split_if_asm)
271 then show "open (ereal -` ?f ` S)"
272 using open_affinity[OF T(1) `r \<noteq> 0`]
273 by (auto simp: ac_simps)
275 assume "\<infinity> \<in> ?f`S"
276 with `0 < r` have "\<infinity> \<in> S"
279 assume "x \<in> {ereal (r * l + p)<..}"
280 then have [simp]: "ereal (r * l + p) < x"
283 proof (rule image_eqI)
284 show "x = m * ((x - t) / m) + t"
286 by (cases rule: ereal3_cases[of m x t]) auto
287 have "ereal l < (x - t) / m"
289 by (simp add: ereal_less_divide_pos ereal_less_minus)
290 then show "(x - t) / m \<in> S"
291 using T(2)[OF `\<infinity> \<in> S`] by auto
294 assume "-\<infinity> \<in> ?f ` S"
295 with `0 < r` have "-\<infinity> \<in> S"
297 fix x assume "x \<in> {..<ereal (r * u + p)}"
298 then have [simp]: "x < ereal (r * u + p)"
301 proof (rule image_eqI)
302 show "x = m * ((x - t) / m) + t"
304 by (cases rule: ereal3_cases[of m x t]) auto
305 have "(x - t)/m < ereal u"
307 by (simp add: ereal_divide_less_pos ereal_minus_less)
308 then show "(x - t)/m \<in> S"
309 using T(3)[OF `-\<infinity> \<in> S`]
315 lemma ereal_open_affinity:
316 fixes S :: "ereal set"
318 and m: "\<bar>m\<bar> \<noteq> \<infinity>" "m \<noteq> 0"
319 and t: "\<bar>t\<bar> \<noteq> \<infinity>"
320 shows "open ((\<lambda>x. m * x + t) ` S)"
324 using ereal_open_affinity_pos[OF `open S` _ _ t, of m] m
327 assume "\<not> 0 < m" then
331 then have m: "-m \<noteq> \<infinity>" "0 < -m"
332 using `\<bar>m\<bar> \<noteq> \<infinity>`
333 by (auto simp: ereal_uminus_eq_reorder)
334 from ereal_open_affinity_pos[OF ereal_open_uminus[OF `open S`] m t] show ?thesis
335 unfolding image_image by simp
338 lemma ereal_lim_mult:
339 fixes X :: "'a \<Rightarrow> ereal"
340 assumes lim: "(X ---> L) net"
341 and a: "\<bar>a\<bar> \<noteq> \<infinity>"
342 shows "((\<lambda>i. a * X i) ---> a * L) net"
344 assume "a \<noteq> 0"
346 proof (rule topological_tendstoI)
348 assume "open S" and "a * L \<in> S"
350 using `a \<noteq> 0` a
351 by (cases rule: ereal2_cases[of a L]) auto
352 then have L: "L \<in> ((\<lambda>x. x / a) ` S)"
353 using `a * L \<in> S`
354 by (force simp: image_iff)
355 moreover have "open ((\<lambda>x. x / a) ` S)"
356 using ereal_open_affinity[OF `open S`, of "inverse a" 0] `a \<noteq> 0` a
357 by (auto simp: ereal_divide_eq ereal_inverse_eq_0 divide_ereal_def ac_simps)
358 note * = lim[THEN topological_tendstoD, OF this L]
361 from a `a \<noteq> 0` have "a * (x / a) = x"
362 by (cases rule: ereal2_cases[of a x]) auto
365 show "eventually (\<lambda>x. a * X x \<in> S) net"
366 by (rule eventually_mono[OF _ *]) auto
370 lemma ereal_lim_uminus:
371 fixes X :: "'a \<Rightarrow> ereal"
372 shows "((\<lambda>i. - X i) ---> - L) net \<longleftrightarrow> (X ---> L) net"
373 using ereal_lim_mult[of X L net "ereal (-1)"]
374 ereal_lim_mult[of "(\<lambda>i. - X i)" "-L" net "ereal (-1)"]
375 by (auto simp add: algebra_simps)
377 lemma ereal_open_atLeast:
379 shows "open {x..} \<longleftrightarrow> x = -\<infinity>"
381 assume "x = -\<infinity>"
382 then have "{x..} = UNIV"
384 then show "open {x..}"
388 then have "open {x..} \<and> closed {x..}"
390 then have "{x..} = UNIV"
391 unfolding ereal_open_closed by auto
392 then show "x = -\<infinity>"
393 by (simp add: bot_ereal_def atLeast_eq_UNIV_iff)
396 lemma open_uminus_iff:
397 fixes S :: "ereal set"
398 shows "open (uminus ` S) \<longleftrightarrow> open S"
399 using ereal_open_uminus[of S] ereal_open_uminus[of "uminus ` S"]
402 lemma ereal_Liminf_uminus:
403 fixes f :: "'a \<Rightarrow> ereal"
404 shows "Liminf net (\<lambda>x. - (f x)) = - Limsup net f"
405 using ereal_Limsup_uminus[of _ "(\<lambda>x. - (f x))"] by auto
407 lemma ereal_Lim_uminus:
408 fixes f :: "'a \<Rightarrow> ereal"
409 shows "(f ---> f0) net \<longleftrightarrow> ((\<lambda>x. - f x) ---> - f0) net"
411 ereal_lim_mult[of f f0 net "- 1"]
412 ereal_lim_mult[of "\<lambda>x. - (f x)" "-f0" net "- 1"]
413 by (auto simp: ereal_uminus_reorder)
416 fixes f :: "'a \<Rightarrow> ereal"
417 assumes "\<not> trivial_limit net"
418 shows "(f ---> \<infinity>) net \<longleftrightarrow> Liminf net f = \<infinity>"
419 unfolding tendsto_iff_Liminf_eq_Limsup[OF assms]
420 using Liminf_le_Limsup[OF assms, of f]
424 fixes f :: "'a \<Rightarrow> ereal"
425 assumes "\<not> trivial_limit net"
426 shows "(f ---> -\<infinity>) net \<longleftrightarrow> Limsup net f = -\<infinity>"
427 unfolding tendsto_iff_Liminf_eq_Limsup[OF assms]
428 using Liminf_le_Limsup[OF assms, of f]
431 lemma convergent_ereal:
432 fixes X :: "nat \<Rightarrow> 'a :: {complete_linorder,linorder_topology}"
433 shows "convergent X \<longleftrightarrow> limsup X = liminf X"
434 using tendsto_iff_Liminf_eq_Limsup[of sequentially]
435 by (auto simp: convergent_def)
438 fixes X :: "nat \<Rightarrow> ereal"
439 shows "X ----> \<infinity> \<longleftrightarrow> liminf X = \<infinity>"
440 by (metis Liminf_PInfty trivial_limit_sequentially)
443 fixes X :: "nat \<Rightarrow> ereal"
444 shows "X ----> -\<infinity> \<longleftrightarrow> limsup X = -\<infinity>"
445 by (metis Limsup_MInfty trivial_limit_sequentially)
447 lemma ereal_lim_mono:
448 fixes X Y :: "nat \<Rightarrow> 'a::linorder_topology"
449 assumes "\<And>n. N \<le> n \<Longrightarrow> X n \<le> Y n"
453 using assms(1) by (intro LIMSEQ_le[OF assms(2,3)]) auto
455 lemma incseq_le_ereal:
456 fixes X :: "nat \<Rightarrow> 'a::linorder_topology"
457 assumes inc: "incseq X"
461 by (intro ereal_lim_mono[of N, OF _ tendsto_const lim]) (simp add: incseq_def)
463 lemma decseq_ge_ereal:
464 assumes dec: "decseq X"
465 and lim: "X ----> (L::'a::linorder_topology)"
467 using dec by (intro ereal_lim_mono[of N, OF _ lim tendsto_const]) (simp add: decseq_def)
473 shows "abs x \<le> max (abs a) (abs b)"
474 by (metis abs_less_iff assms leI le_max_iff_disj
475 less_eq_real_def less_le_not_le less_minus_iff minus_minus)
478 fixes a :: "'a::{complete_linorder,linorder_topology}"
479 assumes "\<And>n. b n \<in> s"
481 shows "a \<le> Sup s"
482 by (metis Lim_bounded_ereal assms complete_lattice_class.Sup_upper)
485 fixes a :: "'a::{complete_linorder,linorder_topology}"
486 assumes "\<And>n. b n \<in> s"
488 shows "Inf s \<le> a"
489 by (metis Lim_bounded2_ereal assms complete_lattice_class.Inf_lower)
492 fixes X :: "nat \<Rightarrow> 'a::{complete_linorder,linorder_topology}"
493 assumes inc: "incseq X"
495 shows "(SUP n. X n) = l"
496 using LIMSEQ_SUP[OF inc] tendsto_unique[OF trivial_limit_sequentially l]
500 fixes X :: "nat \<Rightarrow> 'a::{complete_linorder,linorder_topology}"
501 assumes dec: "decseq X"
503 shows "(INF n. X n) = l"
504 using LIMSEQ_INF[OF dec] tendsto_unique[OF trivial_limit_sequentially l]
509 shows "(SUP n. ereal (f n)) = ereal x \<longleftrightarrow> f ----> x"
511 have inc: "incseq (\<lambda>i. ereal (f i))"
512 using `mono f` unfolding mono_def incseq_def by auto
515 then have "(\<lambda>i. ereal (f i)) ----> ereal x"
517 from SUP_Lim_ereal[OF inc this] show "(SUP n. ereal (f n)) = ereal x" .
519 assume "(SUP n. ereal (f n)) = ereal x"
520 with LIMSEQ_SUP[OF inc] show "f ----> x" by auto
524 lemma liminf_ereal_cminus:
525 fixes f :: "nat \<Rightarrow> ereal"
526 assumes "c \<noteq> -\<infinity>"
527 shows "liminf (\<lambda>x. c - f x) = c - limsup f"
531 by (simp add: Liminf_const)
535 unfolding liminf_SUPR_INFI limsup_INFI_SUPR
536 apply (subst INFI_ereal_cminus)
538 apply (subst SUPR_ereal_cminus)
541 qed (insert `c \<noteq> -\<infinity>`, simp)
544 subsubsection {* Continuity *}
546 lemma continuous_at_of_ereal:
548 assumes "\<bar>x0\<bar> \<noteq> \<infinity>"
549 shows "continuous (at x0) real"
553 assume T: "open T" "real x0 \<in> T"
554 def S \<equiv> "ereal ` T"
555 then have "ereal (real x0) \<in> S"
557 then have "x0 \<in> S"
558 using assms ereal_real by auto
559 moreover have "open S"
560 using open_ereal S_def T by auto
561 moreover have "\<forall>y\<in>S. real y \<in> T"
562 using S_def T by auto
563 ultimately have "\<exists>S. x0 \<in> S \<and> open S \<and> (\<forall>y\<in>S. real y \<in> T)"
567 unfolding continuous_at_open by blast
570 lemma continuous_at_iff_ereal:
571 fixes f :: "'a::t2_space \<Rightarrow> real"
572 shows "continuous (at x0) f \<longleftrightarrow> continuous (at x0) (ereal \<circ> f)"
575 assume "continuous (at x0) f"
576 then have "continuous (at x0) (ereal \<circ> f)"
577 using continuous_at_ereal continuous_at_compose[of x0 f ereal]
582 assume "continuous (at x0) (ereal \<circ> f)"
583 then have "continuous (at x0) (real \<circ> (ereal \<circ> f))"
584 using continuous_at_of_ereal
585 by (intro continuous_at_compose[of x0 "ereal \<circ> f"]) auto
586 moreover have "real \<circ> (ereal \<circ> f) = f"
587 using real_ereal_id by (simp add: o_assoc)
588 ultimately have "continuous (at x0) f"
591 ultimately show ?thesis
596 lemma continuous_on_iff_ereal:
597 fixes f :: "'a::t2_space => real"
599 shows "continuous_on A f \<longleftrightarrow> continuous_on A (ereal \<circ> f)"
600 using continuous_at_iff_ereal assms
601 by (auto simp add: continuous_on_eq_continuous_at cong del: continuous_on_cong)
603 lemma continuous_on_real: "continuous_on (UNIV - {\<infinity>, -\<infinity>::ereal}) real"
604 using continuous_at_of_ereal continuous_on_eq_continuous_at open_image_ereal
607 lemma continuous_on_iff_real:
608 fixes f :: "'a::t2_space \<Rightarrow> ereal"
609 assumes "\<And>x. x \<in> A \<Longrightarrow> \<bar>f x\<bar> \<noteq> \<infinity>"
610 shows "continuous_on A f \<longleftrightarrow> continuous_on A (real \<circ> f)"
612 have "f ` A \<subseteq> UNIV - {\<infinity>, -\<infinity>}"
614 then have *: "continuous_on (f ` A) real"
615 using continuous_on_real by (simp add: continuous_on_subset)
616 have **: "continuous_on ((real \<circ> f) ` A) ereal"
617 using continuous_on_ereal continuous_on_subset[of "UNIV" "ereal" "(real \<circ> f) ` A"]
620 assume "continuous_on A f"
621 then have "continuous_on A (real \<circ> f)"
622 apply (subst continuous_on_compose)
629 assume "continuous_on A (real \<circ> f)"
630 then have "continuous_on A (ereal \<circ> (real \<circ> f))"
631 apply (subst continuous_on_compose)
635 then have "continuous_on A f"
636 apply (subst continuous_on_eq[of A "ereal \<circ> (real \<circ> f)" f])
637 using assms ereal_real
641 ultimately show ?thesis
645 lemma continuous_at_const:
646 fixes f :: "'a::t2_space \<Rightarrow> ereal"
647 assumes "\<forall>x. f x = C"
648 shows "\<forall>x. continuous (at x) f"
649 unfolding continuous_at_open
653 lemma mono_closed_real:
654 fixes S :: "real set"
655 assumes mono: "\<forall>y z. y \<in> S \<and> y \<le> z \<longrightarrow> z \<in> S"
657 shows "S = {} \<or> S = UNIV \<or> (\<exists>a. S = {a..})"
660 assume "S \<noteq> {}"
661 { assume ex: "\<exists>B. \<forall>x\<in>S. B \<le> x"
662 then have *: "\<forall>x\<in>S. Inf S \<le> x"
663 using cInf_lower[of _ S] ex by (metis bdd_below_def)
664 then have "Inf S \<in> S"
665 apply (subst closed_contains_Inf)
666 using ex `S \<noteq> {}` `closed S`
669 then have "\<forall>x. Inf S \<le> x \<longleftrightarrow> x \<in> S"
670 using mono[rule_format, of "Inf S"] *
672 then have "S = {Inf S ..}"
674 then have "\<exists>a. S = {a ..}"
679 assume "\<not> (\<exists>B. \<forall>x\<in>S. B \<le> x)"
680 then have nex: "\<forall>B. \<exists>x\<in>S. x < B"
681 by (simp add: not_le)
684 obtain x where "x\<in>S" and "x < y"
686 then have "y \<in> S"
687 using mono[rule_format, of x y] by auto
692 ultimately have "S = UNIV \<or> (\<exists>a. S = {a ..})"
699 lemma mono_closed_ereal:
700 fixes S :: "real set"
701 assumes mono: "\<forall>y z. y \<in> S \<and> y \<le> z \<longrightarrow> z \<in> S"
703 shows "\<exists>a. S = {x. a \<le> ereal x}"
708 apply (rule_tac x=PInfty in exI)
716 apply (rule_tac x="-\<infinity>" in exI)
722 assume "\<exists>a. S = {a ..}"
723 then obtain a where "S = {a ..}"
726 apply (rule_tac x="ereal a" in exI)
730 ultimately show ?thesis
731 using mono_closed_real[of S] assms by auto
735 subsection {* Sums *}
737 lemma setsum_ereal[simp]: "(\<Sum>x\<in>A. ereal (f x)) = ereal (\<Sum>x\<in>A. f x)"
738 proof (cases "finite A")
740 then show ?thesis by induct auto
743 then show ?thesis by simp
747 fixes f :: "'a \<Rightarrow> ereal"
748 shows "(\<Sum>x\<in>P. f x) = \<infinity> \<longleftrightarrow> finite P \<and> (\<exists>i\<in>P. f i = \<infinity>)"
750 assume *: "setsum f P = \<infinity>"
757 show "\<exists>i\<in>P. f i = \<infinity>"
759 assume "\<not> ?thesis"
760 then have "\<And>i. i \<in> P \<Longrightarrow> f i \<noteq> \<infinity>"
762 with `finite P` have "setsum f P \<noteq> \<infinity>"
769 assume "finite P" and "i \<in> P" and "f i = \<infinity>"
770 then show "setsum f P = \<infinity>"
773 show ?case using insert by (cases "x = i") auto
778 fixes f :: "'a \<Rightarrow> ereal"
779 shows "\<bar>setsum f A\<bar> = \<infinity> \<longleftrightarrow> finite A \<and> (\<exists>i\<in>A. \<bar>f i\<bar> = \<infinity>)"
781 assume *: "\<bar>setsum f A\<bar> = \<infinity>"
783 by (rule ccontr) (insert *, auto)
784 moreover have "\<exists>i\<in>A. \<bar>f i\<bar> = \<infinity>"
786 assume "\<not> ?thesis"
787 then have "\<forall>i\<in>A. \<exists>r. f i = ereal r"
789 from bchoice[OF this] obtain r where "\<forall>x\<in>A. f x = ereal (r x)" ..
793 ultimately show "finite A \<and> (\<exists>i\<in>A. \<bar>f i\<bar> = \<infinity>)"
796 assume "finite A \<and> (\<exists>i\<in>A. \<bar>f i\<bar> = \<infinity>)"
797 then obtain i where "finite A" "i \<in> A" and "\<bar>f i\<bar> = \<infinity>"
799 then show "\<bar>setsum f A\<bar> = \<infinity>"
803 by (cases rule: ereal3_cases[of "f i" "f j" "setsum f A"]) auto
807 lemma setsum_real_of_ereal:
808 fixes f :: "'i \<Rightarrow> ereal"
809 assumes "\<And>x. x \<in> S \<Longrightarrow> \<bar>f x\<bar> \<noteq> \<infinity>"
810 shows "(\<Sum>x\<in>S. real (f x)) = real (setsum f S)"
812 have "\<forall>x\<in>S. \<exists>r. f x = ereal r"
816 from assms[OF this] show "\<exists>r. f x = ereal r"
817 by (cases "f x") auto
819 from bchoice[OF this] obtain r where "\<forall>x\<in>S. f x = ereal (r x)" ..
824 lemma setsum_ereal_0:
825 fixes f :: "'a \<Rightarrow> ereal"
827 and "\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i"
828 shows "(\<Sum>x\<in>A. f x) = 0 \<longleftrightarrow> (\<forall>i\<in>A. f i = 0)"
830 assume *: "(\<Sum>x\<in>A. f x) = 0"
831 then have "(\<Sum>x\<in>A. f x) \<noteq> \<infinity>"
833 then have "\<forall>i\<in>A. \<bar>f i\<bar> \<noteq> \<infinity>"
834 using assms by (force simp: setsum_Pinfty)
835 then have "\<forall>i\<in>A. \<exists>r. f i = ereal r"
837 from bchoice[OF this] * assms show "\<forall>i\<in>A. f i = 0"
838 using setsum_nonneg_eq_0_iff[of A "\<lambda>i. real (f i)"] by auto
841 lemma setsum_ereal_right_distrib:
842 fixes f :: "'a \<Rightarrow> ereal"
843 assumes "\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i"
844 shows "r * setsum f A = (\<Sum>n\<in>A. r * f n)"
847 then show ?thesis using assms
848 by induct (auto simp: ereal_right_distrib setsum_nonneg)
851 lemma sums_ereal_positive:
852 fixes f :: "nat \<Rightarrow> ereal"
853 assumes "\<And>i. 0 \<le> f i"
854 shows "f sums (SUP n. \<Sum>i<n. f i)"
856 have "incseq (\<lambda>i. \<Sum>j=0..<i. f j)"
857 using ereal_add_mono[OF _ assms]
858 by (auto intro!: incseq_SucI)
859 from LIMSEQ_SUP[OF this]
860 show ?thesis unfolding sums_def
861 by (simp add: atLeast0LessThan)
864 lemma summable_ereal_pos:
865 fixes f :: "nat \<Rightarrow> ereal"
866 assumes "\<And>i. 0 \<le> f i"
868 using sums_ereal_positive[of f, OF assms]
869 unfolding summable_def
872 lemma suminf_ereal_eq_SUPR:
873 fixes f :: "nat \<Rightarrow> ereal"
874 assumes "\<And>i. 0 \<le> f i"
875 shows "(\<Sum>x. f x) = (SUP n. \<Sum>i<n. f i)"
876 using sums_ereal_positive[of f, OF assms, THEN sums_unique]
879 lemma sums_ereal: "(\<lambda>x. ereal (f x)) sums ereal x \<longleftrightarrow> f sums x"
880 unfolding sums_def by simp
883 fixes f :: "nat \<Rightarrow> ereal"
884 assumes "\<forall>N. (\<Sum>n<N. f n) \<le> x"
885 and pos: "\<And>n. 0 \<le> f n"
886 shows "suminf f \<le> x"
887 proof (rule Lim_bounded_ereal)
888 have "summable f" using pos[THEN summable_ereal_pos] .
889 then show "(\<lambda>N. \<Sum>n<N. f n) ----> suminf f"
890 by (auto dest!: summable_sums simp: sums_def atLeast0LessThan)
891 show "\<forall>n\<ge>0. setsum f {..<n} \<le> x"
895 lemma suminf_bound_add:
896 fixes f :: "nat \<Rightarrow> ereal"
897 assumes "\<forall>N. (\<Sum>n<N. f n) + y \<le> x"
898 and pos: "\<And>n. 0 \<le> f n"
899 and "y \<noteq> -\<infinity>"
900 shows "suminf f + y \<le> x"
903 then have "\<forall>N. (\<Sum>n<N. f n) \<le> x - y"
904 using assms by (simp add: ereal_le_minus)
905 then have "(\<Sum> n. f n) \<le> x - y"
906 using pos by (rule suminf_bound)
907 then show "(\<Sum> n. f n) + y \<le> x"
908 using assms real by (simp add: ereal_le_minus)
909 qed (insert assms, auto)
912 fixes f :: "nat \<Rightarrow> ereal"
913 assumes "\<And>n. 0 \<le> f n"
914 shows "(\<Sum>n<N. f n) \<le> (\<Sum>n. f n)"
915 unfolding suminf_ereal_eq_SUPR[OF assms] SUP_def
916 by (auto intro: complete_lattice_class.Sup_upper)
919 fixes f :: "nat \<Rightarrow> ereal"
920 assumes "\<And>n. 0 \<le> f n"
921 shows "0 \<le> (\<Sum>n. f n)"
922 using suminf_upper[of f 0, OF assms]
926 fixes f g :: "nat \<Rightarrow> ereal"
927 assumes "\<And>N. f N \<le> g N"
928 and "\<And>N. 0 \<le> f N"
929 shows "suminf f \<le> suminf g"
930 proof (safe intro!: suminf_bound)
935 using assms(2,1)[of N] by auto
937 have "setsum f {..<n} \<le> setsum g {..<n}"
938 using assms by (auto intro: setsum_mono)
939 also have "\<dots> \<le> suminf g"
940 using `\<And>N. 0 \<le> g N`
941 by (rule suminf_upper)
942 finally show "setsum f {..<n} \<le> suminf g" .
945 lemma suminf_half_series_ereal: "(\<Sum>n. (1/2 :: ereal) ^ Suc n) = 1"
946 using sums_ereal[THEN iffD2, OF power_half_series, THEN sums_unique, symmetric]
947 by (simp add: one_ereal_def)
949 lemma suminf_add_ereal:
950 fixes f g :: "nat \<Rightarrow> ereal"
951 assumes "\<And>i. 0 \<le> f i"
952 and "\<And>i. 0 \<le> g i"
953 shows "(\<Sum>i. f i + g i) = suminf f + suminf g"
954 apply (subst (1 2 3) suminf_ereal_eq_SUPR)
955 unfolding setsum_addf
956 apply (intro assms ereal_add_nonneg_nonneg SUPR_ereal_add_pos incseq_setsumI setsum_nonneg ballI)+
959 lemma suminf_cmult_ereal:
960 fixes f g :: "nat \<Rightarrow> ereal"
961 assumes "\<And>i. 0 \<le> f i"
963 shows "(\<Sum>i. a * f i) = a * suminf f"
964 by (auto simp: setsum_ereal_right_distrib[symmetric] assms
965 ereal_zero_le_0_iff setsum_nonneg suminf_ereal_eq_SUPR
966 intro!: SUPR_ereal_cmult )
969 fixes f :: "nat \<Rightarrow> ereal"
970 assumes "\<And>i. 0 \<le> f i"
971 and "suminf f \<noteq> \<infinity>"
972 shows "f i \<noteq> \<infinity>"
974 from suminf_upper[of f "Suc i", OF assms(1)] assms(2)
975 have "(\<Sum>i<Suc i. f i) \<noteq> \<infinity>"
978 unfolding setsum_Pinfty by simp
981 lemma suminf_PInfty_fun:
982 assumes "\<And>i. 0 \<le> f i"
983 and "suminf f \<noteq> \<infinity>"
984 shows "\<exists>f'. f = (\<lambda>x. ereal (f' x))"
986 have "\<forall>i. \<exists>r. f i = ereal r"
989 show "\<exists>r. f i = ereal r"
990 using suminf_PInfty[OF assms] assms(1)[of i]
991 by (cases "f i") auto
993 from choice[OF this] show ?thesis
997 lemma summable_ereal:
998 assumes "\<And>i. 0 \<le> f i"
999 and "(\<Sum>i. ereal (f i)) \<noteq> \<infinity>"
1002 have "0 \<le> (\<Sum>i. ereal (f i))"
1003 using assms by (intro suminf_0_le) auto
1004 with assms obtain r where r: "(\<Sum>i. ereal (f i)) = ereal r"
1005 by (cases "\<Sum>i. ereal (f i)") auto
1006 from summable_ereal_pos[of "\<lambda>x. ereal (f x)"]
1007 have "summable (\<lambda>x. ereal (f x))"
1009 from summable_sums[OF this]
1010 have "(\<lambda>x. ereal (f x)) sums (\<Sum>x. ereal (f x))"
1012 then show "summable f"
1013 unfolding r sums_ereal summable_def ..
1017 assumes "\<And>i. 0 \<le> f i"
1018 and "(\<Sum>i. ereal (f i)) \<noteq> \<infinity>"
1019 shows "(\<Sum>i. ereal (f i)) = ereal (suminf f)"
1020 proof (rule sums_unique[symmetric])
1021 from summable_ereal[OF assms]
1022 show "(\<lambda>x. ereal (f x)) sums (ereal (suminf f))"
1023 unfolding sums_ereal
1025 by (intro summable_sums summable_ereal)
1028 lemma suminf_ereal_minus:
1029 fixes f g :: "nat \<Rightarrow> ereal"
1030 assumes ord: "\<And>i. g i \<le> f i" "\<And>i. 0 \<le> g i"
1031 and fin: "suminf f \<noteq> \<infinity>" "suminf g \<noteq> \<infinity>"
1032 shows "(\<Sum>i. f i - g i) = suminf f - suminf g"
1037 using ord[of i] by auto
1040 from suminf_PInfty_fun[OF `\<And>i. 0 \<le> f i` fin(1)] obtain f' where [simp]: "f = (\<lambda>x. ereal (f' x))" ..
1041 from suminf_PInfty_fun[OF `\<And>i. 0 \<le> g i` fin(2)] obtain g' where [simp]: "g = (\<lambda>x. ereal (g' x))" ..
1044 have "0 \<le> f i - g i"
1045 using ord[of i] by (auto simp: ereal_le_minus_iff)
1048 have "suminf (\<lambda>i. f i - g i) \<le> suminf f"
1049 using assms by (auto intro!: suminf_le_pos simp: field_simps)
1050 then have "suminf (\<lambda>i. f i - g i) \<noteq> \<infinity>"
1052 ultimately show ?thesis
1053 using assms `\<And>i. 0 \<le> f i`
1055 apply (subst (1 2 3) suminf_ereal)
1056 apply (auto intro!: suminf_diff[symmetric] summable_ereal)
1060 lemma suminf_ereal_PInf [simp]: "(\<Sum>x. \<infinity>::ereal) = \<infinity>"
1062 have "(\<Sum>i<Suc 0. \<infinity>) \<le> (\<Sum>x. \<infinity>::ereal)"
1063 by (rule suminf_upper) auto
1068 lemma summable_real_of_ereal:
1069 fixes f :: "nat \<Rightarrow> ereal"
1070 assumes f: "\<And>i. 0 \<le> f i"
1071 and fin: "(\<Sum>i. f i) \<noteq> \<infinity>"
1072 shows "summable (\<lambda>i. real (f i))"
1073 proof (rule summable_def[THEN iffD2])
1074 have "0 \<le> (\<Sum>i. f i)"
1075 using assms by (auto intro: suminf_0_le)
1076 with fin obtain r where r: "ereal r = (\<Sum>i. f i)"
1077 by (cases "(\<Sum>i. f i)") auto
1080 have "f i \<noteq> \<infinity>"
1081 using f by (intro suminf_PInfty[OF _ fin]) auto
1082 then have "\<bar>f i\<bar> \<noteq> \<infinity>"
1083 using f[of i] by auto
1086 have "(\<lambda>i. ereal (real (f i))) sums (\<Sum>i. ereal (real (f i)))"
1088 by (auto intro!: summable_ereal_pos summable_sums simp: ereal_le_real_iff zero_ereal_def)
1089 also have "\<dots> = ereal r"
1090 using fin r by (auto simp: ereal_real)
1091 finally show "\<exists>r. (\<lambda>i. real (f i)) sums r"
1092 by (auto simp: sums_ereal)
1095 lemma suminf_SUP_eq:
1096 fixes f :: "nat \<Rightarrow> nat \<Rightarrow> ereal"
1097 assumes "\<And>i. incseq (\<lambda>n. f n i)"
1098 and "\<And>n i. 0 \<le> f n i"
1099 shows "(\<Sum>i. SUP n. f n i) = (SUP n. \<Sum>i. f n i)"
1103 have "(\<Sum>i<n. SUP k. f k i) = (SUP k. \<Sum>i<n. f k i)"
1105 by (auto intro!: SUPR_ereal_setsum[symmetric])
1110 apply (subst (1 2) suminf_ereal_eq_SUPR)
1112 apply (auto intro!: SUP_upper2)
1113 apply (subst SUP_commute)
1118 lemma suminf_setsum_ereal:
1119 fixes f :: "_ \<Rightarrow> _ \<Rightarrow> ereal"
1120 assumes nonneg: "\<And>i a. a \<in> A \<Longrightarrow> 0 \<le> f i a"
1121 shows "(\<Sum>i. \<Sum>a\<in>A. f i a) = (\<Sum>a\<in>A. \<Sum>i. f i a)"
1122 proof (cases "finite A")
1126 by induct (simp_all add: suminf_add_ereal setsum_nonneg)
1129 then show ?thesis by simp
1132 lemma suminf_ereal_eq_0:
1133 fixes f :: "nat \<Rightarrow> ereal"
1134 assumes nneg: "\<And>i. 0 \<le> f i"
1135 shows "(\<Sum>i. f i) = 0 \<longleftrightarrow> (\<forall>i. f i = 0)"
1137 assume "(\<Sum>i. f i) = 0"
1140 assume "f i \<noteq> 0"
1141 with nneg have "0 < f i"
1142 by (auto simp: less_le)
1143 also have "f i = (\<Sum>j. if j = i then f i else 0)"
1144 by (subst suminf_finite[where N="{i}"]) auto
1145 also have "\<dots> \<le> (\<Sum>i. f i)"
1147 by (auto intro!: suminf_le_pos)
1149 using `(\<Sum>i. f i) = 0` by auto
1151 then show "\<forall>i. f i = 0"
1155 lemma Liminf_within:
1156 fixes f :: "'a::metric_space \<Rightarrow> 'b::complete_lattice"
1157 shows "Liminf (at x within S) f = (SUP e:{0<..}. INF y:(S \<inter> ball x e - {x}). f y)"
1158 unfolding Liminf_def eventually_at
1159 proof (rule SUPR_eq, simp_all add: Ball_def Bex_def, safe)
1161 assume "0 < d" and "\<forall>y. y \<in> S \<longrightarrow> y \<noteq> x \<and> dist y x < d \<longrightarrow> P y"
1162 then have "S \<inter> ball x d - {x} \<subseteq> {x. P x}"
1163 by (auto simp: zero_less_dist_iff dist_commute)
1164 then show "\<exists>r>0. INFI (Collect P) f \<le> INFI (S \<inter> ball x r - {x}) f"
1165 by (intro exI[of _ d] INF_mono conjI `0 < d`) auto
1169 then show "\<exists>P. (\<exists>d>0. \<forall>xa. xa \<in> S \<longrightarrow> xa \<noteq> x \<and> dist xa x < d \<longrightarrow> P xa) \<and>
1170 INFI (S \<inter> ball x d - {x}) f \<le> INFI (Collect P) f"
1171 by (intro exI[of _ "\<lambda>y. y \<in> S \<inter> ball x d - {x}"])
1172 (auto intro!: INF_mono exI[of _ d] simp: dist_commute)
1175 lemma Limsup_within:
1176 fixes f :: "'a::metric_space \<Rightarrow> 'b::complete_lattice"
1177 shows "Limsup (at x within S) f = (INF e:{0<..}. SUP y:(S \<inter> ball x e - {x}). f y)"
1178 unfolding Limsup_def eventually_at
1179 proof (rule INFI_eq, simp_all add: Ball_def Bex_def, safe)
1181 assume "0 < d" and "\<forall>y. y \<in> S \<longrightarrow> y \<noteq> x \<and> dist y x < d \<longrightarrow> P y"
1182 then have "S \<inter> ball x d - {x} \<subseteq> {x. P x}"
1183 by (auto simp: zero_less_dist_iff dist_commute)
1184 then show "\<exists>r>0. SUPR (S \<inter> ball x r - {x}) f \<le> SUPR (Collect P) f"
1185 by (intro exI[of _ d] SUP_mono conjI `0 < d`) auto
1189 then show "\<exists>P. (\<exists>d>0. \<forall>xa. xa \<in> S \<longrightarrow> xa \<noteq> x \<and> dist xa x < d \<longrightarrow> P xa) \<and>
1190 SUPR (Collect P) f \<le> SUPR (S \<inter> ball x d - {x}) f"
1191 by (intro exI[of _ "\<lambda>y. y \<in> S \<inter> ball x d - {x}"])
1192 (auto intro!: SUP_mono exI[of _ d] simp: dist_commute)
1196 fixes f :: "'a::metric_space \<Rightarrow> 'b::complete_lattice"
1197 shows "Liminf (at x) f = (SUP e:{0<..}. INF y:(ball x e - {x}). f y)"
1198 using Liminf_within[of x UNIV f] by simp
1201 fixes f :: "'a::metric_space \<Rightarrow> 'b::complete_lattice"
1202 shows "Limsup (at x) f = (INF e:{0<..}. SUP y:(ball x e - {x}). f y)"
1203 using Limsup_within[of x UNIV f] by simp
1205 lemma min_Liminf_at:
1206 fixes f :: "'a::metric_space \<Rightarrow> 'b::complete_linorder"
1207 shows "min (f x) (Liminf (at x) f) = (SUP e:{0<..}. INF y:ball x e. f y)"
1208 unfolding inf_min[symmetric] Liminf_at
1209 apply (subst inf_commute)
1210 apply (subst SUP_inf)
1211 apply (intro SUP_cong[OF refl])
1212 apply (cut_tac A="ball x xa - {x}" and B="{x}" and M=f in INF_union)
1213 apply (simp add: INF_def del: inf_ereal_def)
1217 subsection {* monoset *}
1219 definition (in order) mono_set:
1220 "mono_set S \<longleftrightarrow> (\<forall>x y. x \<le> y \<longrightarrow> x \<in> S \<longrightarrow> y \<in> S)"
1222 lemma (in order) mono_greaterThan [intro, simp]: "mono_set {B<..}" unfolding mono_set by auto
1223 lemma (in order) mono_atLeast [intro, simp]: "mono_set {B..}" unfolding mono_set by auto
1224 lemma (in order) mono_UNIV [intro, simp]: "mono_set UNIV" unfolding mono_set by auto
1225 lemma (in order) mono_empty [intro, simp]: "mono_set {}" unfolding mono_set by auto
1227 lemma (in complete_linorder) mono_set_iff:
1229 defines "a \<equiv> Inf S"
1230 shows "mono_set S \<longleftrightarrow> S = {a <..} \<or> S = {a..}" (is "_ = ?c")
1233 then have mono: "\<And>x y. x \<le> y \<Longrightarrow> x \<in> S \<Longrightarrow> y \<in> S"
1234 by (auto simp: mono_set)
1239 using mono[OF _ `a \<in> S`]
1240 by (auto intro: Inf_lower simp: a_def)
1242 assume "a \<notin> S"
1245 fix x assume "x \<in> S"
1246 then have "a \<le> x"
1247 unfolding a_def by (rule Inf_lower)
1249 using `x \<in> S` `a \<notin> S` by (cases "a = x") auto
1251 fix x assume "a < x"
1252 then obtain y where "y < x" "y \<in> S"
1253 unfolding a_def Inf_less_iff ..
1254 with mono[of y x] show "x \<in> S"
1261 lemma ereal_open_mono_set:
1262 fixes S :: "ereal set"
1263 shows "open S \<and> mono_set S \<longleftrightarrow> S = UNIV \<or> S = {Inf S <..}"
1264 by (metis Inf_UNIV atLeast_eq_UNIV_iff ereal_open_atLeast
1265 ereal_open_closed mono_set_iff open_ereal_greaterThan)
1267 lemma ereal_closed_mono_set:
1268 fixes S :: "ereal set"
1269 shows "closed S \<and> mono_set S \<longleftrightarrow> S = {} \<or> S = {Inf S ..}"
1270 by (metis Inf_UNIV atLeast_eq_UNIV_iff closed_ereal_atLeast
1271 ereal_open_closed mono_empty mono_set_iff open_ereal_greaterThan)
1273 lemma ereal_Liminf_Sup_monoset:
1274 fixes f :: "'a \<Rightarrow> ereal"
1275 shows "Liminf net f =
1276 Sup {l. \<forall>S. open S \<longrightarrow> mono_set S \<longrightarrow> l \<in> S \<longrightarrow> eventually (\<lambda>x. f x \<in> S) net}"
1278 proof (safe intro!: Liminf_eqI complete_lattice_class.Sup_upper complete_lattice_class.Sup_least)
1280 assume P: "eventually P net"
1282 assume S: "mono_set S" "INFI (Collect P) f \<in> S"
1286 then have "INFI (Collect P) f \<le> f x"
1287 by (intro complete_lattice_class.INF_lower) simp
1288 with S have "f x \<in> S"
1289 by (simp add: mono_set)
1291 with P show "eventually (\<lambda>x. f x \<in> S) net"
1292 by (auto elim: eventually_elim1)
1295 assume S: "\<forall>S. open S \<longrightarrow> mono_set S \<longrightarrow> l \<in> S \<longrightarrow> eventually (\<lambda>x. f x \<in> S) net"
1296 assume P: "\<forall>P. eventually P net \<longrightarrow> INFI (Collect P) f \<le> y"
1298 proof (rule dense_le)
1301 then have "eventually (\<lambda>x. f x \<in> {B <..}) net"
1302 by (intro S[rule_format]) auto
1303 then have "INFI {x. B < f x} f \<le> y"
1305 moreover have "B \<le> INFI {x. B < f x} f"
1306 by (intro INF_greatest) auto
1307 ultimately show "B \<le> y"
1312 lemma ereal_Limsup_Inf_monoset:
1313 fixes f :: "'a \<Rightarrow> ereal"
1314 shows "Limsup net f =
1315 Inf {l. \<forall>S. open S \<longrightarrow> mono_set (uminus ` S) \<longrightarrow> l \<in> S \<longrightarrow> eventually (\<lambda>x. f x \<in> S) net}"
1317 proof (safe intro!: Limsup_eqI complete_lattice_class.Inf_lower complete_lattice_class.Inf_greatest)
1319 assume P: "eventually P net"
1321 assume S: "mono_set (uminus`S)" "SUPR (Collect P) f \<in> S"
1325 then have "f x \<le> SUPR (Collect P) f"
1326 by (intro complete_lattice_class.SUP_upper) simp
1327 with S(1)[unfolded mono_set, rule_format, of "- SUPR (Collect P) f" "- f x"] S(2)
1329 by (simp add: inj_image_mem_iff) }
1330 with P show "eventually (\<lambda>x. f x \<in> S) net"
1331 by (auto elim: eventually_elim1)
1334 assume S: "\<forall>S. open S \<longrightarrow> mono_set (uminus ` S) \<longrightarrow> l \<in> S \<longrightarrow> eventually (\<lambda>x. f x \<in> S) net"
1335 assume P: "\<forall>P. eventually P net \<longrightarrow> y \<le> SUPR (Collect P) f"
1337 proof (rule dense_ge)
1340 then have "eventually (\<lambda>x. f x \<in> {..< B}) net"
1341 by (intro S[rule_format]) auto
1342 then have "y \<le> SUPR {x. f x < B} f"
1344 moreover have "SUPR {x. f x < B} f \<le> B"
1345 by (intro SUP_least) auto
1346 ultimately show "y \<le> B"
1351 lemma liminf_bounded_open:
1352 fixes x :: "nat \<Rightarrow> ereal"
1353 shows "x0 \<le> liminf x \<longleftrightarrow> (\<forall>S. open S \<longrightarrow> mono_set S \<longrightarrow> x0 \<in> S \<longrightarrow> (\<exists>N. \<forall>n\<ge>N. x n \<in> S))"
1354 (is "_ \<longleftrightarrow> ?P x0")
1357 then show "x0 \<le> liminf x"
1358 unfolding ereal_Liminf_Sup_monoset eventually_sequentially
1359 by (intro complete_lattice_class.Sup_upper) auto
1361 assume "x0 \<le> liminf x"
1363 fix S :: "ereal set"
1364 assume om: "open S" "mono_set S" "x0 \<in> S"
1367 then have "\<exists>N. \<forall>n\<ge>N. x n \<in> S"
1372 assume "S \<noteq> UNIV"
1373 then obtain B where B: "S = {B<..}"
1374 using om ereal_open_mono_set by auto
1377 then have "\<exists>N. \<forall>n\<ge>N. x n \<in> S"
1379 using `x0 \<le> liminf x` liminf_bounded_iff
1382 ultimately have "\<exists>N. \<forall>n\<ge>N. x n \<in> S"