6 |
6 |
7 theory Extended_Nonnegative_Real |
7 theory Extended_Nonnegative_Real |
8 imports Extended_Real Indicator_Function |
8 imports Extended_Real Indicator_Function |
9 begin |
9 begin |
10 |
10 |
|
11 lemma ereal_ineq_diff_add: |
|
12 assumes "b \<noteq> (-\<infinity>::ereal)" "a \<ge> b" |
|
13 shows "a = b + (a-b)" |
|
14 by (metis add.commute assms(1) assms(2) ereal_eq_minus_iff ereal_minus_le_iff ereal_plus_eq_PInfty) |
|
15 |
|
16 lemma Limsup_const_add: |
|
17 fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}" |
|
18 shows "F \<noteq> bot \<Longrightarrow> Limsup F (\<lambda>x. c + f x) = c + Limsup F f" |
|
19 by (rule Limsup_compose_continuous_mono) |
|
20 (auto intro!: monoI add_mono continuous_on_add continuous_on_id continuous_on_const) |
|
21 |
|
22 lemma Liminf_const_add: |
|
23 fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}" |
|
24 shows "F \<noteq> bot \<Longrightarrow> Liminf F (\<lambda>x. c + f x) = c + Liminf F f" |
|
25 by (rule Liminf_compose_continuous_mono) |
|
26 (auto intro!: monoI add_mono continuous_on_add continuous_on_id continuous_on_const) |
|
27 |
|
28 lemma Liminf_add_const: |
|
29 fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}" |
|
30 shows "F \<noteq> bot \<Longrightarrow> Liminf F (\<lambda>x. f x + c) = Liminf F f + c" |
|
31 by (rule Liminf_compose_continuous_mono) |
|
32 (auto intro!: monoI add_mono continuous_on_add continuous_on_id continuous_on_const) |
|
33 |
|
34 lemma sums_offset: |
|
35 fixes f g :: "nat \<Rightarrow> 'a :: {t2_space, topological_comm_monoid_add}" |
|
36 assumes "(\<lambda>n. f (n + i)) sums l" shows "f sums (l + (\<Sum>j<i. f j))" |
|
37 proof - |
|
38 have "(\<lambda>k. (\<Sum>n<k. f (n + i)) + (\<Sum>j<i. f j)) \<longlonglongrightarrow> l + (\<Sum>j<i. f j)" |
|
39 using assms by (auto intro!: tendsto_add simp: sums_def) |
|
40 moreover |
|
41 { fix k :: nat |
|
42 have "(\<Sum>j<k + i. f j) = (\<Sum>j=i..<k + i. f j) + (\<Sum>j=0..<i. f j)" |
|
43 by (subst setsum.union_disjoint[symmetric]) (auto intro!: setsum.cong) |
|
44 also have "(\<Sum>j=i..<k + i. f j) = (\<Sum>j\<in>(\<lambda>n. n + i)`{0..<k}. f j)" |
|
45 unfolding image_add_atLeastLessThan by simp |
|
46 finally have "(\<Sum>j<k + i. f j) = (\<Sum>n<k. f (n + i)) + (\<Sum>j<i. f j)" |
|
47 by (auto simp: inj_on_def atLeast0LessThan setsum.reindex) } |
|
48 ultimately have "(\<lambda>k. (\<Sum>n<k + i. f n)) \<longlonglongrightarrow> l + (\<Sum>j<i. f j)" |
|
49 by simp |
|
50 then show ?thesis |
|
51 unfolding sums_def by (rule LIMSEQ_offset) |
|
52 qed |
|
53 |
|
54 lemma suminf_offset: |
|
55 fixes f g :: "nat \<Rightarrow> 'a :: {t2_space, topological_comm_monoid_add}" |
|
56 shows "summable (\<lambda>j. f (j + i)) \<Longrightarrow> suminf f = (\<Sum>j. f (j + i)) + (\<Sum>j<i. f j)" |
|
57 by (intro sums_unique[symmetric] sums_offset summable_sums) |
|
58 |
|
59 lemma eventually_at_left_1: "(\<And>z::real. 0 < z \<Longrightarrow> z < 1 \<Longrightarrow> P z) \<Longrightarrow> eventually P (at_left 1)" |
|
60 by (subst eventually_at_left[of 0]) (auto intro: exI[of _ 0]) |
|
61 |
|
62 lemma mult_eq_1: |
|
63 fixes a b :: "'a :: {ordered_semiring, comm_monoid_mult}" |
|
64 shows "0 \<le> a \<Longrightarrow> a \<le> 1 \<Longrightarrow> b \<le> 1 \<Longrightarrow> a * b = 1 \<longleftrightarrow> (a = 1 \<and> b = 1)" |
|
65 by (metis mult.left_neutral eq_iff mult.commute mult_right_mono) |
|
66 |
|
67 lemma ereal_add_diff_cancel: |
|
68 fixes a b :: ereal |
|
69 shows "\<bar>b\<bar> \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a" |
|
70 by (cases a b rule: ereal2_cases) auto |
|
71 |
|
72 lemma add_top: |
|
73 fixes x :: "'a::{order_top, ordered_comm_monoid_add}" |
|
74 shows "0 \<le> x \<Longrightarrow> x + top = top" |
|
75 by (intro top_le add_increasing order_refl) |
|
76 |
|
77 lemma top_add: |
|
78 fixes x :: "'a::{order_top, ordered_comm_monoid_add}" |
|
79 shows "0 \<le> x \<Longrightarrow> top + x = top" |
|
80 by (intro top_le add_increasing2 order_refl) |
|
81 |
|
82 lemma le_lfp: "mono f \<Longrightarrow> x \<le> lfp f \<Longrightarrow> f x \<le> lfp f" |
|
83 by (subst lfp_unfold) (auto dest: monoD) |
|
84 |
|
85 lemma lfp_transfer: |
|
86 assumes \<alpha>: "sup_continuous \<alpha>" and f: "sup_continuous f" and mg: "mono g" |
|
87 assumes bot: "\<alpha> bot \<le> lfp g" and eq: "\<And>x. x \<le> lfp f \<Longrightarrow> \<alpha> (f x) = g (\<alpha> x)" |
|
88 shows "\<alpha> (lfp f) = lfp g" |
|
89 proof (rule antisym) |
|
90 note mf = sup_continuous_mono[OF f] |
|
91 have f_le_lfp: "(f ^^ i) bot \<le> lfp f" for i |
|
92 by (induction i) (auto intro: le_lfp mf) |
|
93 |
|
94 have "\<alpha> ((f ^^ i) bot) \<le> lfp g" for i |
|
95 by (induction i) (auto simp: bot eq f_le_lfp intro!: le_lfp mg) |
|
96 then show "\<alpha> (lfp f) \<le> lfp g" |
|
97 unfolding sup_continuous_lfp[OF f] |
|
98 by (subst \<alpha>[THEN sup_continuousD]) |
|
99 (auto intro!: mono_funpow sup_continuous_mono[OF f] SUP_least) |
|
100 |
|
101 show "lfp g \<le> \<alpha> (lfp f)" |
|
102 by (rule lfp_lowerbound) (simp add: eq[symmetric] lfp_unfold[OF mf, symmetric]) |
|
103 qed |
|
104 |
|
105 lemma sup_continuous_applyD: "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x h)" |
|
106 using sup_continuous_apply[THEN sup_continuous_compose] . |
|
107 |
|
108 lemma sup_continuous_SUP[order_continuous_intros]: |
|
109 fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice" |
|
110 assumes M: "\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)" |
|
111 shows "sup_continuous (SUP i:I. M i)" |
|
112 unfolding sup_continuous_def by (auto simp add: sup_continuousD[OF M] intro: SUP_commute) |
|
113 |
|
114 lemma sup_continuous_apply_SUP[order_continuous_intros]: |
|
115 fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice" |
|
116 shows "(\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)) \<Longrightarrow> sup_continuous (\<lambda>x. SUP i:I. M i x)" |
|
117 unfolding SUP_apply[symmetric] by (rule sup_continuous_SUP) |
|
118 |
|
119 lemma sup_continuous_lfp'[order_continuous_intros]: |
|
120 assumes 1: "sup_continuous f" |
|
121 assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (f g)" |
|
122 shows "sup_continuous (lfp f)" |
|
123 proof - |
|
124 have "sup_continuous ((f ^^ i) bot)" for i |
|
125 proof (induction i) |
|
126 case (Suc i) then show ?case |
|
127 by (auto intro!: 2) |
|
128 qed (simp add: bot_fun_def sup_continuous_const) |
|
129 then show ?thesis |
|
130 unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros) |
|
131 qed |
|
132 |
|
133 lemma sup_continuous_lfp''[order_continuous_intros]: |
|
134 assumes 1: "\<And>s. sup_continuous (f s)" |
|
135 assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>s. f s (g s))" |
|
136 shows "sup_continuous (\<lambda>x. lfp (f x))" |
|
137 proof - |
|
138 have "sup_continuous (\<lambda>x. (f x ^^ i) bot)" for i |
|
139 proof (induction i) |
|
140 case (Suc i) then show ?case |
|
141 by (auto intro!: 2) |
|
142 qed (simp add: bot_fun_def sup_continuous_const) |
|
143 then show ?thesis |
|
144 unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros) |
|
145 qed |
|
146 |
|
147 lemma mono_INF_fun: |
|
148 "(\<And>x y. mono (F x y)) \<Longrightarrow> mono (\<lambda>z x. INF y : X x. F x y z :: 'a :: complete_lattice)" |
|
149 by (auto intro!: INF_mono[OF bexI] simp: le_fun_def mono_def) |
|
150 |
|
151 lemma continuous_on_max: |
|
152 fixes f g :: "'a::topological_space \<Rightarrow> 'b::linorder_topology" |
|
153 shows "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> continuous_on A (\<lambda>x. max (f x) (g x))" |
|
154 by (auto simp: continuous_on_def intro!: tendsto_max) |
|
155 |
|
156 lemma continuous_on_cmult_ereal: |
|
157 "\<bar>c::ereal\<bar> \<noteq> \<infinity> \<Longrightarrow> continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. c * f x)" |
|
158 using tendsto_cmult_ereal[of c f "f x" "at x within A" for x] |
|
159 by (auto simp: continuous_on_def simp del: tendsto_cmult_ereal) |
|
160 |
11 context linordered_nonzero_semiring |
161 context linordered_nonzero_semiring |
12 begin |
162 begin |
13 |
163 |
14 lemma of_nat_nonneg [simp]: "0 \<le> of_nat n" |
164 lemma of_nat_nonneg [simp]: "0 \<le> of_nat n" |
15 by (induct n) simp_all |
165 by (induct n) simp_all |
16 |
166 |
17 lemma of_nat_mono[simp]: "i \<le> j \<Longrightarrow> of_nat i \<le> of_nat j" |
167 lemma of_nat_mono[simp]: "i \<le> j \<Longrightarrow> of_nat i \<le> of_nat j" |
18 by (auto simp add: le_iff_add intro!: add_increasing2) |
168 by (auto simp add: le_iff_add intro!: add_increasing2) |
19 |
169 |
20 end |
170 end |
|
171 |
|
172 lemma real_of_nat_Sup: |
|
173 assumes "A \<noteq> {}" "bdd_above A" |
|
174 shows "of_nat (Sup A) = (SUP a:A. of_nat a :: real)" |
|
175 proof (intro antisym) |
|
176 show "(SUP a:A. of_nat a::real) \<le> of_nat (Sup A)" |
|
177 using assms by (intro cSUP_least of_nat_mono) (auto intro: cSup_upper) |
|
178 have "Sup A \<in> A" |
|
179 unfolding Sup_nat_def using assms by (intro Max_in) (auto simp: bdd_above_nat) |
|
180 then show "of_nat (Sup A) \<le> (SUP a:A. of_nat a::real)" |
|
181 by (intro cSUP_upper bdd_above_image_mono assms) (auto simp: mono_def) |
|
182 qed |
21 |
183 |
22 lemma of_nat_less[simp]: |
184 lemma of_nat_less[simp]: |
23 "i < j \<Longrightarrow> of_nat i < (of_nat j::'a::{linordered_nonzero_semiring, semiring_char_0})" |
185 "i < j \<Longrightarrow> of_nat i < (of_nat j::'a::{linordered_nonzero_semiring, semiring_char_0})" |
24 by (auto simp: less_le) |
186 by (auto simp: less_le) |
25 |
187 |
258 |
484 |
259 simproc_setup ennreal_less_cancel |
485 simproc_setup ennreal_less_cancel |
260 ("(l::ennreal) + m < n" | "(l::ennreal) < m + n") = |
486 ("(l::ennreal) + m < n" | "(l::ennreal) < m + n") = |
261 \<open>fn phi => fn ctxt => fn ct => Less_Ennreal_Cancel.proc ctxt (Thm.term_of ct)\<close> |
487 \<open>fn phi => fn ctxt => fn ct => Less_Ennreal_Cancel.proc ctxt (Thm.term_of ct)\<close> |
262 |
488 |
263 instantiation ennreal :: linear_continuum_topology |
489 |
264 begin |
490 subsection \<open>Order with top\<close> |
265 |
491 |
266 definition open_ennreal :: "ennreal set \<Rightarrow> bool" |
492 lemma ennreal_zero_less_top[simp]: "0 < (top::ennreal)" |
267 where "(open :: ennreal set \<Rightarrow> bool) = generate_topology (range lessThan \<union> range greaterThan)" |
493 by transfer (simp add: top_ereal_def) |
268 |
494 |
269 instance |
495 lemma ennreal_one_less_top[simp]: "1 < (top::ennreal)" |
270 proof |
496 by transfer (simp add: top_ereal_def) |
271 show "\<exists>a b::ennreal. a \<noteq> b" |
497 |
272 using zero_neq_one by (intro exI) |
498 lemma ennreal_zero_neq_top[simp]: "0 \<noteq> (top::ennreal)" |
273 show "\<And>x y::ennreal. x < y \<Longrightarrow> \<exists>z>x. z < y" |
499 by transfer (simp add: top_ereal_def) |
274 proof transfer |
500 |
275 fix x y :: ereal assume "0 \<le> x" "x < y" |
501 lemma ennreal_top_neq_zero[simp]: "(top::ennreal) \<noteq> 0" |
276 moreover from dense[OF this(2)] guess z .. |
502 by transfer (simp add: top_ereal_def) |
277 ultimately show "\<exists>z\<in>Collect (op \<le> 0). x < z \<and> z < y" |
503 |
278 by (intro bexI[of _ z]) auto |
504 lemma ennreal_top_neq_one[simp]: "top \<noteq> (1::ennreal)" |
|
505 by transfer (simp add: top_ereal_def one_ereal_def ereal_max[symmetric] del: ereal_max) |
|
506 |
|
507 lemma ennreal_one_neq_top[simp]: "1 \<noteq> (top::ennreal)" |
|
508 by transfer (simp add: top_ereal_def one_ereal_def ereal_max[symmetric] del: ereal_max) |
|
509 |
|
510 lemma ennreal_add_less_top[simp]: |
|
511 fixes a b :: ennreal |
|
512 shows "a + b < top \<longleftrightarrow> a < top \<and> b < top" |
|
513 by transfer (auto simp: top_ereal_def) |
|
514 |
|
515 lemma ennreal_add_eq_top[simp]: |
|
516 fixes a b :: ennreal |
|
517 shows "a + b = top \<longleftrightarrow> a = top \<or> b = top" |
|
518 by transfer (auto simp: top_ereal_def) |
|
519 |
|
520 lemma ennreal_setsum_less_top[simp]: |
|
521 fixes f :: "'a \<Rightarrow> ennreal" |
|
522 shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) < top \<longleftrightarrow> (\<forall>i\<in>I. f i < top)" |
|
523 by (induction I rule: finite_induct) auto |
|
524 |
|
525 lemma ennreal_setsum_eq_top[simp]: |
|
526 fixes f :: "'a \<Rightarrow> ennreal" |
|
527 shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) = top \<longleftrightarrow> (\<exists>i\<in>I. f i = top)" |
|
528 by (induction I rule: finite_induct) auto |
|
529 |
|
530 lemma ennreal_mult_eq_top_iff: |
|
531 fixes a b :: ennreal |
|
532 shows "a * b = top \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)" |
|
533 by transfer (auto simp: top_ereal_def) |
|
534 |
|
535 lemma ennreal_top_eq_mult_iff: |
|
536 fixes a b :: ennreal |
|
537 shows "top = a * b \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)" |
|
538 using ennreal_mult_eq_top_iff[of a b] by auto |
|
539 |
|
540 lemma ennreal_mult_less_top: |
|
541 fixes a b :: ennreal |
|
542 shows "a * b < top \<longleftrightarrow> (a = 0 \<or> b = 0 \<or> (a < top \<and> b < top))" |
|
543 by transfer (auto simp add: top_ereal_def) |
|
544 |
|
545 lemma top_power_ennreal: "top ^ n = (if n = 0 then 1 else top :: ennreal)" |
|
546 by (induction n) (simp_all add: ennreal_mult_eq_top_iff) |
|
547 |
|
548 lemma ennreal_setprod_eq_0[simp]: |
|
549 fixes f :: "'a \<Rightarrow> ennreal" |
|
550 shows "(setprod f A = 0) = (finite A \<and> (\<exists>i\<in>A. f i = 0))" |
|
551 by (induction A rule: infinite_finite_induct) auto |
|
552 |
|
553 lemma ennreal_setprod_eq_top: |
|
554 fixes f :: "'a \<Rightarrow> ennreal" |
|
555 shows "(\<Prod>i\<in>I. f i) = top \<longleftrightarrow> (finite I \<and> ((\<forall>i\<in>I. f i \<noteq> 0) \<and> (\<exists>i\<in>I. f i = top)))" |
|
556 by (induction I rule: infinite_finite_induct) (auto simp: ennreal_mult_eq_top_iff) |
|
557 |
|
558 lemma ennreal_top_mult: "top * a = (if a = 0 then 0 else top :: ennreal)" |
|
559 by (simp add: ennreal_mult_eq_top_iff) |
|
560 |
|
561 lemma ennreal_mult_top: "a * top = (if a = 0 then 0 else top :: ennreal)" |
|
562 by (simp add: ennreal_mult_eq_top_iff) |
|
563 |
|
564 lemma enn2ereal_eq_top_iff[simp]: "enn2ereal x = \<infinity> \<longleftrightarrow> x = top" |
|
565 by transfer (simp add: top_ereal_def) |
|
566 |
|
567 lemma enn2ereal_top: "enn2ereal top = \<infinity>" |
|
568 by transfer (simp add: top_ereal_def) |
|
569 |
|
570 lemma e2ennreal_infty: "e2ennreal \<infinity> = top" |
|
571 by (simp add: top_ennreal.abs_eq top_ereal_def) |
|
572 |
|
573 lemma ennreal_top_minus[simp]: "top - x = (top::ennreal)" |
|
574 by transfer (auto simp: top_ereal_def max_def) |
|
575 |
|
576 lemma minus_top_ennreal: "x - top = (if x = top then top else 0:: ennreal)" |
|
577 apply transfer |
|
578 subgoal for x |
|
579 by (cases x) (auto simp: top_ereal_def max_def) |
|
580 done |
|
581 |
|
582 lemma bot_ennreal: "bot = (0::ennreal)" |
|
583 by transfer rule |
|
584 |
|
585 lemma ennreal_of_nat_neq_top[simp]: "of_nat i \<noteq> (top::ennreal)" |
|
586 by (induction i) auto |
|
587 |
|
588 lemma numeral_eq_of_nat: "(numeral a::ennreal) = of_nat (numeral a)" |
|
589 by simp |
|
590 |
|
591 lemma of_nat_less_top: "of_nat i < (top::ennreal)" |
|
592 using less_le_trans[of "of_nat i" "of_nat (Suc i)" "top::ennreal"] |
|
593 by simp |
|
594 |
|
595 lemma top_neq_numeral[simp]: "top \<noteq> (numeral i::ennreal)" |
|
596 using of_nat_less_top[of "numeral i"] by simp |
|
597 |
|
598 lemma ennreal_numeral_less_top[simp]: "numeral i < (top::ennreal)" |
|
599 using of_nat_less_top[of "numeral i"] by simp |
|
600 |
|
601 lemma ennreal_add_bot[simp]: "bot + x = (x::ennreal)" |
|
602 by transfer simp |
|
603 |
|
604 instance ennreal :: semiring_char_0 |
|
605 proof (standard, safe intro!: linorder_injI) |
|
606 have *: "1 + of_nat k \<noteq> (0::ennreal)" for k |
|
607 using add_pos_nonneg[OF zero_less_one, of "of_nat k :: ennreal"] by auto |
|
608 fix x y :: nat assume "x < y" "of_nat x = (of_nat y::ennreal)" then show False |
|
609 by (auto simp add: less_iff_Suc_add *) |
|
610 qed |
|
611 |
|
612 subsection \<open>Arithmetic\<close> |
|
613 |
|
614 lemma ennreal_minus_zero[simp]: "a - (0::ennreal) = a" |
|
615 by transfer (auto simp: max_def) |
|
616 |
|
617 lemma ennreal_add_diff_cancel_right[simp]: |
|
618 fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (x + y) - y = x" |
|
619 apply transfer |
|
620 subgoal for x y |
|
621 apply (cases x y rule: ereal2_cases) |
|
622 apply (auto split: split_max simp: top_ereal_def) |
|
623 done |
|
624 done |
|
625 |
|
626 lemma ennreal_add_diff_cancel_left[simp]: |
|
627 fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (y + x) - y = x" |
|
628 by (simp add: add.commute) |
|
629 |
|
630 lemma |
|
631 fixes a b :: ennreal |
|
632 shows "a - b = 0 \<Longrightarrow> a \<le> b" |
|
633 apply transfer |
|
634 subgoal for a b |
|
635 apply (cases a b rule: ereal2_cases) |
|
636 apply (auto simp: not_le max_def split: if_splits) |
|
637 done |
|
638 done |
|
639 |
|
640 lemma ennreal_minus_cancel: |
|
641 fixes a b c :: ennreal |
|
642 shows "c \<noteq> top \<Longrightarrow> a \<le> c \<Longrightarrow> b \<le> c \<Longrightarrow> c - a = c - b \<Longrightarrow> a = b" |
|
643 apply transfer |
|
644 subgoal for a b c |
|
645 by (cases a b c rule: ereal3_cases) |
|
646 (auto simp: top_ereal_def max_def split: if_splits) |
|
647 done |
|
648 |
|
649 lemma sup_const_add_ennreal: |
|
650 fixes a b c :: "ennreal" |
|
651 shows "sup (c + a) (c + b) = c + sup a b" |
|
652 apply transfer |
|
653 subgoal for a b c |
|
654 apply (cases a b c rule: ereal3_cases) |
|
655 apply (auto simp: ereal_max[symmetric] simp del: ereal_max) |
|
656 apply (auto simp: top_ereal_def[symmetric] sup_ereal_def[symmetric] |
|
657 simp del: sup_ereal_def) |
|
658 apply (auto simp add: top_ereal_def) |
|
659 done |
|
660 done |
|
661 |
|
662 lemma ennreal_diff_add_assoc: |
|
663 fixes a b c :: ennreal |
|
664 shows "a \<le> b \<Longrightarrow> c + b - a = c + (b - a)" |
|
665 apply transfer |
|
666 subgoal for a b c |
|
667 by (cases a b c rule: ereal3_cases) (auto simp: field_simps max_absorb2) |
|
668 done |
|
669 |
|
670 lemma mult_divide_eq_ennreal: |
|
671 fixes a b :: ennreal |
|
672 shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a" |
|
673 unfolding divide_ennreal_def |
|
674 apply transfer |
|
675 apply (subst mult.assoc) |
|
676 apply (simp add: top_ereal_def divide_ereal_def[symmetric]) |
|
677 done |
|
678 |
|
679 lemma divide_mult_eq: "a \<noteq> 0 \<Longrightarrow> a \<noteq> \<infinity> \<Longrightarrow> x * a / (b * a) = x / (b::ennreal)" |
|
680 unfolding divide_ennreal_def infinity_ennreal_def |
|
681 apply transfer |
|
682 subgoal for a b c |
|
683 apply (cases a b c rule: ereal3_cases) |
|
684 apply (auto simp: top_ereal_def) |
|
685 done |
|
686 done |
|
687 |
|
688 lemma ennreal_mult_divide_eq: |
|
689 fixes a b :: ennreal |
|
690 shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a" |
|
691 unfolding divide_ennreal_def |
|
692 apply transfer |
|
693 apply (subst mult.assoc) |
|
694 apply (simp add: top_ereal_def divide_ereal_def[symmetric]) |
|
695 done |
|
696 |
|
697 lemma ennreal_add_diff_cancel: |
|
698 fixes a b :: ennreal |
|
699 shows "b \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a" |
|
700 unfolding infinity_ennreal_def |
|
701 by transfer (simp add: max_absorb2 top_ereal_def ereal_add_diff_cancel) |
|
702 |
|
703 lemma ennreal_minus_eq_0: |
|
704 "a - b = 0 \<Longrightarrow> a \<le> (b::ennreal)" |
|
705 apply transfer |
|
706 subgoal for a b |
|
707 apply (cases a b rule: ereal2_cases) |
|
708 apply (auto simp: zero_ereal_def ereal_max[symmetric] max.absorb2 simp del: ereal_max) |
|
709 done |
|
710 done |
|
711 |
|
712 lemma ennreal_mono_minus_cancel: |
|
713 fixes a b c :: ennreal |
|
714 shows "a - b \<le> a - c \<Longrightarrow> a < top \<Longrightarrow> b \<le> a \<Longrightarrow> c \<le> a \<Longrightarrow> c \<le> b" |
|
715 by transfer |
|
716 (auto simp add: max.absorb2 ereal_diff_positive top_ereal_def dest: ereal_mono_minus_cancel) |
|
717 |
|
718 lemma ennreal_mono_minus: |
|
719 fixes a b c :: ennreal |
|
720 shows "c \<le> b \<Longrightarrow> a - b \<le> a - c" |
|
721 apply transfer |
|
722 apply (rule max.mono) |
|
723 apply simp |
|
724 subgoal for a b c |
|
725 by (cases a b c rule: ereal3_cases) auto |
|
726 done |
|
727 |
|
728 lemma ennreal_minus_pos_iff: |
|
729 fixes a b :: ennreal |
|
730 shows "a < top \<or> b < top \<Longrightarrow> 0 < a - b \<Longrightarrow> b < a" |
|
731 apply transfer |
|
732 subgoal for a b |
|
733 by (cases a b rule: ereal2_cases) (auto simp: less_max_iff_disj) |
|
734 done |
|
735 |
|
736 lemma ennreal_inverse_top[simp]: "inverse top = (0::ennreal)" |
|
737 by transfer (simp add: top_ereal_def ereal_inverse_eq_0) |
|
738 |
|
739 lemma ennreal_inverse_zero[simp]: "inverse 0 = (top::ennreal)" |
|
740 by transfer (simp add: top_ereal_def ereal_inverse_eq_0) |
|
741 |
|
742 lemma ennreal_top_divide: "top / (x::ennreal) = (if x = top then 0 else top)" |
|
743 unfolding divide_ennreal_def |
|
744 by transfer (simp add: top_ereal_def ereal_inverse_eq_0 ereal_0_gt_inverse) |
|
745 |
|
746 lemma ennreal_zero_divide[simp]: "0 / (x::ennreal) = 0" |
|
747 by (simp add: divide_ennreal_def) |
|
748 |
|
749 lemma ennreal_divide_zero[simp]: "x / (0::ennreal) = (if x = 0 then 0 else top)" |
|
750 by (simp add: divide_ennreal_def ennreal_mult_top) |
|
751 |
|
752 lemma ennreal_divide_top[simp]: "x / (top::ennreal) = 0" |
|
753 by (simp add: divide_ennreal_def ennreal_top_mult) |
|
754 |
|
755 lemma ennreal_times_divide: "a * (b / c) = a * b / (c::ennreal)" |
|
756 unfolding divide_ennreal_def |
|
757 by transfer (simp add: divide_ereal_def[symmetric] ereal_times_divide_eq) |
|
758 |
|
759 lemma ennreal_zero_less_divide: "0 < a / b \<longleftrightarrow> (0 < a \<and> b < (top::ennreal))" |
|
760 unfolding divide_ennreal_def |
|
761 by transfer (auto simp: ereal_zero_less_0_iff top_ereal_def ereal_0_gt_inverse) |
|
762 |
|
763 lemma divide_right_mono_ennreal: |
|
764 fixes a b c :: ennreal |
|
765 shows "a \<le> b \<Longrightarrow> a / c \<le> b / c" |
|
766 unfolding divide_ennreal_def by (intro mult_mono) auto |
|
767 |
|
768 lemma ennreal_mult_strict_right_mono: "(a::ennreal) < c \<Longrightarrow> 0 < b \<Longrightarrow> b < top \<Longrightarrow> a * b < c * b" |
|
769 by transfer (auto intro!: ereal_mult_strict_right_mono) |
|
770 |
|
771 lemma ennreal_indicator_less[simp]: |
|
772 "indicator A x \<le> (indicator B x::ennreal) \<longleftrightarrow> (x \<in> A \<longrightarrow> x \<in> B)" |
|
773 by (simp add: indicator_def not_le) |
|
774 |
|
775 lemma ennreal_inverse_positive: "0 < inverse x \<longleftrightarrow> (x::ennreal) \<noteq> top" |
|
776 by transfer (simp add: ereal_0_gt_inverse top_ereal_def) |
|
777 |
|
778 lemma ennreal_inverse_mult': "((0 < b \<or> a < top) \<and> (0 < a \<or> b < top)) \<Longrightarrow> inverse (a * b::ennreal) = inverse a * inverse b" |
|
779 apply transfer |
|
780 subgoal for a b |
|
781 by (cases a b rule: ereal2_cases) (auto simp: top_ereal_def) |
|
782 done |
|
783 |
|
784 lemma ennreal_inverse_mult: "a < top \<Longrightarrow> b < top \<Longrightarrow> inverse (a * b::ennreal) = inverse a * inverse b" |
|
785 apply transfer |
|
786 subgoal for a b |
|
787 by (cases a b rule: ereal2_cases) (auto simp: top_ereal_def) |
|
788 done |
|
789 |
|
790 lemma ennreal_inverse_1[simp]: "inverse (1::ennreal) = 1" |
|
791 by transfer simp |
|
792 |
|
793 lemma ennreal_inverse_eq_0_iff[simp]: "inverse (a::ennreal) = 0 \<longleftrightarrow> a = top" |
|
794 by transfer (simp add: ereal_inverse_eq_0 top_ereal_def) |
|
795 |
|
796 lemma ennreal_inverse_eq_top_iff[simp]: "inverse (a::ennreal) = top \<longleftrightarrow> a = 0" |
|
797 by transfer (simp add: top_ereal_def) |
|
798 |
|
799 lemma ennreal_divide_eq_0_iff[simp]: "(a::ennreal) / b = 0 \<longleftrightarrow> (a = 0 \<or> b = top)" |
|
800 by (simp add: divide_ennreal_def) |
|
801 |
|
802 lemma ennreal_divide_eq_top_iff: "(a::ennreal) / b = top \<longleftrightarrow> ((a \<noteq> 0 \<and> b = 0) \<or> (a = top \<and> b \<noteq> top))" |
|
803 by (auto simp add: divide_ennreal_def ennreal_mult_eq_top_iff) |
|
804 |
|
805 lemma one_divide_one_divide_ennreal[simp]: "1 / (1 / c) = (c::ennreal)" |
|
806 including ennreal.lifting |
|
807 unfolding divide_ennreal_def |
|
808 by transfer auto |
|
809 |
|
810 lemma ennreal_mult_left_cong: |
|
811 "((a::ennreal) \<noteq> 0 \<Longrightarrow> b = c) \<Longrightarrow> a * b = a * c" |
|
812 by (cases "a = 0") simp_all |
|
813 |
|
814 lemma ennreal_mult_right_cong: |
|
815 "((a::ennreal) \<noteq> 0 \<Longrightarrow> b = c) \<Longrightarrow> b * a = c * a" |
|
816 by (cases "a = 0") simp_all |
|
817 |
|
818 lemma ennreal_zero_less_mult_iff: "0 < a * b \<longleftrightarrow> 0 < a \<and> 0 < (b::ennreal)" |
|
819 by transfer (auto simp add: ereal_zero_less_0_iff le_less) |
|
820 |
|
821 lemma less_diff_eq_ennreal: |
|
822 fixes a b c :: ennreal |
|
823 shows "b < top \<or> c < top \<Longrightarrow> a < b - c \<longleftrightarrow> a + c < b" |
|
824 apply transfer |
|
825 subgoal for a b c |
|
826 by (cases a b c rule: ereal3_cases) (auto split: split_max) |
|
827 done |
|
828 |
|
829 lemma diff_add_cancel_ennreal: |
|
830 fixes a b :: ennreal shows "a \<le> b \<Longrightarrow> b - a + a = b" |
|
831 unfolding infinity_ennreal_def |
|
832 apply transfer |
|
833 subgoal for a b |
|
834 by (cases a b rule: ereal2_cases) (auto simp: max_absorb2) |
|
835 done |
|
836 |
|
837 lemma ennreal_diff_self[simp]: "a \<noteq> top \<Longrightarrow> a - a = (0::ennreal)" |
|
838 by transfer (simp add: top_ereal_def) |
|
839 |
|
840 lemma ennreal_minus_mono: |
|
841 fixes a b c :: ennreal |
|
842 shows "a \<le> c \<Longrightarrow> d \<le> b \<Longrightarrow> a - b \<le> c - d" |
|
843 apply transfer |
|
844 apply (rule max.mono) |
|
845 apply simp |
|
846 subgoal for a b c d |
|
847 by (cases a b c d rule: ereal3_cases[case_product ereal_cases]) auto |
|
848 done |
|
849 |
|
850 lemma ennreal_minus_eq_top[simp]: "a - (b::ennreal) = top \<longleftrightarrow> a = top" |
|
851 by transfer (auto simp: top_ereal_def max.absorb2 ereal_minus_eq_PInfty_iff split: split_max) |
|
852 |
|
853 lemma ennreal_divide_self[simp]: "a \<noteq> 0 \<Longrightarrow> a < top \<Longrightarrow> a / a = (1::ennreal)" |
|
854 unfolding divide_ennreal_def |
|
855 apply transfer |
|
856 subgoal for a |
|
857 by (cases a) (auto simp: top_ereal_def) |
|
858 done |
|
859 |
|
860 subsection \<open>Coercion from @{typ real} to @{typ ennreal}\<close> |
|
861 |
|
862 lift_definition ennreal :: "real \<Rightarrow> ennreal" is "sup 0 \<circ> ereal" |
|
863 by simp |
|
864 |
|
865 declare [[coercion ennreal]] |
|
866 |
|
867 lemma ennreal_cases[cases type: ennreal]: |
|
868 fixes x :: ennreal |
|
869 obtains (real) r :: real where "0 \<le> r" "x = ennreal r" | (top) "x = top" |
|
870 apply transfer |
|
871 subgoal for x thesis |
|
872 by (cases x) (auto simp: max.absorb2 top_ereal_def) |
|
873 done |
|
874 |
|
875 lemmas ennreal2_cases = ennreal_cases[case_product ennreal_cases] |
|
876 lemmas ennreal3_cases = ennreal_cases[case_product ennreal2_cases] |
|
877 |
|
878 lemma ennreal_neq_top[simp]: "ennreal r \<noteq> top" |
|
879 by transfer (simp add: top_ereal_def zero_ereal_def ereal_max[symmetric] del: ereal_max) |
|
880 |
|
881 lemma top_neq_ennreal[simp]: "top \<noteq> ennreal r" |
|
882 using ennreal_neq_top[of r] by (auto simp del: ennreal_neq_top) |
|
883 |
|
884 lemma ennreal_less_top[simp]: "ennreal x < top" |
|
885 by transfer (simp add: top_ereal_def max_def) |
|
886 |
|
887 lemma ennreal_neg: "x \<le> 0 \<Longrightarrow> ennreal x = 0" |
|
888 by transfer (simp add: max.absorb1) |
|
889 |
|
890 lemma ennreal_inj[simp]: |
|
891 "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal a = ennreal b \<longleftrightarrow> a = b" |
|
892 by (transfer fixing: a b) (auto simp: max_absorb2) |
|
893 |
|
894 lemma ennreal_le_iff[simp]: "0 \<le> y \<Longrightarrow> ennreal x \<le> ennreal y \<longleftrightarrow> x \<le> y" |
|
895 by (auto simp: ennreal_def zero_ereal_def less_eq_ennreal.abs_eq eq_onp_def split: split_max) |
|
896 |
|
897 lemma le_ennreal_iff: "0 \<le> r \<Longrightarrow> x \<le> ennreal r \<longleftrightarrow> (\<exists>q\<ge>0. x = ennreal q \<and> q \<le> r)" |
|
898 by (cases x) (auto simp: top_unique) |
|
899 |
|
900 lemma ennreal_less_iff: "0 \<le> r \<Longrightarrow> ennreal r < ennreal q \<longleftrightarrow> r < q" |
|
901 unfolding not_le[symmetric] by auto |
|
902 |
|
903 lemma ennreal_eq_zero_iff[simp]: "0 \<le> x \<Longrightarrow> ennreal x = 0 \<longleftrightarrow> x = 0" |
|
904 by transfer (auto simp: max_absorb2) |
|
905 |
|
906 lemma ennreal_less_zero_iff[simp]: "0 < ennreal x \<longleftrightarrow> 0 < x" |
|
907 by transfer (auto simp: max_def) |
|
908 |
|
909 lemma ennreal_lessI: "0 < q \<Longrightarrow> r < q \<Longrightarrow> ennreal r < ennreal q" |
|
910 by (cases "0 \<le> r") (auto simp: ennreal_less_iff ennreal_neg) |
|
911 |
|
912 lemma ennreal_leI: "x \<le> y \<Longrightarrow> ennreal x \<le> ennreal y" |
|
913 by (cases "0 \<le> y") (auto simp: ennreal_neg) |
|
914 |
|
915 lemma enn2ereal_ennreal[simp]: "0 \<le> x \<Longrightarrow> enn2ereal (ennreal x) = x" |
|
916 by transfer (simp add: max_absorb2) |
|
917 |
|
918 lemma e2ennreal_enn2ereal[simp]: "e2ennreal (enn2ereal x) = x" |
|
919 by (simp add: e2ennreal_def max_absorb2 ennreal.enn2ereal_inverse) |
|
920 |
|
921 lemma ennreal_0[simp]: "ennreal 0 = 0" |
|
922 by (simp add: ennreal_def max.absorb1 zero_ennreal.abs_eq) |
|
923 |
|
924 lemma ennreal_1[simp]: "ennreal 1 = 1" |
|
925 by transfer (simp add: max_absorb2) |
|
926 |
|
927 lemma ennreal_eq_0_iff: "ennreal x = 0 \<longleftrightarrow> x \<le> 0" |
|
928 by (cases "0 \<le> x") (auto simp: ennreal_neg) |
|
929 |
|
930 lemma ennreal_le_iff2: "ennreal x \<le> ennreal y \<longleftrightarrow> ((0 \<le> y \<and> x \<le> y) \<or> (x \<le> 0 \<and> y \<le> 0))" |
|
931 by (cases "0 \<le> y") (auto simp: ennreal_eq_0_iff ennreal_neg) |
|
932 |
|
933 lemma ennreal_eq_1[simp]: "ennreal x = 1 \<longleftrightarrow> x = 1" |
|
934 by (cases "0 \<le> x") |
|
935 (auto simp: ennreal_neg ennreal_1[symmetric] simp del: ennreal_1) |
|
936 |
|
937 lemma ennreal_le_1[simp]: "ennreal x \<le> 1 \<longleftrightarrow> x \<le> 1" |
|
938 by (cases "0 \<le> x") |
|
939 (auto simp: ennreal_neg ennreal_1[symmetric] simp del: ennreal_1) |
|
940 |
|
941 lemma ennreal_ge_1[simp]: "ennreal x \<ge> 1 \<longleftrightarrow> x \<ge> 1" |
|
942 by (cases "0 \<le> x") |
|
943 (auto simp: ennreal_neg ennreal_1[symmetric] simp del: ennreal_1) |
|
944 |
|
945 lemma ennreal_plus[simp]: |
|
946 "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a + b) = ennreal a + ennreal b" |
|
947 by (transfer fixing: a b) (auto simp: max_absorb2) |
|
948 |
|
949 lemma setsum_ennreal[simp]: "(\<And>i. i \<in> I \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Sum>i\<in>I. ennreal (f i)) = ennreal (setsum f I)" |
|
950 by (induction I rule: infinite_finite_induct) (auto simp: setsum_nonneg) |
|
951 |
|
952 lemma ennreal_of_nat_eq_real_of_nat: "of_nat i = ennreal (of_nat i)" |
|
953 by (induction i) simp_all |
|
954 |
|
955 lemma of_nat_le_ennreal_iff[simp]: "0 \<le> r \<Longrightarrow> of_nat i \<le> ennreal r \<longleftrightarrow> of_nat i \<le> r" |
|
956 by (simp add: ennreal_of_nat_eq_real_of_nat) |
|
957 |
|
958 lemma ennreal_le_of_nat_iff[simp]: "ennreal r \<le> of_nat i \<longleftrightarrow> r \<le> of_nat i" |
|
959 by (simp add: ennreal_of_nat_eq_real_of_nat) |
|
960 |
|
961 lemma ennreal_indicator: "ennreal (indicator A x) = indicator A x" |
|
962 by (auto split: split_indicator) |
|
963 |
|
964 lemma ennreal_numeral[simp]: "ennreal (numeral n) = numeral n" |
|
965 using ennreal_of_nat_eq_real_of_nat[of "numeral n"] by simp |
|
966 |
|
967 lemma min_ennreal: "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> min (ennreal x) (ennreal y) = ennreal (min x y)" |
|
968 by (auto split: split_min) |
|
969 |
|
970 lemma ennreal_half[simp]: "ennreal (1/2) = inverse 2" |
|
971 by transfer (simp add: max.absorb2) |
|
972 |
|
973 lemma ennreal_minus: "0 \<le> q \<Longrightarrow> ennreal r - ennreal q = ennreal (r - q)" |
|
974 by transfer |
|
975 (simp add: max.absorb2 zero_ereal_def ereal_max[symmetric] del: ereal_max) |
|
976 |
|
977 lemma ennreal_minus_top[simp]: "ennreal a - top = 0" |
|
978 by (simp add: minus_top_ennreal) |
|
979 |
|
980 lemma ennreal_mult: "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b" |
|
981 by transfer (simp add: max_absorb2) |
|
982 |
|
983 lemma ennreal_mult': "0 \<le> a \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b" |
|
984 by (cases "0 \<le> b") (auto simp: ennreal_mult ennreal_neg mult_nonneg_nonpos) |
|
985 |
|
986 lemma indicator_mult_ennreal: "indicator A x * ennreal r = ennreal (indicator A x * r)" |
|
987 by (simp split: split_indicator) |
|
988 |
|
989 lemma ennreal_mult'': "0 \<le> b \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b" |
|
990 by (cases "0 \<le> a") (auto simp: ennreal_mult ennreal_neg mult_nonpos_nonneg) |
|
991 |
|
992 lemma numeral_mult_ennreal: "0 \<le> x \<Longrightarrow> numeral b * ennreal x = ennreal (numeral b * x)" |
|
993 by (simp add: ennreal_mult) |
|
994 |
|
995 lemma ennreal_power: "0 \<le> r \<Longrightarrow> ennreal r ^ n = ennreal (r ^ n)" |
|
996 by (induction n) (auto simp: ennreal_mult) |
|
997 |
|
998 lemma power_eq_top_ennreal: "x ^ n = top \<longleftrightarrow> (n \<noteq> 0 \<and> (x::ennreal) = top)" |
|
999 by (cases x rule: ennreal_cases) |
|
1000 (auto simp: ennreal_power top_power_ennreal) |
|
1001 |
|
1002 lemma inverse_ennreal: "0 < r \<Longrightarrow> inverse (ennreal r) = ennreal (inverse r)" |
|
1003 by transfer (simp add: max.absorb2) |
|
1004 |
|
1005 lemma divide_ennreal: "0 \<le> r \<Longrightarrow> 0 < q \<Longrightarrow> ennreal r / ennreal q = ennreal (r / q)" |
|
1006 by (simp add: divide_ennreal_def inverse_ennreal ennreal_mult[symmetric] inverse_eq_divide) |
|
1007 |
|
1008 lemma ennreal_inverse_power: "inverse (x ^ n :: ennreal) = inverse x ^ n" |
|
1009 proof (cases x rule: ennreal_cases) |
|
1010 case top with power_eq_top_ennreal[of x n] show ?thesis |
|
1011 by (cases "n = 0") auto |
|
1012 next |
|
1013 case (real r) then show ?thesis |
|
1014 proof cases |
|
1015 assume "x = 0" then show ?thesis |
|
1016 using power_eq_top_ennreal[of top "n - 1"] |
|
1017 by (cases n) (auto simp: ennreal_top_mult) |
|
1018 next |
|
1019 assume "x \<noteq> 0" |
|
1020 with real have "0 < r" by auto |
|
1021 with real show ?thesis |
|
1022 by (induction n) |
|
1023 (auto simp add: ennreal_power ennreal_mult[symmetric] inverse_ennreal) |
279 qed |
1024 qed |
280 qed (rule open_ennreal_def) |
1025 qed |
281 |
1026 |
282 end |
1027 lemma ennreal_divide_numeral: "0 \<le> x \<Longrightarrow> ennreal x / numeral b = ennreal (x / numeral b)" |
|
1028 by (subst divide_ennreal[symmetric]) auto |
|
1029 |
|
1030 lemma setprod_ennreal: "(\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Prod>i\<in>A. ennreal (f i)) = ennreal (setprod f A)" |
|
1031 by (induction A rule: infinite_finite_induct) |
|
1032 (auto simp: ennreal_mult setprod_nonneg) |
|
1033 |
|
1034 lemma mult_right_ennreal_cancel: "a * ennreal c = b * ennreal c \<longleftrightarrow> (a = b \<or> c \<le> 0)" |
|
1035 apply (cases "0 \<le> c") |
|
1036 apply (cases a b rule: ennreal2_cases) |
|
1037 apply (auto simp: ennreal_mult[symmetric] ennreal_neg ennreal_top_mult) |
|
1038 done |
|
1039 |
|
1040 lemma ennreal_le_epsilon: |
|
1041 "(\<And>e::real. y < top \<Longrightarrow> 0 < e \<Longrightarrow> x \<le> y + ennreal e) \<Longrightarrow> x \<le> y" |
|
1042 apply (cases y rule: ennreal_cases) |
|
1043 apply (cases x rule: ennreal_cases) |
|
1044 apply (auto simp del: ennreal_plus simp add: top_unique ennreal_plus[symmetric] |
|
1045 intro: zero_less_one field_le_epsilon) |
|
1046 done |
283 |
1047 |
284 lemma ennreal_rat_dense: |
1048 lemma ennreal_rat_dense: |
285 fixes x y :: ennreal |
1049 fixes x y :: ennreal |
286 shows "x < y \<Longrightarrow> \<exists>r::rat. x < real_of_rat r \<and> real_of_rat r < y" |
1050 shows "x < y \<Longrightarrow> \<exists>r::rat. x < real_of_rat r \<and> real_of_rat r < y" |
287 proof transfer |
1051 proof transfer |
294 using le_less_trans[OF \<open>0 \<le> x\<close> \<open>x < ereal (real_of_rat r)\<close>] by auto |
1058 using le_less_trans[OF \<open>0 \<le> x\<close> \<open>x < ereal (real_of_rat r)\<close>] by auto |
295 ultimately show "\<exists>r. x < (sup 0 \<circ> ereal) (real_of_rat r) \<and> (sup 0 \<circ> ereal) (real_of_rat r) < y" |
1059 ultimately show "\<exists>r. x < (sup 0 \<circ> ereal) (real_of_rat r) \<and> (sup 0 \<circ> ereal) (real_of_rat r) < y" |
296 by (intro exI[of _ r]) (auto simp: max_absorb2) |
1060 by (intro exI[of _ r]) (auto simp: max_absorb2) |
297 qed |
1061 qed |
298 |
1062 |
299 lemma enn2ereal_range: "e2ennreal ` {0..} = UNIV" |
1063 lemma ennreal_Ex_less_of_nat: "(x::ennreal) < top \<Longrightarrow> \<exists>n. x < of_nat n" |
|
1064 by (cases x rule: ennreal_cases) |
|
1065 (auto simp: ennreal_of_nat_eq_real_of_nat ennreal_less_iff reals_Archimedean2) |
|
1066 |
|
1067 subsection \<open>Coercion from @{typ ennreal} to @{typ real}\<close> |
|
1068 |
|
1069 definition "enn2real x = real_of_ereal (enn2ereal x)" |
|
1070 |
|
1071 lemma enn2real_nonneg[simp]: "0 \<le> enn2real x" |
|
1072 by (auto simp: enn2real_def intro!: real_of_ereal_pos enn2ereal_nonneg) |
|
1073 |
|
1074 lemma enn2real_mono: "a \<le> b \<Longrightarrow> b < top \<Longrightarrow> enn2real a \<le> enn2real b" |
|
1075 by (auto simp add: enn2real_def less_eq_ennreal.rep_eq intro!: real_of_ereal_positive_mono enn2ereal_nonneg) |
|
1076 |
|
1077 lemma enn2real_of_nat[simp]: "enn2real (of_nat n) = n" |
|
1078 by (auto simp: enn2real_def) |
|
1079 |
|
1080 lemma enn2real_ennreal[simp]: "0 \<le> r \<Longrightarrow> enn2real (ennreal r) = r" |
|
1081 by (simp add: enn2real_def) |
|
1082 |
|
1083 lemma ennreal_enn2real[simp]: "r < top \<Longrightarrow> ennreal (enn2real r) = r" |
|
1084 by (cases r rule: ennreal_cases) auto |
|
1085 |
|
1086 lemma real_of_ereal_enn2ereal[simp]: "real_of_ereal (enn2ereal x) = enn2real x" |
|
1087 by (simp add: enn2real_def) |
|
1088 |
|
1089 lemma enn2real_top[simp]: "enn2real top = 0" |
|
1090 unfolding enn2real_def top_ennreal.rep_eq top_ereal_def by simp |
|
1091 |
|
1092 lemma enn2real_0[simp]: "enn2real 0 = 0" |
|
1093 unfolding enn2real_def zero_ennreal.rep_eq by simp |
|
1094 |
|
1095 lemma enn2real_1[simp]: "enn2real 1 = 1" |
|
1096 unfolding enn2real_def one_ennreal.rep_eq by simp |
|
1097 |
|
1098 lemma enn2real_numeral[simp]: "enn2real (numeral n) = (numeral n)" |
|
1099 unfolding enn2real_def by simp |
|
1100 |
|
1101 lemma enn2real_mult: "enn2real (a * b) = enn2real a * enn2real b" |
|
1102 unfolding enn2real_def |
|
1103 by (simp del: real_of_ereal_enn2ereal add: times_ennreal.rep_eq) |
|
1104 |
|
1105 lemma enn2real_leI: "0 \<le> B \<Longrightarrow> x \<le> ennreal B \<Longrightarrow> enn2real x \<le> B" |
|
1106 by (cases x rule: ennreal_cases) (auto simp: top_unique) |
|
1107 |
|
1108 lemma enn2real_positive_iff: "0 < enn2real x \<longleftrightarrow> (0 < x \<and> x < top)" |
|
1109 by (cases x rule: ennreal_cases) auto |
|
1110 |
|
1111 subsection \<open>Coercion from @{typ enat} to @{typ ennreal}\<close> |
|
1112 |
|
1113 |
|
1114 definition ennreal_of_enat :: "enat \<Rightarrow> ennreal" |
|
1115 where |
|
1116 "ennreal_of_enat n = (case n of \<infinity> \<Rightarrow> top | enat n \<Rightarrow> of_nat n)" |
|
1117 |
|
1118 declare [[coercion ennreal_of_enat]] |
|
1119 declare [[coercion "of_nat :: nat \<Rightarrow> ennreal"]] |
|
1120 |
|
1121 lemma ennreal_of_enat_infty[simp]: "ennreal_of_enat \<infinity> = \<infinity>" |
|
1122 by (simp add: ennreal_of_enat_def) |
|
1123 |
|
1124 lemma ennreal_of_enat_enat[simp]: "ennreal_of_enat (enat n) = of_nat n" |
|
1125 by (simp add: ennreal_of_enat_def) |
|
1126 |
|
1127 lemma ennreal_of_enat_0[simp]: "ennreal_of_enat 0 = 0" |
|
1128 using ennreal_of_enat_enat[of 0] unfolding enat_0 by simp |
|
1129 |
|
1130 lemma ennreal_of_enat_1[simp]: "ennreal_of_enat 1 = 1" |
|
1131 using ennreal_of_enat_enat[of 1] unfolding enat_1 by simp |
|
1132 |
|
1133 lemma ennreal_top_neq_of_nat[simp]: "(top::ennreal) \<noteq> of_nat i" |
|
1134 using ennreal_of_nat_neq_top[of i] by metis |
|
1135 |
|
1136 lemma ennreal_of_enat_inj[simp]: "ennreal_of_enat i = ennreal_of_enat j \<longleftrightarrow> i = j" |
|
1137 by (cases i j rule: enat.exhaust[case_product enat.exhaust]) auto |
|
1138 |
|
1139 lemma ennreal_of_enat_le_iff[simp]: "ennreal_of_enat m \<le> ennreal_of_enat n \<longleftrightarrow> m \<le> n" |
|
1140 by (auto simp: ennreal_of_enat_def top_unique split: enat.split) |
|
1141 |
|
1142 lemma of_nat_less_ennreal_of_nat[simp]: "of_nat n \<le> ennreal_of_enat x \<longleftrightarrow> of_nat n \<le> x" |
|
1143 by (cases x) (auto simp: of_nat_eq_enat) |
|
1144 |
|
1145 lemma ennreal_of_enat_Sup: "ennreal_of_enat (Sup X) = (SUP x:X. ennreal_of_enat x)" |
300 proof - |
1146 proof - |
301 have "\<exists>y\<ge>0. x = e2ennreal y" for x |
1147 have "ennreal_of_enat (Sup X) \<le> (SUP x : X. ennreal_of_enat x)" |
302 by (cases x) (auto simp: e2ennreal_def max_absorb2) |
1148 unfolding Sup_enat_def |
|
1149 proof (clarsimp, intro conjI impI) |
|
1150 fix x assume "finite X" "X \<noteq> {}" |
|
1151 then show "ennreal_of_enat (Max X) \<le> (SUP x : X. ennreal_of_enat x)" |
|
1152 by (intro SUP_upper Max_in) |
|
1153 next |
|
1154 assume "infinite X" "X \<noteq> {}" |
|
1155 have "\<exists>y\<in>X. r < ennreal_of_enat y" if r: "r < top" for r |
|
1156 proof - |
|
1157 from ennreal_Ex_less_of_nat[OF r] guess n .. note n = this |
|
1158 have "\<not> (X \<subseteq> enat ` {.. n})" |
|
1159 using \<open>infinite X\<close> by (auto dest: finite_subset) |
|
1160 then obtain x where "x \<in> X" "x \<notin> enat ` {..n}" |
|
1161 by blast |
|
1162 moreover then have "of_nat n \<le> x" |
|
1163 by (cases x) (auto simp: of_nat_eq_enat) |
|
1164 ultimately show ?thesis |
|
1165 by (auto intro!: bexI[of _ x] less_le_trans[OF n]) |
|
1166 qed |
|
1167 then have "(SUP x : X. ennreal_of_enat x) = top" |
|
1168 by simp |
|
1169 then show "top \<le> (SUP x : X. ennreal_of_enat x)" |
|
1170 unfolding top_unique by simp |
|
1171 qed |
303 then show ?thesis |
1172 then show ?thesis |
304 by (auto simp: image_iff Bex_def) |
1173 by (auto intro!: antisym Sup_least intro: Sup_upper) |
305 qed |
1174 qed |
306 |
1175 |
307 lemma enn2ereal_nonneg: "0 \<le> enn2ereal x" |
1176 lemma ennreal_of_enat_eSuc[simp]: "ennreal_of_enat (eSuc x) = 1 + ennreal_of_enat x" |
308 using ennreal.enn2ereal[of x] by simp |
1177 by (cases x) (auto simp: eSuc_enat) |
309 |
1178 |
310 lemma ereal_ennreal_cases: |
1179 subsection \<open>Topology on @{typ ennreal}\<close> |
311 obtains b where "0 \<le> a" "a = enn2ereal b" | "a < 0" |
|
312 using e2ennreal'_inverse[of a, symmetric] by (cases "0 \<le> a") (auto intro: enn2ereal_nonneg) |
|
313 |
1180 |
314 lemma enn2ereal_Iio: "enn2ereal -` {..<a} = (if 0 \<le> a then {..< e2ennreal a} else {})" |
1181 lemma enn2ereal_Iio: "enn2ereal -` {..<a} = (if 0 \<le> a then {..< e2ennreal a} else {})" |
315 using enn2ereal_nonneg |
1182 using enn2ereal_nonneg |
316 by (cases a rule: ereal_ennreal_cases) |
1183 by (cases a rule: ereal_ennreal_cases) |
317 (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def max_absorb2 |
1184 (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def max_absorb2 |
|
1185 simp del: enn2ereal_nonneg |
318 intro: le_less_trans less_imp_le) |
1186 intro: le_less_trans less_imp_le) |
319 |
1187 |
320 lemma enn2ereal_Ioi: "enn2ereal -` {a <..} = (if 0 \<le> a then {e2ennreal a <..} else UNIV)" |
1188 lemma enn2ereal_Ioi: "enn2ereal -` {a <..} = (if 0 \<le> a then {e2ennreal a <..} else UNIV)" |
321 using enn2ereal_nonneg |
|
322 by (cases a rule: ereal_ennreal_cases) |
1189 by (cases a rule: ereal_ennreal_cases) |
323 (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def max_absorb2 |
1190 (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def max_absorb2 |
324 intro: less_le_trans) |
1191 intro: less_le_trans) |
|
1192 |
|
1193 instantiation ennreal :: linear_continuum_topology |
|
1194 begin |
|
1195 |
|
1196 definition open_ennreal :: "ennreal set \<Rightarrow> bool" |
|
1197 where "(open :: ennreal set \<Rightarrow> bool) = generate_topology (range lessThan \<union> range greaterThan)" |
|
1198 |
|
1199 instance |
|
1200 proof |
|
1201 show "\<exists>a b::ennreal. a \<noteq> b" |
|
1202 using zero_neq_one by (intro exI) |
|
1203 show "\<And>x y::ennreal. x < y \<Longrightarrow> \<exists>z>x. z < y" |
|
1204 proof transfer |
|
1205 fix x y :: ereal assume "0 \<le> x" "x < y" |
|
1206 moreover from dense[OF this(2)] guess z .. |
|
1207 ultimately show "\<exists>z\<in>Collect (op \<le> 0). x < z \<and> z < y" |
|
1208 by (intro bexI[of _ z]) auto |
|
1209 qed |
|
1210 qed (rule open_ennreal_def) |
|
1211 |
|
1212 end |
325 |
1213 |
326 lemma continuous_on_e2ennreal: "continuous_on A e2ennreal" |
1214 lemma continuous_on_e2ennreal: "continuous_on A e2ennreal" |
327 proof (rule continuous_on_subset) |
1215 proof (rule continuous_on_subset) |
328 show "continuous_on ({0..} \<union> {..0}) e2ennreal" |
1216 show "continuous_on ({0..} \<union> {..0}) e2ennreal" |
329 proof (rule continuous_on_closed_Un) |
1217 proof (rule continuous_on_closed_Un) |
346 (auto simp add: enn2ereal_Iio enn2ereal_Ioi) |
1234 (auto simp add: enn2ereal_Iio enn2ereal_Ioi) |
347 |
1235 |
348 lemma continuous_at_enn2ereal: "continuous (at x within A) enn2ereal" |
1236 lemma continuous_at_enn2ereal: "continuous (at x within A) enn2ereal" |
349 by (rule continuous_on_imp_continuous_within[OF continuous_on_enn2ereal]) auto |
1237 by (rule continuous_on_imp_continuous_within[OF continuous_on_enn2ereal]) auto |
350 |
1238 |
|
1239 lemma sup_continuous_e2ennreal[order_continuous_intros]: |
|
1240 assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. e2ennreal (f x))" |
|
1241 apply (rule sup_continuous_compose[OF _ f]) |
|
1242 apply (rule continuous_at_left_imp_sup_continuous) |
|
1243 apply (auto simp: mono_def e2ennreal_mono continuous_at_e2ennreal) |
|
1244 done |
|
1245 |
|
1246 lemma sup_continuous_enn2ereal[order_continuous_intros]: |
|
1247 assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. enn2ereal (f x))" |
|
1248 apply (rule sup_continuous_compose[OF _ f]) |
|
1249 apply (rule continuous_at_left_imp_sup_continuous) |
|
1250 apply (simp_all add: mono_def less_eq_ennreal.rep_eq continuous_at_enn2ereal) |
|
1251 done |
|
1252 |
|
1253 lemma sup_continuous_mult_left_ennreal': |
|
1254 fixes c :: "ennreal" |
|
1255 shows "sup_continuous (\<lambda>x. c * x)" |
|
1256 unfolding sup_continuous_def |
|
1257 by transfer (auto simp: SUP_ereal_mult_left max.absorb2 SUP_upper2) |
|
1258 |
|
1259 lemma sup_continuous_mult_left_ennreal[order_continuous_intros]: |
|
1260 "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. c * f x :: ennreal)" |
|
1261 by (rule sup_continuous_compose[OF sup_continuous_mult_left_ennreal']) |
|
1262 |
|
1263 lemma sup_continuous_mult_right_ennreal[order_continuous_intros]: |
|
1264 "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x * c :: ennreal)" |
|
1265 using sup_continuous_mult_left_ennreal[of f c] by (simp add: mult.commute) |
|
1266 |
|
1267 lemma sup_continuous_divide_ennreal[order_continuous_intros]: |
|
1268 fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal" |
|
1269 shows "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x / c)" |
|
1270 unfolding divide_ennreal_def by (rule sup_continuous_mult_right_ennreal) |
|
1271 |
351 lemma transfer_enn2ereal_continuous_on [transfer_rule]: |
1272 lemma transfer_enn2ereal_continuous_on [transfer_rule]: |
352 "rel_fun (op =) (rel_fun (rel_fun op = pcr_ennreal) op =) continuous_on continuous_on" |
1273 "rel_fun (op =) (rel_fun (rel_fun op = pcr_ennreal) op =) continuous_on continuous_on" |
353 proof - |
1274 proof - |
354 have "continuous_on A f" if "continuous_on A (\<lambda>x. enn2ereal (f x))" for A and f :: "'a \<Rightarrow> ennreal" |
1275 have "continuous_on A f" if "continuous_on A (\<lambda>x. enn2ereal (f x))" for A and f :: "'a \<Rightarrow> ennreal" |
355 using continuous_on_compose2[OF continuous_on_e2ennreal[of "{0..}"] that] |
1276 using continuous_on_compose2[OF continuous_on_e2ennreal[of "{0..}"] that] |
356 by (auto simp: ennreal.enn2ereal_inverse subset_eq enn2ereal_nonneg e2ennreal_def max_absorb2) |
1277 by (auto simp: ennreal.enn2ereal_inverse subset_eq e2ennreal_def max_absorb2) |
357 moreover |
1278 moreover |
358 have "continuous_on A (\<lambda>x. enn2ereal (f x))" if "continuous_on A f" for A and f :: "'a \<Rightarrow> ennreal" |
1279 have "continuous_on A (\<lambda>x. enn2ereal (f x))" if "continuous_on A f" for A and f :: "'a \<Rightarrow> ennreal" |
359 using continuous_on_compose2[OF continuous_on_enn2ereal that] by auto |
1280 using continuous_on_compose2[OF continuous_on_enn2ereal that] by auto |
360 ultimately |
1281 ultimately |
361 show ?thesis |
1282 show ?thesis |
362 by (auto simp add: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def) |
1283 by (auto simp add: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def) |
363 qed |
1284 qed |
364 |
1285 |
365 lemma continuous_on_add_ennreal[continuous_intros]: |
1286 lemma transfer_sup_continuous[transfer_rule]: |
366 fixes f g :: "'a::topological_space \<Rightarrow> ennreal" |
1287 "(rel_fun (rel_fun (op =) pcr_ennreal) op =) sup_continuous sup_continuous" |
367 shows "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> continuous_on A (\<lambda>x. f x + g x)" |
1288 proof (safe intro!: rel_funI dest!: rel_fun_eq_pcr_ennreal[THEN iffD1]) |
368 by (transfer fixing: A) (auto intro!: tendsto_add_ereal_nonneg simp: continuous_on_def) |
1289 show "sup_continuous (enn2ereal \<circ> f) \<Longrightarrow> sup_continuous f" for f :: "'a \<Rightarrow> _" |
369 |
1290 using sup_continuous_e2ennreal[of "enn2ereal \<circ> f"] by simp |
370 lemma continuous_on_inverse_ennreal[continuous_intros]: |
1291 show "sup_continuous f \<Longrightarrow> sup_continuous (enn2ereal \<circ> f)" for f :: "'a \<Rightarrow> _" |
371 fixes f :: "'a::topological_space \<Rightarrow> ennreal" |
1292 using sup_continuous_enn2ereal[of f] by (simp add: comp_def) |
372 shows "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))" |
1293 qed |
373 proof (transfer fixing: A) |
1294 |
374 show "pred_fun (\<lambda>_. True) (op \<le> 0) f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))" if "continuous_on A f" |
1295 lemma continuous_on_ennreal[tendsto_intros]: |
375 for f :: "'a \<Rightarrow> ereal" |
1296 "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. ennreal (f x))" |
376 using continuous_on_compose2[OF continuous_on_inverse_ereal that] by (auto simp: subset_eq) |
1297 by transfer (auto intro!: continuous_on_max continuous_on_const continuous_on_ereal) |
377 qed |
|
378 |
|
379 instance ennreal :: topological_comm_monoid_add |
|
380 proof |
|
381 show "((\<lambda>x. fst x + snd x) \<longlongrightarrow> a + b) (nhds a \<times>\<^sub>F nhds b)" for a b :: ennreal |
|
382 using continuous_on_add_ennreal[of UNIV fst snd] |
|
383 using tendsto_at_iff_tendsto_nhds[symmetric, of "\<lambda>x::(ennreal \<times> ennreal). fst x + snd x"] |
|
384 by (auto simp: continuous_on_eq_continuous_at) |
|
385 (simp add: isCont_def nhds_prod[symmetric]) |
|
386 qed |
|
387 |
|
388 lemma ennreal_zero_less_top[simp]: "0 < (top::ennreal)" |
|
389 by transfer (simp add: top_ereal_def) |
|
390 |
|
391 lemma ennreal_one_less_top[simp]: "1 < (top::ennreal)" |
|
392 by transfer (simp add: top_ereal_def) |
|
393 |
|
394 lemma ennreal_zero_neq_top[simp]: "0 \<noteq> (top::ennreal)" |
|
395 by transfer (simp add: top_ereal_def) |
|
396 |
|
397 lemma ennreal_top_neq_zero[simp]: "(top::ennreal) \<noteq> 0" |
|
398 by transfer (simp add: top_ereal_def) |
|
399 |
|
400 lemma ennreal_top_neq_one[simp]: "top \<noteq> (1::ennreal)" |
|
401 by transfer (simp add: top_ereal_def one_ereal_def ereal_max[symmetric] del: ereal_max) |
|
402 |
|
403 lemma ennreal_one_neq_top[simp]: "1 \<noteq> (top::ennreal)" |
|
404 by transfer (simp add: top_ereal_def one_ereal_def ereal_max[symmetric] del: ereal_max) |
|
405 |
|
406 lemma ennreal_add_less_top[simp]: |
|
407 fixes a b :: ennreal |
|
408 shows "a + b < top \<longleftrightarrow> a < top \<and> b < top" |
|
409 by transfer (auto simp: top_ereal_def) |
|
410 |
|
411 lemma ennreal_add_eq_top[simp]: |
|
412 fixes a b :: ennreal |
|
413 shows "a + b = top \<longleftrightarrow> a = top \<or> b = top" |
|
414 by transfer (auto simp: top_ereal_def) |
|
415 |
|
416 lemma ennreal_setsum_less_top[simp]: |
|
417 fixes f :: "'a \<Rightarrow> ennreal" |
|
418 shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) < top \<longleftrightarrow> (\<forall>i\<in>I. f i < top)" |
|
419 by (induction I rule: finite_induct) auto |
|
420 |
|
421 lemma ennreal_setsum_eq_top[simp]: |
|
422 fixes f :: "'a \<Rightarrow> ennreal" |
|
423 shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) = top \<longleftrightarrow> (\<exists>i\<in>I. f i = top)" |
|
424 by (induction I rule: finite_induct) auto |
|
425 |
|
426 lemma enn2ereal_eq_top_iff[simp]: "enn2ereal x = \<infinity> \<longleftrightarrow> x = top" |
|
427 by transfer (simp add: top_ereal_def) |
|
428 |
|
429 lemma ennreal_top_top: "top - top = (top::ennreal)" |
|
430 by transfer (auto simp: top_ereal_def max_def) |
|
431 |
|
432 lemma ennreal_minus_zero[simp]: "a - (0::ennreal) = a" |
|
433 by transfer (auto simp: max_def) |
|
434 |
|
435 lemma ennreal_add_diff_cancel_right[simp]: |
|
436 fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (x + y) - y = x" |
|
437 apply transfer |
|
438 subgoal for x y |
|
439 apply (cases x y rule: ereal2_cases) |
|
440 apply (auto split: split_max simp: top_ereal_def) |
|
441 done |
|
442 done |
|
443 |
|
444 lemma ennreal_add_diff_cancel_left[simp]: |
|
445 fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (y + x) - y = x" |
|
446 by (simp add: add.commute) |
|
447 |
|
448 lemma |
|
449 fixes a b :: ennreal |
|
450 shows "a - b = 0 \<Longrightarrow> a \<le> b" |
|
451 apply transfer |
|
452 subgoal for a b |
|
453 apply (cases a b rule: ereal2_cases) |
|
454 apply (auto simp: not_le max_def split: if_splits) |
|
455 done |
|
456 done |
|
457 |
|
458 lemma ennreal_minus_cancel: |
|
459 fixes a b c :: ennreal |
|
460 shows "c \<noteq> top \<Longrightarrow> a \<le> c \<Longrightarrow> b \<le> c \<Longrightarrow> c - a = c - b \<Longrightarrow> a = b" |
|
461 apply transfer |
|
462 subgoal for a b c |
|
463 by (cases a b c rule: ereal3_cases) |
|
464 (auto simp: top_ereal_def max_def split: if_splits) |
|
465 done |
|
466 |
|
467 lemma enn2ereal_ennreal[simp]: "0 \<le> x \<Longrightarrow> enn2ereal (ennreal x) = x" |
|
468 by transfer (simp add: max_absorb2) |
|
469 |
1298 |
470 lemma tendsto_ennrealD: |
1299 lemma tendsto_ennrealD: |
471 assumes lim: "((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F" |
1300 assumes lim: "((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F" |
472 assumes *: "\<forall>\<^sub>F x in F. 0 \<le> f x" and x: "0 \<le> x" |
1301 assumes *: "\<forall>\<^sub>F x in F. 0 \<le> f x" and x: "0 \<le> x" |
473 shows "(f \<longlongrightarrow> x) F" |
1302 shows "(f \<longlongrightarrow> x) F" |
512 |
1360 |
513 lemma suminf_ennreal[simp]: |
1361 lemma suminf_ennreal[simp]: |
514 "(\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal (\<Sum>i. f i)" |
1362 "(\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal (\<Sum>i. f i)" |
515 by (rule sums_unique[symmetric]) (simp add: summable_suminf_not_top suminf_nonneg summable_sums) |
1363 by (rule sums_unique[symmetric]) (simp add: summable_suminf_not_top suminf_nonneg summable_sums) |
516 |
1364 |
517 lemma suminf_less_top: "(\<Sum>i. f i :: ennreal) < top \<Longrightarrow> f i < top" |
1365 lemma sums_enn2ereal[simp]: "(\<lambda>i. enn2ereal (f i)) sums enn2ereal x \<longleftrightarrow> f sums x" |
518 using le_less_trans[OF setsum_le_suminf[OF summableI, of "{i}" f]] by simp |
1366 unfolding sums_def by (simp add: always_eventually setsum_nonneg) |
519 |
1367 |
520 lemma add_top: |
1368 lemma suminf_enn2ereal[simp]: "(\<Sum>i. enn2ereal (f i)) = enn2ereal (suminf f)" |
521 fixes x :: "'a::{order_top, ordered_comm_monoid_add}" |
1369 by (rule sums_unique[symmetric]) (simp add: summable_sums) |
522 shows "0 \<le> x \<Longrightarrow> x + top = top" |
1370 |
523 by (intro top_le add_increasing order_refl) |
1371 lemma transfer_e2ennreal_suminf [transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal suminf suminf" |
524 |
1372 by (auto simp: rel_funI rel_fun_eq_pcr_ennreal comp_def) |
525 lemma top_add: |
1373 |
526 fixes x :: "'a::{order_top, ordered_comm_monoid_add}" |
1374 lemma ennreal_suminf_cmult[simp]: "(\<Sum>i. r * f i) = r * (\<Sum>i. f i::ennreal)" |
527 shows "0 \<le> x \<Longrightarrow> top + x = top" |
1375 by transfer (auto intro!: suminf_cmult_ereal) |
528 by (intro top_le add_increasing2 order_refl) |
1376 |
529 |
1377 lemma ennreal_suminf_multc[simp]: "(\<Sum>i. f i * r) = (\<Sum>i. f i::ennreal) * r" |
530 lemma enn2ereal_top: "enn2ereal top = \<infinity>" |
1378 using ennreal_suminf_cmult[of r f] by (simp add: ac_simps) |
531 by transfer (simp add: top_ereal_def) |
1379 |
532 |
1380 lemma ennreal_suminf_divide[simp]: "(\<Sum>i. f i / r) = (\<Sum>i. f i::ennreal) / r" |
533 lemma e2ennreal_infty: "e2ennreal \<infinity> = top" |
1381 by (simp add: divide_ennreal_def) |
534 by (simp add: top_ennreal.abs_eq top_ereal_def) |
1382 |
535 |
1383 lemma ennreal_suminf_neq_top: "summable f \<Longrightarrow> (\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top" |
536 lemma sup_const_add_ennreal: |
1384 using sums_ennreal[of f "suminf f"] |
537 fixes a b c :: "ennreal" |
1385 by (simp add: suminf_nonneg sums_unique[symmetric] summable_sums_iff[symmetric] del: sums_ennreal) |
538 shows "sup (c + a) (c + b) = c + sup a b" |
1386 |
539 apply transfer |
1387 lemma suminf_ennreal_eq: |
540 subgoal for a b c |
1388 "(\<And>i. 0 \<le> f i) \<Longrightarrow> f sums x \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal x" |
541 apply (cases a b c rule: ereal3_cases) |
1389 using suminf_nonneg[of f] sums_unique[of f x] |
542 apply (auto simp: ereal_max[symmetric] simp del: ereal_max) |
1390 by (intro sums_unique[symmetric]) (auto simp: summable_sums_iff) |
543 apply (auto simp: top_ereal_def[symmetric] sup_ereal_def[symmetric] |
1391 |
544 simp del: sup_ereal_def) |
1392 lemma ennreal_suminf_bound_add: |
545 apply (auto simp add: top_ereal_def) |
1393 fixes f :: "nat \<Rightarrow> ennreal" |
546 done |
1394 shows "(\<And>N. (\<Sum>n<N. f n) + y \<le> x) \<Longrightarrow> suminf f + y \<le> x" |
547 done |
1395 by transfer (auto intro!: suminf_bound_add) |
548 |
1396 |
549 lemma bot_ennreal: "bot = (0::ennreal)" |
1397 lemma ennreal_suminf_SUP_eq_directed: |
550 by transfer rule |
1398 fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal" |
551 |
1399 assumes *: "\<And>N i j. i \<in> I \<Longrightarrow> j \<in> I \<Longrightarrow> finite N \<Longrightarrow> \<exists>k\<in>I. \<forall>n\<in>N. f i n \<le> f k n \<and> f j n \<le> f k n" |
552 lemma le_lfp: "mono f \<Longrightarrow> x \<le> lfp f \<Longrightarrow> f x \<le> lfp f" |
1400 shows "(\<Sum>n. SUP i:I. f i n) = (SUP i:I. \<Sum>n. f i n)" |
553 by (subst lfp_unfold) (auto dest: monoD) |
1401 proof cases |
554 |
1402 assume "I \<noteq> {}" |
555 lemma lfp_transfer: |
1403 then obtain i where "i \<in> I" by auto |
556 assumes \<alpha>: "sup_continuous \<alpha>" and f: "sup_continuous f" and mg: "mono g" |
1404 from * show ?thesis |
557 assumes bot: "\<alpha> bot \<le> lfp g" and eq: "\<And>x. x \<le> lfp f \<Longrightarrow> \<alpha> (f x) = g (\<alpha> x)" |
1405 by (transfer fixing: I) |
558 shows "\<alpha> (lfp f) = lfp g" |
1406 (auto simp: max_absorb2 SUP_upper2[OF \<open>i \<in> I\<close>] suminf_nonneg summable_ereal_pos \<open>I \<noteq> {}\<close> |
559 proof (rule antisym) |
1407 intro!: suminf_SUP_eq_directed) |
560 note mf = sup_continuous_mono[OF f] |
1408 qed (simp add: bot_ennreal) |
561 have f_le_lfp: "(f ^^ i) bot \<le> lfp f" for i |
|
562 by (induction i) (auto intro: le_lfp mf) |
|
563 |
|
564 have "\<alpha> ((f ^^ i) bot) \<le> lfp g" for i |
|
565 by (induction i) (auto simp: bot eq f_le_lfp intro!: le_lfp mg) |
|
566 then show "\<alpha> (lfp f) \<le> lfp g" |
|
567 unfolding sup_continuous_lfp[OF f] |
|
568 by (subst \<alpha>[THEN sup_continuousD]) |
|
569 (auto intro!: mono_funpow sup_continuous_mono[OF f] SUP_least) |
|
570 |
|
571 show "lfp g \<le> \<alpha> (lfp f)" |
|
572 by (rule lfp_lowerbound) (simp add: eq[symmetric] lfp_unfold[OF mf, symmetric]) |
|
573 qed |
|
574 |
|
575 lemma sup_continuous_applyD: "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x h)" |
|
576 using sup_continuous_apply[THEN sup_continuous_compose] . |
|
577 |
1409 |
578 lemma INF_ennreal_add_const: |
1410 lemma INF_ennreal_add_const: |
579 fixes f g :: "nat \<Rightarrow> ennreal" |
1411 fixes f g :: "nat \<Rightarrow> ennreal" |
580 shows "(INF i. f i + c) = (INF i. f i) + c" |
1412 shows "(INF i. f i + c) = (INF i. f i) + c" |
581 using continuous_at_Inf_mono[of "\<lambda>x. x + c" "f`UNIV"] |
1413 using continuous_at_Inf_mono[of "\<lambda>x. x + c" "f`UNIV"] |
728 by (subst tendsto_ennreal_iff) (auto elim: eventually_mono simp: real) |
1500 by (subst tendsto_ennreal_iff) (auto elim: eventually_mono simp: real) |
729 with ae2 show ?thesis |
1501 with ae2 show ?thesis |
730 by (auto simp: real tendsto_cong eventually_conj_iff) |
1502 by (auto simp: real tendsto_cong eventually_conj_iff) |
731 qed |
1503 qed |
732 |
1504 |
733 lemma ereal_add_diff_cancel: |
|
734 fixes a b :: ereal |
|
735 shows "\<bar>b\<bar> \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a" |
|
736 by (cases a b rule: ereal2_cases) auto |
|
737 |
|
738 lemma ennreal_add_diff_cancel: |
|
739 fixes a b :: ennreal |
|
740 shows "b \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a" |
|
741 unfolding infinity_ennreal_def |
|
742 by transfer (simp add: max_absorb2 top_ereal_def ereal_add_diff_cancel) |
|
743 |
|
744 lemma ennreal_mult_eq_top_iff: |
|
745 fixes a b :: ennreal |
|
746 shows "a * b = top \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)" |
|
747 by transfer (auto simp: top_ereal_def) |
|
748 |
|
749 lemma ennreal_top_eq_mult_iff: |
|
750 fixes a b :: ennreal |
|
751 shows "top = a * b \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)" |
|
752 using ennreal_mult_eq_top_iff[of a b] by auto |
|
753 |
|
754 lemma ennreal_mult: "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b" |
|
755 by transfer (simp add: max_absorb2) |
|
756 |
|
757 lemma setsum_enn2ereal[simp]: "(\<And>i. i \<in> I \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Sum>i\<in>I. enn2ereal (f i)) = enn2ereal (setsum f I)" |
|
758 by (induction I rule: infinite_finite_induct) (auto simp: setsum_nonneg zero_ennreal.rep_eq plus_ennreal.rep_eq) |
|
759 |
|
760 lemma e2ennreal_enn2ereal[simp]: "e2ennreal (enn2ereal x) = x" |
|
761 by (simp add: e2ennreal_def max_absorb2 enn2ereal_nonneg ennreal.enn2ereal_inverse) |
|
762 |
|
763 lemma tendsto_enn2ereal_iff[simp]: "((\<lambda>i. enn2ereal (f i)) \<longlongrightarrow> enn2ereal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F" |
|
764 using continuous_on_enn2ereal[THEN continuous_on_tendsto_compose, of f x F] |
|
765 continuous_on_e2ennreal[THEN continuous_on_tendsto_compose, of "\<lambda>x. enn2ereal (f x)" "enn2ereal x" F UNIV] |
|
766 by auto |
|
767 |
|
768 lemma sums_enn2ereal[simp]: "(\<lambda>i. enn2ereal (f i)) sums enn2ereal x \<longleftrightarrow> f sums x" |
|
769 unfolding sums_def by (simp add: always_eventually setsum_nonneg setsum_enn2ereal) |
|
770 |
|
771 lemma suminf_enn2real[simp]: "(\<Sum>i. enn2ereal (f i)) = enn2ereal (suminf f)" |
|
772 by (rule sums_unique[symmetric]) (simp add: summable_sums) |
|
773 |
|
774 lemma pcr_ennreal_enn2ereal[simp]: "pcr_ennreal (enn2ereal x) x" |
|
775 by (simp add: ennreal.pcr_cr_eq cr_ennreal_def) |
|
776 |
|
777 lemma rel_fun_eq_pcr_ennreal: "rel_fun op = pcr_ennreal f g \<longleftrightarrow> f = enn2ereal \<circ> g" |
|
778 by (auto simp: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def) |
|
779 |
|
780 lemma transfer_e2ennreal_suminf [transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal suminf suminf" |
|
781 by (auto simp: rel_funI rel_fun_eq_pcr_ennreal comp_def) |
|
782 |
|
783 lemma ennreal_suminf_cmult[simp]: "(\<Sum>i. r * f i) = r * (\<Sum>i. f i::ennreal)" |
|
784 by transfer (auto intro!: suminf_cmult_ereal) |
|
785 |
|
786 lemma ennreal_suminf_SUP_eq_directed: |
|
787 fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal" |
|
788 assumes *: "\<And>N i j. i \<in> I \<Longrightarrow> j \<in> I \<Longrightarrow> finite N \<Longrightarrow> \<exists>k\<in>I. \<forall>n\<in>N. f i n \<le> f k n \<and> f j n \<le> f k n" |
|
789 shows "(\<Sum>n. SUP i:I. f i n) = (SUP i:I. \<Sum>n. f i n)" |
|
790 proof cases |
|
791 assume "I \<noteq> {}" |
|
792 then obtain i where "i \<in> I" by auto |
|
793 from * show ?thesis |
|
794 by (transfer fixing: I) |
|
795 (auto simp: max_absorb2 SUP_upper2[OF \<open>i \<in> I\<close>] suminf_nonneg summable_ereal_pos \<open>I \<noteq> {}\<close> |
|
796 intro!: suminf_SUP_eq_directed) |
|
797 qed (simp add: bot_ennreal) |
|
798 |
|
799 lemma ennreal_eq_zero_iff[simp]: "0 \<le> x \<Longrightarrow> ennreal x = 0 \<longleftrightarrow> x = 0" |
|
800 by transfer (auto simp: max_absorb2) |
|
801 |
|
802 lemma ennreal_neq_top[simp]: "ennreal r \<noteq> top" |
|
803 by transfer (simp add: top_ereal_def zero_ereal_def ereal_max[symmetric] del: ereal_max) |
|
804 |
|
805 lemma ennreal_of_nat_neq_top[simp]: "of_nat i \<noteq> (top::ennreal)" |
|
806 by (induction i) auto |
|
807 |
|
808 lemma ennreal_suminf_neq_top: "summable f \<Longrightarrow> (\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top" |
|
809 using sums_ennreal[of f "suminf f"] |
|
810 by (simp add: suminf_nonneg sums_unique[symmetric] summable_sums_iff[symmetric] del: sums_ennreal) |
|
811 |
|
812 instance ennreal :: semiring_char_0 |
|
813 proof (standard, safe intro!: linorder_injI) |
|
814 have *: "1 + of_nat k \<noteq> (0::ennreal)" for k |
|
815 using add_pos_nonneg[OF zero_less_one, of "of_nat k :: ennreal"] by auto |
|
816 fix x y :: nat assume "x < y" "of_nat x = (of_nat y::ennreal)" then show False |
|
817 by (auto simp add: less_iff_Suc_add *) |
|
818 qed |
|
819 |
|
820 lemma ennreal_suminf_lessD: "(\<Sum>i. f i :: ennreal) < x \<Longrightarrow> f i < x" |
|
821 using le_less_trans[OF setsum_le_suminf[OF summableI, of "{i}" f]] by simp |
|
822 |
|
823 lemma ennreal_less_top[simp]: "ennreal x < top" |
|
824 by transfer (simp add: top_ereal_def max_def) |
|
825 |
|
826 lemma ennreal_le_epsilon: |
|
827 "(\<And>e::real. y < top \<Longrightarrow> 0 < e \<Longrightarrow> x \<le> y + ennreal e) \<Longrightarrow> x \<le> y" |
|
828 apply (cases y rule: ennreal_cases) |
|
829 apply (cases x rule: ennreal_cases) |
|
830 apply (auto simp del: ennreal_plus simp add: top_unique ennreal_plus[symmetric] |
|
831 intro: zero_less_one field_le_epsilon) |
|
832 done |
|
833 |
|
834 lemma ennreal_less_zero_iff[simp]: "0 < ennreal x \<longleftrightarrow> 0 < x" |
|
835 by transfer (auto simp: max_def) |
|
836 |
|
837 lemma suminf_ennreal_eq: |
|
838 "(\<And>i. 0 \<le> f i) \<Longrightarrow> f sums x \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal x" |
|
839 using suminf_nonneg[of f] sums_unique[of f x] |
|
840 by (intro sums_unique[symmetric]) (auto simp: summable_sums_iff) |
|
841 |
|
842 lemma transfer_e2ennreal_sumset [transfer_rule]: |
|
843 "rel_fun (rel_fun op = pcr_ennreal) (rel_fun op = pcr_ennreal) setsum setsum" |
|
844 by (auto intro!: rel_funI simp: rel_fun_eq_pcr_ennreal comp_def) |
|
845 |
|
846 lemma ennreal_suminf_bound_add: |
|
847 fixes f :: "nat \<Rightarrow> ennreal" |
|
848 shows "(\<And>N. (\<Sum>n<N. f n) + y \<le> x) \<Longrightarrow> suminf f + y \<le> x" |
|
849 by transfer (auto intro!: suminf_bound_add) |
|
850 |
|
851 lemma divide_right_mono_ennreal: |
|
852 fixes a b c :: ennreal |
|
853 shows "a \<le> b \<Longrightarrow> a / c \<le> b / c" |
|
854 unfolding divide_ennreal_def by (intro mult_mono) auto |
|
855 |
|
856 lemma SUP_mult_left_ennreal: "c * (SUP i:I. f i) = (SUP i:I. c * f i ::ennreal)" |
|
857 proof cases |
|
858 assume "I \<noteq> {}" then show ?thesis |
|
859 by transfer (auto simp add: SUP_ereal_mult_left max_absorb2 SUP_upper2) |
|
860 qed (simp add: bot_ennreal) |
|
861 |
|
862 lemma SUP_mult_right_ennreal: "(SUP i:I. f i) * c = (SUP i:I. f i * c ::ennreal)" |
|
863 using SUP_mult_left_ennreal by (simp add: mult.commute) |
|
864 |
|
865 lemma SUP_divide_ennreal: "(SUP i:I. f i) / c = (SUP i:I. f i / c ::ennreal)" |
|
866 using SUP_mult_right_ennreal by (simp add: divide_ennreal_def) |
|
867 |
|
868 lemma of_nat_Sup_ennreal: |
|
869 assumes "A \<noteq> {}" "bdd_above A" |
|
870 shows "of_nat (Sup A) = (SUP a:A. of_nat a :: ennreal)" |
|
871 proof (intro antisym) |
|
872 show "(SUP a:A. of_nat a::ennreal) \<le> of_nat (Sup A)" |
|
873 by (intro SUP_least of_nat_mono) (auto intro: cSup_upper assms) |
|
874 have "Sup A \<in> A" |
|
875 unfolding Sup_nat_def using assms by (intro Max_in) (auto simp: bdd_above_nat) |
|
876 then show "of_nat (Sup A) \<le> (SUP a:A. of_nat a::ennreal)" |
|
877 by (intro SUP_upper) |
|
878 qed |
|
879 |
|
880 lemma mult_divide_eq_ennreal: |
|
881 fixes a b :: ennreal |
|
882 shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a" |
|
883 unfolding divide_ennreal_def |
|
884 apply transfer |
|
885 apply (subst mult.assoc) |
|
886 apply (simp add: top_ereal_def divide_ereal_def[symmetric]) |
|
887 done |
|
888 |
|
889 lemma divide_mult_eq: "a \<noteq> 0 \<Longrightarrow> a \<noteq> \<infinity> \<Longrightarrow> x * a / (b * a) = x / (b::ennreal)" |
|
890 unfolding divide_ennreal_def infinity_ennreal_def |
|
891 apply transfer |
|
892 subgoal for a b c |
|
893 apply (cases a b c rule: ereal3_cases) |
|
894 apply (auto simp: top_ereal_def) |
|
895 done |
|
896 done |
|
897 |
|
898 lemma ennreal_power: "0 \<le> r \<Longrightarrow> ennreal r ^ n = ennreal (r ^ n)" |
|
899 by (induction n) (auto simp: ennreal_mult) |
|
900 |
|
901 lemma top_power_ennreal: "top ^ n = (if n = 0 then 1 else top :: ennreal)" |
|
902 by (induction n) (simp_all add: ennreal_mult_eq_top_iff) |
|
903 |
|
904 lemma power_eq_top_ennreal: "x ^ n = top \<longleftrightarrow> (n \<noteq> 0 \<and> (x::ennreal) = top)" |
|
905 by (cases x rule: ennreal_cases) |
|
906 (auto simp: ennreal_power top_power_ennreal) |
|
907 |
|
908 lemma ennreal_mult_divide_eq: |
|
909 fixes a b :: ennreal |
|
910 shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a" |
|
911 unfolding divide_ennreal_def |
|
912 apply transfer |
|
913 apply (subst mult.assoc) |
|
914 apply (simp add: top_ereal_def divide_ereal_def[symmetric]) |
|
915 done |
|
916 |
|
917 lemma enn2ereal_of_nat[simp]: "enn2ereal (of_nat n) = ereal n" |
|
918 by (induction n) (auto simp: zero_ennreal.rep_eq one_ennreal.rep_eq plus_ennreal.rep_eq) |
|
919 |
|
920 lemma enn2ereal_numeral[simp]: "enn2ereal (numeral a) = numeral a" |
|
921 apply (subst of_nat_numeral[of a, symmetric]) |
|
922 apply (subst enn2ereal_of_nat) |
|
923 apply simp |
|
924 done |
|
925 |
|
926 lemma transfer_numeral[transfer_rule]: "pcr_ennreal (numeral a) (numeral a)" |
|
927 unfolding cr_ennreal_def pcr_ennreal_def by auto |
|
928 |
|
929 lemma ennreal_half[simp]: "ennreal (1/2) = inverse 2" |
|
930 by transfer (simp add: max.absorb2) |
|
931 |
|
932 lemma numeral_eq_of_nat: "(numeral a::ennreal) = of_nat (numeral a)" |
|
933 by simp |
|
934 |
|
935 lemma of_nat_less_top: "of_nat i < (top::ennreal)" |
|
936 using less_le_trans[of "of_nat i" "of_nat (Suc i)" "top::ennreal"] |
|
937 by simp |
|
938 |
|
939 lemma top_neq_numeral[simp]: "top \<noteq> ((numeral i)::ennreal)" |
|
940 using of_nat_less_top[of "numeral i"] by simp |
|
941 |
|
942 lemma sup_continuous_mult_left_ennreal': |
|
943 fixes c :: "ennreal" |
|
944 shows "sup_continuous (\<lambda>x. c * x)" |
|
945 unfolding sup_continuous_def |
|
946 by transfer (auto simp: SUP_ereal_mult_left max.absorb2 SUP_upper2) |
|
947 |
|
948 lemma sup_continuous_mult_left_ennreal[order_continuous_intros]: |
|
949 "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. c * f x :: ennreal)" |
|
950 by (rule sup_continuous_compose[OF sup_continuous_mult_left_ennreal']) |
|
951 |
|
952 lemma sup_continuous_mult_right_ennreal[order_continuous_intros]: |
|
953 "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x * c :: ennreal)" |
|
954 using sup_continuous_mult_left_ennreal[of f c] by (simp add: mult.commute) |
|
955 |
|
956 lemma sup_continuous_divide_ennreal[order_continuous_intros]: |
|
957 fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal" |
|
958 shows "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x / c)" |
|
959 unfolding divide_ennreal_def by (rule sup_continuous_mult_right_ennreal) |
|
960 |
|
961 lemma ennreal_add_bot[simp]: "bot + x = (x::ennreal)" |
|
962 by transfer simp |
|
963 |
|
964 lemma sup_continuous_transfer[transfer_rule]: |
|
965 "(rel_fun (rel_fun (op =) pcr_ennreal) op =) sup_continuous sup_continuous" |
|
966 proof (safe intro!: rel_funI dest!: rel_fun_eq_pcr_ennreal[THEN iffD1]) |
|
967 show "sup_continuous (enn2ereal \<circ> f) \<Longrightarrow> sup_continuous f" for f :: "'a \<Rightarrow> _" |
|
968 using sup_continuous_e2ennreal[of "enn2ereal \<circ> f"] by simp |
|
969 show "sup_continuous f \<Longrightarrow> sup_continuous (enn2ereal \<circ> f)" for f :: "'a \<Rightarrow> _" |
|
970 using sup_continuous_enn2ereal[of f] by (simp add: comp_def) |
|
971 qed |
|
972 |
|
973 lemma sup_continuous_add_ennreal[order_continuous_intros]: |
|
974 fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal" |
|
975 shows "sup_continuous f \<Longrightarrow> sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>x. f x + g x)" |
|
976 by transfer (auto intro!: sup_continuous_add) |
|
977 |
|
978 lemmas ennreal2_cases = ennreal_cases[case_product ennreal_cases] |
|
979 lemmas ennreal3_cases = ennreal_cases[case_product ennreal2_cases] |
|
980 |
|
981 lemma ennreal_minus_eq_0: |
|
982 "a - b = 0 \<Longrightarrow> a \<le> (b::ennreal)" |
|
983 apply transfer |
|
984 subgoal for a b |
|
985 apply (cases a b rule: ereal2_cases) |
|
986 apply (auto simp: zero_ereal_def ereal_max[symmetric] max.absorb2 simp del: ereal_max) |
|
987 done |
|
988 done |
|
989 |
|
990 lemma ennreal_mono_minus_cancel: |
|
991 fixes a b c :: ennreal |
|
992 shows "a - b \<le> a - c \<Longrightarrow> a < top \<Longrightarrow> b \<le> a \<Longrightarrow> c \<le> a \<Longrightarrow> c \<le> b" |
|
993 by transfer |
|
994 (auto simp add: max.absorb2 ereal_diff_positive top_ereal_def dest: ereal_mono_minus_cancel) |
|
995 |
|
996 lemma ennreal_mono_minus: |
|
997 fixes a b c :: ennreal |
|
998 shows "c \<le> b \<Longrightarrow> a - b \<le> a - c" |
|
999 apply transfer |
|
1000 apply (rule max.mono) |
|
1001 apply simp |
|
1002 subgoal for a b c |
|
1003 by (cases a b c rule: ereal3_cases) auto |
|
1004 done |
|
1005 |
|
1006 lemma ennreal_minus_pos_iff: |
|
1007 fixes a b :: ennreal |
|
1008 shows "a < top \<or> b < top \<Longrightarrow> 0 < a - b \<Longrightarrow> b < a" |
|
1009 apply transfer |
|
1010 subgoal for a b |
|
1011 by (cases a b rule: ereal2_cases) (auto simp: less_max_iff_disj) |
|
1012 done |
|
1013 |
|
1014 lemma ennreal_SUP_add: |
1505 lemma ennreal_SUP_add: |
1015 fixes f g :: "nat \<Rightarrow> ennreal" |
1506 fixes f g :: "nat \<Rightarrow> ennreal" |
1016 shows "incseq f \<Longrightarrow> incseq g \<Longrightarrow> (SUP i. f i + g i) = SUPREMUM UNIV f + SUPREMUM UNIV g" |
1507 shows "incseq f \<Longrightarrow> incseq g \<Longrightarrow> (SUP i. f i + g i) = SUPREMUM UNIV f + SUPREMUM UNIV g" |
1017 unfolding incseq_def le_fun_def |
1508 unfolding incseq_def le_fun_def |
1018 by transfer |
1509 by transfer |
1019 (simp add: SUP_ereal_add incseq_def le_fun_def max_absorb2 SUP_upper2) |
1510 (simp add: SUP_ereal_add incseq_def le_fun_def max_absorb2 SUP_upper2) |
1020 |
1511 |
1021 lemma ennreal_top_mult: "top * a = (if a = 0 then 0 else top :: ennreal)" |
|
1022 by (simp add: ennreal_mult_eq_top_iff) |
|
1023 |
|
1024 lemma ennreal_mult_top: "a * top = (if a = 0 then 0 else top :: ennreal)" |
|
1025 by (simp add: ennreal_mult_eq_top_iff) |
|
1026 |
|
1027 lemma ennreal_less: "0 \<le> r \<Longrightarrow> ennreal r < ennreal q \<longleftrightarrow> r < q" |
|
1028 unfolding not_le[symmetric] by auto |
|
1029 |
|
1030 lemma ennreal_numeral_less_top[simp]: "numeral i < (top::ennreal)" |
|
1031 using of_nat_less_top[of "numeral i"] by simp |
|
1032 |
|
1033 lemma real_of_nat_Sup: |
|
1034 assumes "A \<noteq> {}" "bdd_above A" |
|
1035 shows "of_nat (Sup A) = (SUP a:A. of_nat a :: real)" |
|
1036 proof (intro antisym) |
|
1037 show "(SUP a:A. of_nat a::real) \<le> of_nat (Sup A)" |
|
1038 using assms by (intro cSUP_least of_nat_mono) (auto intro: cSup_upper) |
|
1039 have "Sup A \<in> A" |
|
1040 unfolding Sup_nat_def using assms by (intro Max_in) (auto simp: bdd_above_nat) |
|
1041 then show "of_nat (Sup A) \<le> (SUP a:A. of_nat a::real)" |
|
1042 by (intro cSUP_upper bdd_above_image_mono assms) (auto simp: mono_def) |
|
1043 qed |
|
1044 |
|
1045 definition "enn2real x = real_of_ereal (enn2ereal x)" |
|
1046 |
|
1047 lemma enn2real_nonneg: "0 \<le> enn2real x" |
|
1048 by (auto simp: enn2real_def intro!: real_of_ereal_pos enn2ereal_nonneg) |
|
1049 |
|
1050 lemma enn2real_mono: "a \<le> b \<Longrightarrow> b < top \<Longrightarrow> enn2real a \<le> enn2real b" |
|
1051 by (auto simp add: enn2real_def less_eq_ennreal.rep_eq intro!: real_of_ereal_positive_mono enn2ereal_nonneg) |
|
1052 |
|
1053 lemma enn2real_of_nat[simp]: "enn2real (of_nat n) = n" |
|
1054 by (auto simp: enn2real_def) |
|
1055 |
|
1056 lemma enn2real_ennreal[simp]: "0 \<le> r \<Longrightarrow> enn2real (ennreal r) = r" |
|
1057 by (simp add: enn2real_def) |
|
1058 |
|
1059 lemma of_nat_le_ennreal_iff[simp]: "0 \<le> r \<Longrightarrow> of_nat i \<le> ennreal r \<longleftrightarrow> of_nat i \<le> r" |
|
1060 by (simp add: ennreal_of_nat_eq_real_of_nat) |
|
1061 |
|
1062 lemma min_ennreal: "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> min (ennreal x) (ennreal y) = ennreal (min x y)" |
|
1063 by (auto split: split_min) |
|
1064 |
|
1065 lemma ennreal_approx_unit: |
|
1066 "(\<And>a::ennreal. 0 < a \<Longrightarrow> a < 1 \<Longrightarrow> a * z \<le> y) \<Longrightarrow> z \<le> y" |
|
1067 apply (subst SUP_mult_right_ennreal[of "\<lambda>x. x" "{0 <..< 1}" z, simplified]) |
|
1068 apply (rule SUP_least) |
|
1069 apply auto |
|
1070 done |
|
1071 |
|
1072 lemma ennreal_mult_strict_right_mono: "(a::ennreal) < c \<Longrightarrow> 0 < b \<Longrightarrow> b < top \<Longrightarrow> a * b < c * b" |
|
1073 by transfer (auto intro!: ereal_mult_strict_right_mono) |
|
1074 |
|
1075 lemma ennreal_SUP_setsum: |
1512 lemma ennreal_SUP_setsum: |
1076 fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal" |
1513 fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal" |
1077 shows "(\<And>i. i \<in> I \<Longrightarrow> incseq (f i)) \<Longrightarrow> (SUP n. \<Sum>i\<in>I. f i n) = (\<Sum>i\<in>I. SUP n. f i n)" |
1514 shows "(\<And>i. i \<in> I \<Longrightarrow> incseq (f i)) \<Longrightarrow> (SUP n. \<Sum>i\<in>I. f i n) = (\<Sum>i\<in>I. SUP n. f i n)" |
1078 unfolding incseq_def |
1515 unfolding incseq_def |
1079 by transfer |
1516 by transfer |
1080 (simp add: SUP_ereal_setsum incseq_def SUP_upper2 max_absorb2 setsum_nonneg) |
1517 (simp add: SUP_ereal_setsum incseq_def SUP_upper2 max_absorb2 setsum_nonneg) |
1081 |
1518 |
1082 lemma ennreal_indicator_less[simp]: |
|
1083 "indicator A x \<le> (indicator B x::ennreal) \<longleftrightarrow> (x \<in> A \<longrightarrow> x \<in> B)" |
|
1084 by (simp add: indicator_def not_le) |
|
1085 |
|
1086 lemma rel_fun_liminf[transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal liminf liminf" |
|
1087 proof - |
|
1088 have "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal (\<lambda>x. sup 0 (liminf x)) liminf" |
|
1089 unfolding liminf_SUP_INF[abs_def] by (transfer_prover_start, transfer_step+; simp) |
|
1090 then show ?thesis |
|
1091 apply (subst (asm) (2) rel_fun_def) |
|
1092 apply (subst (2) rel_fun_def) |
|
1093 apply (auto simp: comp_def max.absorb2 Liminf_bounded enn2ereal_nonneg rel_fun_eq_pcr_ennreal) |
|
1094 done |
|
1095 qed |
|
1096 |
|
1097 lemma rel_fun_limsup[transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal limsup limsup" |
|
1098 proof - |
|
1099 have "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal (\<lambda>x. INF n. sup 0 (SUP i:{n..}. x i)) limsup" |
|
1100 unfolding limsup_INF_SUP[abs_def] by (transfer_prover_start, transfer_step+; simp) |
|
1101 then show ?thesis |
|
1102 unfolding limsup_INF_SUP[abs_def] |
|
1103 apply (subst (asm) (2) rel_fun_def) |
|
1104 apply (subst (2) rel_fun_def) |
|
1105 apply (auto simp: comp_def max.absorb2 Sup_upper2 enn2ereal_nonneg rel_fun_eq_pcr_ennreal) |
|
1106 apply (subst (asm) max.absorb2) |
|
1107 apply (rule SUP_upper2) |
|
1108 apply (auto simp: enn2ereal_nonneg) |
|
1109 done |
|
1110 qed |
|
1111 |
|
1112 lemma ennreal_liminf_minus: |
1519 lemma ennreal_liminf_minus: |
1113 fixes f :: "nat \<Rightarrow> ennreal" |
1520 fixes f :: "nat \<Rightarrow> ennreal" |
1114 shows "(\<And>n. f n \<le> c) \<Longrightarrow> liminf (\<lambda>n. c - f n) = c - limsup f" |
1521 shows "(\<And>n. f n \<le> c) \<Longrightarrow> liminf (\<lambda>n. c - f n) = c - limsup f" |
1115 apply transfer |
1522 apply transfer |
1116 apply (simp add: ereal_diff_positive max.absorb2 liminf_ereal_cminus) |
1523 apply (simp add: ereal_diff_positive max.absorb2 liminf_ereal_cminus) |
1118 apply (rule ereal_diff_positive) |
1525 apply (rule ereal_diff_positive) |
1119 apply (rule Limsup_bounded) |
1526 apply (rule Limsup_bounded) |
1120 apply auto |
1527 apply auto |
1121 done |
1528 done |
1122 |
1529 |
1123 lemma inverse_ennreal: "0 < r \<Longrightarrow> inverse (ennreal r) = ennreal (inverse r)" |
1530 lemma ennreal_continuous_on_cmult: |
1124 by transfer (simp add: max.absorb2) |
1531 "(c::ennreal) < top \<Longrightarrow> continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. c * f x)" |
1125 |
1532 by (transfer fixing: A) (auto intro: continuous_on_cmult_ereal) |
1126 lemma divide_ennreal: "0 \<le> r \<Longrightarrow> 0 < q \<Longrightarrow> ennreal r / ennreal q = ennreal (r / q)" |
1533 |
1127 by (simp add: divide_ennreal_def inverse_ennreal ennreal_mult[symmetric] inverse_eq_divide) |
1534 lemma ennreal_tendsto_cmult: |
1128 |
1535 "(c::ennreal) < top \<Longrightarrow> (f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. c * f x) \<longlongrightarrow> c * x) F" |
1129 lemma ennreal_inverse_top[simp]: "inverse top = (0::ennreal)" |
1536 by (rule continuous_on_tendsto_compose[where g=f, OF ennreal_continuous_on_cmult, where s=UNIV]) |
1130 by transfer (simp add: top_ereal_def ereal_inverse_eq_0) |
1537 (auto simp: continuous_on_id) |
1131 |
1538 |
1132 lemma ennreal_inverse_zero[simp]: "inverse 0 = (top::ennreal)" |
1539 lemma tendsto_ennrealI[intro, simp]: |
1133 by transfer (simp add: top_ereal_def ereal_inverse_eq_0) |
1540 "(f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F" |
1134 |
1541 by (auto simp: ennreal_def |
1135 lemma ennreal_top_divide: "top / (x::ennreal) = (if x = top then 0 else top)" |
1542 intro!: continuous_on_tendsto_compose[OF continuous_on_e2ennreal[of UNIV]] tendsto_max) |
1136 unfolding divide_ennreal_def |
1543 |
1137 by transfer (simp add: top_ereal_def ereal_inverse_eq_0 ereal_0_gt_inverse) |
1544 lemma ennreal_suminf_minus: |
1138 |
1545 fixes f g :: "nat \<Rightarrow> ennreal" |
1139 lemma ennreal_zero_divide[simp]: "0 / (x::ennreal) = 0" |
1546 shows "(\<And>i. g i \<le> f i) \<Longrightarrow> suminf f \<noteq> top \<Longrightarrow> suminf g \<noteq> top \<Longrightarrow> (\<Sum>i. f i - g i) = suminf f - suminf g" |
1140 by (simp add: divide_ennreal_def) |
1547 by transfer |
1141 |
1548 (auto simp add: max.absorb2 ereal_diff_positive suminf_le_pos top_ereal_def intro!: suminf_ereal_minus) |
1142 lemma ennreal_divide_zero[simp]: "x / (0::ennreal) = (if x = 0 then 0 else top)" |
1549 |
1143 by (simp add: divide_ennreal_def ennreal_mult_top) |
1550 lemma ennreal_Sup_countable_SUP: |
1144 |
1551 "A \<noteq> {} \<Longrightarrow> \<exists>f::nat \<Rightarrow> ennreal. incseq f \<and> range f \<subseteq> A \<and> Sup A = (SUP i. f i)" |
1145 lemma ennreal_divide_top[simp]: "x / (top::ennreal) = 0" |
1552 unfolding incseq_def |
1146 by (simp add: divide_ennreal_def ennreal_top_mult) |
1553 apply transfer |
1147 |
1554 subgoal for A |
1148 lemma ennreal_times_divide: "a * (b / c) = a * b / (c::ennreal)" |
1555 using Sup_countable_SUP[of A] |
1149 unfolding divide_ennreal_def |
1556 apply (clarsimp simp add: incseq_def[symmetric] SUP_upper2 max.absorb2 image_subset_iff Sup_upper2 cong: conj_cong) |
1150 by transfer (simp add: divide_ereal_def[symmetric] ereal_times_divide_eq) |
1557 subgoal for f |
1151 |
1558 by (intro exI[of _ f]) auto |
1152 lemma ennreal_zero_less_divide: "0 < a / b \<longleftrightarrow> (0 < a \<and> b < (top::ennreal))" |
1559 done |
1153 unfolding divide_ennreal_def |
1560 done |
1154 by transfer (auto simp: ereal_zero_less_0_iff top_ereal_def ereal_0_gt_inverse) |
1561 |
|
1562 lemma ennreal_SUP_countable_SUP: |
|
1563 "A \<noteq> {} \<Longrightarrow> \<exists>f::nat \<Rightarrow> ennreal. range f \<subseteq> g`A \<and> SUPREMUM A g = SUPREMUM UNIV f" |
|
1564 using ennreal_Sup_countable_SUP [of "g`A"] by auto |
|
1565 |
|
1566 lemma of_nat_tendsto_top_ennreal: "(\<lambda>n::nat. of_nat n :: ennreal) \<longlonglongrightarrow> top" |
|
1567 using LIMSEQ_SUP[of "of_nat :: nat \<Rightarrow> ennreal"] |
|
1568 by (simp add: ennreal_SUP_of_nat_eq_top incseq_def) |
|
1569 |
|
1570 lemma SUP_sup_continuous_ennreal: |
|
1571 fixes f :: "ennreal \<Rightarrow> 'a::complete_lattice" |
|
1572 assumes f: "sup_continuous f" and "I \<noteq> {}" |
|
1573 shows "(SUP i:I. f (g i)) = f (SUP i:I. g i)" |
|
1574 proof (rule antisym) |
|
1575 show "(SUP i:I. f (g i)) \<le> f (SUP i:I. g i)" |
|
1576 by (rule mono_SUP[OF sup_continuous_mono[OF f]]) |
|
1577 from ennreal_Sup_countable_SUP[of "g`I"] \<open>I \<noteq> {}\<close> |
|
1578 obtain M :: "nat \<Rightarrow> ennreal" where "incseq M" and M: "range M \<subseteq> g ` I" and eq: "(SUP i : I. g i) = (SUP i. M i)" |
|
1579 by auto |
|
1580 have "f (SUP i : I. g i) = (SUP i : range M. f i)" |
|
1581 unfolding eq sup_continuousD[OF f \<open>mono M\<close>] by simp |
|
1582 also have "\<dots> \<le> (SUP i : I. f (g i))" |
|
1583 by (insert M, drule SUP_subset_mono) auto |
|
1584 finally show "f (SUP i : I. g i) \<le> (SUP i : I. f (g i))" . |
|
1585 qed |
|
1586 |
|
1587 lemma ennreal_suminf_SUP_eq: |
|
1588 fixes f :: "nat \<Rightarrow> nat \<Rightarrow> ennreal" |
|
1589 shows "(\<And>i. incseq (\<lambda>n. f n i)) \<Longrightarrow> (\<Sum>i. SUP n. f n i) = (SUP n. \<Sum>i. f n i)" |
|
1590 apply (rule ennreal_suminf_SUP_eq_directed) |
|
1591 subgoal for N n j |
|
1592 by (auto simp: incseq_def intro!:exI[of _ "max n j"]) |
|
1593 done |
|
1594 |
|
1595 lemma ennreal_SUP_add_left: |
|
1596 fixes c :: ennreal |
|
1597 shows "I \<noteq> {} \<Longrightarrow> (SUP i:I. f i + c) = (SUP i:I. f i) + c" |
|
1598 apply transfer |
|
1599 apply (simp add: SUP_ereal_add_left) |
|
1600 apply (subst (1 2) max.absorb2) |
|
1601 apply (auto intro: SUP_upper2 ereal_add_nonneg_nonneg) |
|
1602 done |
|
1603 |
|
1604 lemma ennreal_SUP_const_minus: |
|
1605 fixes f :: "'a \<Rightarrow> ennreal" |
|
1606 shows "I \<noteq> {} \<Longrightarrow> c < top \<Longrightarrow> (INF x:I. c - f x) = c - (SUP x:I. f x)" |
|
1607 apply (transfer fixing: I) |
|
1608 unfolding ex_in_conv[symmetric] |
|
1609 apply (auto simp add: sup_max[symmetric] SUP_upper2 sup_absorb2 |
|
1610 simp del: sup_ereal_def) |
|
1611 apply (subst INF_ereal_minus_right[symmetric]) |
|
1612 apply (auto simp del: sup_ereal_def simp add: sup_INF) |
|
1613 done |
|
1614 |
|
1615 subsection \<open>Approximation lemmas\<close> |
|
1616 |
|
1617 lemma INF_approx_ennreal: |
|
1618 fixes x::ennreal and e::real |
|
1619 assumes "e > 0" |
|
1620 assumes INF: "x = (INF i : A. f i)" |
|
1621 assumes "x \<noteq> \<infinity>" |
|
1622 shows "\<exists>i \<in> A. f i < x + e" |
|
1623 proof - |
|
1624 have "(INF i : A. f i) < x + e" |
|
1625 unfolding INF[symmetric] using \<open>0<e\<close> \<open>x \<noteq> \<infinity>\<close> by (cases x) auto |
|
1626 then show ?thesis |
|
1627 unfolding INF_less_iff . |
|
1628 qed |
|
1629 |
|
1630 lemma SUP_approx_ennreal: |
|
1631 fixes x::ennreal and e::real |
|
1632 assumes "e > 0" "A \<noteq> {}" |
|
1633 assumes SUP: "x = (SUP i : A. f i)" |
|
1634 assumes "x \<noteq> \<infinity>" |
|
1635 shows "\<exists>i \<in> A. x < f i + e" |
|
1636 proof - |
|
1637 have "x < x + e" |
|
1638 using \<open>0<e\<close> \<open>x \<noteq> \<infinity>\<close> by (cases x) auto |
|
1639 also have "x + e = (SUP i : A. f i + e)" |
|
1640 unfolding SUP ennreal_SUP_add_left[OF \<open>A \<noteq> {}\<close>] .. |
|
1641 finally show ?thesis |
|
1642 unfolding less_SUP_iff . |
|
1643 qed |
|
1644 |
|
1645 lemma ennreal_approx_SUP: |
|
1646 fixes x::ennreal |
|
1647 assumes f_bound: "\<And>i. i \<in> A \<Longrightarrow> f i \<le> x" |
|
1648 assumes approx: "\<And>e. (e::real) > 0 \<Longrightarrow> \<exists>i \<in> A. x \<le> f i + e" |
|
1649 shows "x = (SUP i : A. f i)" |
|
1650 proof (rule antisym) |
|
1651 show "x \<le> (SUP i:A. f i)" |
|
1652 proof (rule ennreal_le_epsilon) |
|
1653 fix e :: real assume "0 < e" |
|
1654 from approx[OF this] guess i .. |
|
1655 then have "x \<le> f i + e" |
|
1656 by simp |
|
1657 also have "\<dots> \<le> (SUP i:A. f i) + e" |
|
1658 by (intro add_mono \<open>i \<in> A\<close> SUP_upper order_refl) |
|
1659 finally show "x \<le> (SUP i:A. f i) + e" . |
|
1660 qed |
|
1661 qed (intro SUP_least f_bound) |
|
1662 |
|
1663 lemma ennreal_approx_INF: |
|
1664 fixes x::ennreal |
|
1665 assumes f_bound: "\<And>i. i \<in> A \<Longrightarrow> x \<le> f i" |
|
1666 assumes approx: "\<And>e. (e::real) > 0 \<Longrightarrow> \<exists>i \<in> A. f i \<le> x + e" |
|
1667 shows "x = (INF i : A. f i)" |
|
1668 proof (rule antisym) |
|
1669 show "(INF i:A. f i) \<le> x" |
|
1670 proof (rule ennreal_le_epsilon) |
|
1671 fix e :: real assume "0 < e" |
|
1672 from approx[OF this] guess i .. note i = this |
|
1673 then have "(INF i:A. f i) \<le> f i" |
|
1674 by (intro INF_lower) |
|
1675 also have "\<dots> \<le> x + e" |
|
1676 by fact |
|
1677 finally show "(INF i:A. f i) \<le> x + e" . |
|
1678 qed |
|
1679 qed (intro INF_greatest f_bound) |
|
1680 |
|
1681 lemma ennreal_approx_unit: |
|
1682 "(\<And>a::ennreal. 0 < a \<Longrightarrow> a < 1 \<Longrightarrow> a * z \<le> y) \<Longrightarrow> z \<le> y" |
|
1683 apply (subst SUP_mult_right_ennreal[of "\<lambda>x. x" "{0 <..< 1}" z, simplified]) |
|
1684 apply (rule SUP_least) |
|
1685 apply auto |
|
1686 done |
|
1687 |
|
1688 lemma suminf_ennreal2: |
|
1689 "(\<And>i. 0 \<le> f i) \<Longrightarrow> summable f \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal (\<Sum>i. f i)" |
|
1690 using suminf_ennreal_eq by blast |
|
1691 |
|
1692 lemma less_top_ennreal: "x < top \<longleftrightarrow> (\<exists>r\<ge>0. x = ennreal r)" |
|
1693 by (cases x) auto |
|
1694 |
|
1695 lemma tendsto_top_iff_ennreal: |
|
1696 fixes f :: "'a \<Rightarrow> ennreal" |
|
1697 shows "(f \<longlongrightarrow> top) F \<longleftrightarrow> (\<forall>l\<ge>0. eventually (\<lambda>x. ennreal l < f x) F)" |
|
1698 by (auto simp: less_top_ennreal order_tendsto_iff ) |
|
1699 |
|
1700 lemma ennreal_tendsto_top_eq_at_top: |
|
1701 "((\<lambda>z. ennreal (f z)) \<longlongrightarrow> top) F \<longleftrightarrow> (LIM z F. f z :> at_top)" |
|
1702 unfolding filterlim_at_top_dense tendsto_top_iff_ennreal |
|
1703 apply (auto simp: ennreal_less_iff) |
|
1704 subgoal for y |
|
1705 by (auto elim!: eventually_mono allE[of _ "max 0 y"]) |
|
1706 done |
|
1707 |
|
1708 lemma tendsto_0_if_Limsup_eq_0_ennreal: |
|
1709 fixes f :: "_ \<Rightarrow> ennreal" |
|
1710 shows "Limsup F f = 0 \<Longrightarrow> (f \<longlongrightarrow> 0) F" |
|
1711 using Liminf_le_Limsup[of F f] tendsto_iff_Liminf_eq_Limsup[of F f 0] |
|
1712 by (cases "F = bot") auto |
|
1713 |
|
1714 lemma diff_le_self_ennreal[simp]: "a - b \<le> (a::ennreal)" |
|
1715 by (cases a b rule: ennreal2_cases) (auto simp: ennreal_minus) |
|
1716 |
|
1717 lemma ennreal_ineq_diff_add: "b \<le> a \<Longrightarrow> a = b + (a - b::ennreal)" |
|
1718 by transfer (auto simp: ereal_diff_positive max.absorb2 ereal_ineq_diff_add) |
|
1719 |
|
1720 lemma ennreal_mult_strict_left_mono: "(a::ennreal) < c \<Longrightarrow> 0 < b \<Longrightarrow> b < top \<Longrightarrow> b * a < b * c" |
|
1721 by transfer (auto intro!: ereal_mult_strict_left_mono) |
|
1722 |
|
1723 lemma ennreal_between: "0 < e \<Longrightarrow> 0 < x \<Longrightarrow> x < top \<Longrightarrow> x - e < (x::ennreal)" |
|
1724 by transfer (auto intro!: ereal_between) |
|
1725 |
|
1726 lemma minus_less_iff_ennreal: "b < top \<Longrightarrow> b \<le> a \<Longrightarrow> a - b < c \<longleftrightarrow> a < c + (b::ennreal)" |
|
1727 by transfer |
|
1728 (auto simp: top_ereal_def ereal_minus_less le_less) |
|
1729 |
|
1730 lemma tendsto_zero_ennreal: |
|
1731 assumes ev: "\<And>r. 0 < r \<Longrightarrow> \<forall>\<^sub>F x in F. f x < ennreal r" |
|
1732 shows "(f \<longlongrightarrow> 0) F" |
|
1733 proof (rule order_tendstoI) |
|
1734 fix e::ennreal assume "e > 0" |
|
1735 obtain e'::real where "e' > 0" "ennreal e' < e" |
|
1736 using `0 < e` dense[of 0 "if e = top then 1 else (enn2real e)"] |
|
1737 by (cases e) (auto simp: ennreal_less_iff) |
|
1738 from ev[OF \<open>e' > 0\<close>] show "\<forall>\<^sub>F x in F. f x < e" |
|
1739 by eventually_elim (insert \<open>ennreal e' < e\<close>, auto) |
|
1740 qed simp |
|
1741 |
|
1742 lifting_update ennreal.lifting |
|
1743 lifting_forget ennreal.lifting |
1155 |
1744 |
1156 end |
1745 end |