# HG changeset patch # User paulson # Date 1598994087 -3600 # Node ID 11b81cd7063351804aea09bf12af6aee7199662e # Parent 6b620d91e8cc9b27ace1775c1b1d283ee122d7d9 de-applying diff -r 6b620d91e8cc -r 11b81cd70633 src/HOL/Library/Extended_Nonnegative_Real.thy --- a/src/HOL/Library/Extended_Nonnegative_Real.thy Mon Aug 31 17:18:47 2020 +0100 +++ b/src/HOL/Library/Extended_Nonnegative_Real.thy Tue Sep 01 22:01:27 2020 +0100 @@ -174,16 +174,8 @@ using SUP_sup_distrib[of f I "\_. c"] by simp lemma one_less_of_natD: - "(1::'a::linordered_semidom) < of_nat n \ 1 < n" - using zero_le_one[where 'a='a] - apply (cases n) - apply simp - subgoal for n' - apply (cases n') - apply simp - apply simp - done - done + assumes "(1::'a::linordered_semidom) < of_nat n" shows "1 < n" + by (cases n) (use assms in auto) subsection \Defining the extended non-negative reals\ @@ -353,8 +345,7 @@ apply (subst (2) rel_fun_def) apply (auto simp: comp_def max.absorb2 Sup_upper2 rel_fun_eq_pcr_ennreal) apply (subst (asm) max.absorb2) - apply (rule SUP_upper2) - apply auto + apply (auto intro: SUP_upper2) done qed @@ -369,10 +360,7 @@ by (induction n) (auto simp: zero_ennreal.rep_eq one_ennreal.rep_eq plus_ennreal.rep_eq) lemma enn2ereal_numeral[simp]: "enn2ereal (numeral a) = numeral a" - apply (subst of_nat_numeral[of a, symmetric]) - apply (subst enn2ereal_of_nat) - apply simp - done + by (metis enn2ereal_of_nat numeral_eq_ereal of_nat_numeral) lemma transfer_numeral[transfer_rule]: "pcr_ennreal (numeral a) (numeral a)" unfolding cr_ennreal_def pcr_ennreal_def by auto @@ -543,10 +531,7 @@ by transfer (auto simp: top_ereal_def max_def) lemma minus_top_ennreal: "x - top = (if x = top then top else 0:: ennreal)" - apply transfer - subgoal for x - by (cases x) (auto simp: top_ereal_def max_def) - done + by transfer (use ereal_eq_minus_iff top_ereal_def in force) lemma bot_ennreal: "bot = (0::ennreal)" by transfer rule @@ -585,12 +570,7 @@ lemma ennreal_add_diff_cancel_right[simp]: fixes x y z :: ennreal shows "y \ top \ (x + y) - y = x" - apply transfer - subgoal for x y - apply (cases x y rule: ereal2_cases) - apply (auto split: split_max simp: top_ereal_def) - done - done + by transfer (metis ereal_eq_minus_iff max_absorb2 not_MInfty_nonneg top_ereal_def) lemma ennreal_add_diff_cancel_left[simp]: fixes x y z :: ennreal shows "y \ top \ (y + x) - y = x" @@ -599,12 +579,7 @@ lemma fixes a b :: ennreal shows "a - b = 0 \ a \ b" - apply transfer - subgoal for a b - apply (cases a b rule: ereal2_cases) - apply (auto simp: not_le max_def split: if_splits) - done - done + by transfer (metis ereal_diff_gr0 le_cases max.absorb2 not_less) lemma ennreal_minus_cancel: fixes a b c :: ennreal @@ -618,12 +593,7 @@ lemma sup_const_add_ennreal: fixes a b c :: "ennreal" shows "sup (c + a) (c + b) = c + sup a b" - apply transfer - subgoal for a b c - apply (cases a b c rule: ereal3_cases) - apply (auto simp flip: ereal_max) - done - done + by transfer (metis add_left_mono le_cases sup.absorb2 sup.orderE) lemma ennreal_diff_add_assoc: fixes a b c :: ennreal @@ -668,12 +638,7 @@ lemma ennreal_minus_eq_0: "a - b = 0 \ a \ (b::ennreal)" - apply transfer - subgoal for a b - apply (cases a b rule: ereal2_cases) - apply (auto simp: zero_ereal_def max.absorb2 simp flip: ereal_max) - done - done + by transfer (metis ereal_diff_gr0 le_cases max.absorb2 not_less) lemma ennreal_mono_minus_cancel: fixes a b c :: ennreal @@ -684,20 +649,12 @@ lemma ennreal_mono_minus: fixes a b c :: ennreal shows "c \ b \ a - b \ a - c" - apply transfer - apply (rule max.mono) - apply simp - subgoal for a b c - by (cases a b c rule: ereal3_cases) auto - done + by transfer (meson ereal_minus_mono max.mono order_refl) lemma ennreal_minus_pos_iff: fixes a b :: ennreal shows "a < top \ b < top \ 0 < a - b \ b < a" - apply transfer - subgoal for a b - by (cases a b rule: ereal2_cases) (auto simp: less_max_iff_disj) - done + by transfer (use add.left_neutral ereal_minus_le_iff less_irrefl not_less in fastforce) lemma ennreal_inverse_top[simp]: "inverse top = (0::ennreal)" by transfer (simp add: top_ereal_def ereal_inverse_eq_0) @@ -795,10 +752,7 @@ lemma diff_add_cancel_ennreal: fixes a b :: ennreal shows "a \ b \ b - a + a = b" unfolding infinity_ennreal_def - apply transfer - subgoal for a b - by (cases a b rule: ereal2_cases) (auto simp: max_absorb2) - done + by transfer (metis (no_types) add.commute ereal_diff_positive ereal_ineq_diff_add max_def not_MInfty_nonneg) lemma ennreal_diff_self[simp]: "a \ top \ a - a = (0::ennreal)" by transfer (simp add: top_ereal_def) @@ -806,12 +760,7 @@ lemma ennreal_minus_mono: fixes a b c :: ennreal shows "a \ c \ d \ b \ a - b \ c - d" - apply transfer - apply (rule max.mono) - apply simp - subgoal for a b c d - by (cases a b c d rule: ereal3_cases[case_product ereal_cases]) auto - done + by transfer (meson ereal_minus_mono max.mono order_refl) lemma ennreal_minus_eq_top[simp]: "a - (b::ennreal) = top \ a = top" by transfer (auto simp: top_ereal_def max.absorb2 ereal_minus_eq_PInfty_iff split: split_max) @@ -1035,10 +984,11 @@ (auto simp: ennreal_mult prod_nonneg) lemma mult_right_ennreal_cancel: "a * ennreal c = b * ennreal c \ (a = b \ c \ 0)" - apply (cases "0 \ c") - apply (cases a b rule: ennreal2_cases) - apply (auto simp: ennreal_mult[symmetric] ennreal_neg ennreal_top_mult) - done +proof (cases "0 \ c") + case True + then show ?thesis + by (metis ennreal_eq_0_iff ennreal_mult_right_cong ennreal_neq_top mult_divide_eq_ennreal) +qed (use ennreal_neg in auto) lemma ennreal_le_epsilon: "(\e::real. y < top \ 0 < e \ x \ y + ennreal e) \ x \ y" @@ -1246,17 +1196,17 @@ lemma sup_continuous_e2ennreal[order_continuous_intros]: assumes f: "sup_continuous f" shows "sup_continuous (\x. e2ennreal (f x))" - apply (rule sup_continuous_compose[OF _ f]) - apply (rule continuous_at_left_imp_sup_continuous) - apply (auto simp: mono_def e2ennreal_mono continuous_at_e2ennreal) - done +proof (rule sup_continuous_compose[OF _ f]) + show "sup_continuous e2ennreal" + by (simp add: continuous_at_e2ennreal continuous_at_left_imp_sup_continuous e2ennreal_mono mono_def) +qed lemma sup_continuous_enn2ereal[order_continuous_intros]: assumes f: "sup_continuous f" shows "sup_continuous (\x. enn2ereal (f x))" - apply (rule sup_continuous_compose[OF _ f]) - apply (rule continuous_at_left_imp_sup_continuous) - apply (simp_all add: mono_def less_eq_ennreal.rep_eq continuous_at_enn2ereal) - done +proof (rule sup_continuous_compose[OF _ f]) + show "sup_continuous enn2ereal" + by (simp add: continuous_at_enn2ereal continuous_at_left_imp_sup_continuous less_eq_ennreal.rep_eq mono_def) +qed lemma sup_continuous_mult_left_ennreal': fixes c :: "ennreal" @@ -1308,13 +1258,14 @@ assumes lim: "((\x. ennreal (f x)) \ ennreal x) F" assumes *: "\\<^sub>F x in F. 0 \ f x" and x: "0 \ x" shows "(f \ x) F" - using continuous_on_tendsto_compose[OF continuous_on_enn2ereal lim] - apply simp - apply (subst (asm) tendsto_cong) - using * - apply eventually_elim - apply (auto simp: max_absorb2 \0 \ x\) - done +proof - + have "((\x. enn2ereal (ennreal (f x))) \ enn2ereal (ennreal x)) F + \ (f \ enn2ereal (ennreal x)) F" + using "*" eventually_mono + by (intro tendsto_cong) fastforce + then show ?thesis + using assms(1) continuous_at_enn2ereal isCont_tendsto_compose x by fastforce +qed lemma tendsto_ennreal_iff[simp]: "\\<^sub>F x in F. 0 \ f x \ 0 \ x \ ((\x. ennreal (f x)) \ ennreal x) F \ (f \ x) F" @@ -1584,10 +1535,7 @@ apply transfer subgoal for A using Sup_countable_SUP[of A] - apply (clarsimp simp add: incseq_def[symmetric] SUP_upper2 max.absorb2 image_subset_iff Sup_upper2 cong: conj_cong) - subgoal for f - by (intro exI[of _ f]) auto - done + by (force simp add: incseq_def[symmetric] SUP_upper2 max.absorb2 image_subset_iff Sup_upper2 cong: conj_cong) done lemma ennreal_Inf_countable_INF: @@ -1645,13 +1593,12 @@ apply (auto intro: SUP_upper2 add_nonneg_nonneg) done -lemma ennreal_SUP_const_minus: (* TODO: rename: ennreal_SUP_const_minus *) +lemma ennreal_SUP_const_minus: fixes f :: "'a \ ennreal" shows "I \ {} \ c < top \ (INF x\I. c - f x) = c - (SUP x\I. f x)" apply (transfer fixing: I) unfolding ex_in_conv[symmetric] - apply (auto simp add: sup_max[symmetric] SUP_upper2 sup_absorb2 - simp del: sup_ereal_def) + apply (auto simp add: SUP_upper2 sup_absorb2 simp flip: sup_ereal_def) apply (subst INF_ereal_minus_right[symmetric]) apply (auto simp del: sup_ereal_def simp add: sup_INF) done @@ -1725,8 +1672,7 @@ lemma ennreal_approx_unit: "(\a::ennreal. 0 < a \ a < 1 \ a * z \ y) \ z \ y" apply (subst SUP_mult_right_ennreal[of "\x. x" "{0 <..< 1}" z, simplified]) - apply (rule SUP_least) - apply auto + apply (auto intro: SUP_least) done lemma suminf_ennreal2: @@ -1804,7 +1750,7 @@ subsection \\<^typ>\ennreal\ theorems\ lemma neq_top_trans: fixes x y :: ennreal shows "\ y \ top; x \ y \ \ x \ top" -by (auto simp: top_unique) + by (auto simp: top_unique) lemma diff_diff_ennreal: fixes a b :: ennreal shows "a \ b \ b \ \ \ b - (b - a) = a" by (cases a b rule: ennreal2_cases) (auto simp: ennreal_minus top_unique) @@ -2012,8 +1958,6 @@ assumes "(u \ ennreal l) F" "l \ 0" shows "((\n. enn2real (u n)) \ l) F" unfolding enn2real_def - apply (intro tendsto_intros) - apply (subst enn2ereal_ennreal[symmetric]) - by (intro tendsto_intros assms)+ + by (metis assms enn2ereal_ennreal lim_real_of_ereal tendsto_enn2erealI) end diff -r 6b620d91e8cc -r 11b81cd70633 src/HOL/Library/Extended_Real.thy --- a/src/HOL/Library/Extended_Real.thy Mon Aug 31 17:18:47 2020 +0100 +++ b/src/HOL/Library/Extended_Real.thy Tue Sep 01 22:01:27 2020 +0100 @@ -133,10 +133,7 @@ next case (Suc n') then have "{enat n} = {enat n' <..< enat (Suc n)}" - apply auto - apply (case_tac x) - apply auto - done + using enat_iless by (fastforce simp: set_eq_iff) then show ?thesis by simp qed @@ -147,10 +144,7 @@ proof safe assume "\ \ A" then have "A = (\n\{n. enat n \ A}. {enat n})" - apply auto - apply (case_tac x) - apply auto - done + by (simp add: set_eq_iff) (metis not_enat_eq) moreover have "open \" by (auto intro: open_enat) ultimately show "open A" @@ -158,10 +152,7 @@ next fix n assume "{enat n <..} \ A" then have "A = (\n\{n. enat n \ A}. {enat n}) \ {enat n <..}" - apply auto - apply (case_tac x) - apply auto - done + using enat_ile leI by (simp add: set_eq_iff) blast moreover have "open \" by (intro open_Un open_UN ballI open_enat open_greaterThan) ultimately show "open A" @@ -191,12 +182,14 @@ lemma nhds_enat: "nhds x = (if x = \ then INF i. principal {enat i..} else principal {x})" proof auto show "nhds \ = (INF i. principal {enat i..})" - unfolding nhds_def - apply (auto intro!: antisym INF_greatest simp add: open_enat_iff cong: rev_conj_cong) - apply (auto intro!: INF_lower Ioi_le_Ico) [] - subgoal for x i - by (auto intro!: INF_lower2[of "Suc i"] simp: subset_eq Ball_def eSuc_enat Suc_ile_eq) - done + proof (rule antisym) + show "nhds \ \ (INF i. principal {enat i..})" + unfolding nhds_def + using Ioi_le_Ico by (intro INF_greatest INF_lower) (auto simp add: open_enat_iff) + show "(INF i. principal {enat i..}) \ nhds \" + unfolding nhds_def + by (intro INF_greatest) (force intro: INF_lower2[of "Suc _"] simp add: open_enat_iff Suc_ile_eq) + qed show "nhds (enat i) = principal {enat i}" for i by (simp add: nhds_discrete_open open_enat) qed @@ -594,14 +587,10 @@ lemma ereal_add_strict_mono2: fixes a b c d :: ereal - assumes "a < b" - and "c < d" + assumes "a < b" and "c < d" shows "a + c < b + d" -using assms -apply (cases a) -apply (cases rule: ereal3_cases[of b c d], auto) -apply (cases rule: ereal3_cases[of b c d], auto) -done + using assms + by (cases a; force simp add: elim: less_ereal.elims) lemma ereal_minus_le_minus[simp]: fixes a b :: ereal @@ -1036,12 +1025,13 @@ lemma ereal_mult_right_mono: fixes a b c :: ereal - shows "a \ b \ 0 \ c \ a * c \ b * c" - apply (cases "c = 0") - apply simp - apply (cases rule: ereal3_cases[of a b c]) - apply (auto simp: zero_le_mult_iff) - done + assumes "a \ b" "0 \ c" + shows "a * c \ b * c" +proof (cases "c = 0") + case False + with assms show ?thesis + by (cases rule: ereal3_cases[of a b c]) auto +qed auto lemma ereal_mult_left_mono: fixes a b c :: ereal @@ -1076,7 +1066,7 @@ fixes a b c d::ereal assumes "a > 0" "c > 0" "a < b" "c < d" shows "a * c < b * d" -apply (rule ereal_mult_mono_strict, auto simp add: assms) using assms by auto + using assms ereal_mult_mono_strict by auto lemma zero_less_one_ereal[simp]: "0 \ (1::ereal)" by (simp add: one_ereal_def zero_ereal_def) @@ -1134,14 +1124,19 @@ by (cases rule: ereal3_cases[of a b c]) (simp_all add: field_simps) lemma numeral_eq_ereal [simp]: "numeral w = ereal (numeral w)" - apply (induct w rule: num_induct) - apply (simp only: numeral_One one_ereal_def) - apply (simp only: numeral_inc ereal_plus_1) - done +proof (induct w rule: num_induct) + case One + then show ?case + by simp +next + case (inc x) + then show ?case + by (simp add: inc numeral_inc) +qed lemma distrib_left_ereal_nn: "c \ 0 \ (x + y) * ereal c = x * ereal c + y * ereal c" -by(cases x y rule: ereal2_cases)(simp_all add: ring_distribs) + by(cases x y rule: ereal2_cases)(simp_all add: ring_distribs) lemma sum_ereal_right_distrib: fixes f :: "'a \ ereal" @@ -1158,79 +1153,32 @@ lemma ereal_le_epsilon: fixes x y :: ereal - assumes "\e. 0 < e \ x \ y + e" + assumes "\e. 0 < e \ x \ y + e" shows "x \ y" -proof - - { - assume a: "\r. y = ereal r" - then obtain r where r_def: "y = ereal r" - by auto - { - assume "x = -\" - then have ?thesis by auto - } - moreover - { - assume "x \ -\" - then obtain p where p_def: "x = ereal p" - using a assms[rule_format, of 1] - by (cases x) auto - { - fix e - have "0 < e \ p \ r + e" - using assms[rule_format, of "ereal e"] p_def r_def by auto - } - then have "p \ r" - apply (subst field_le_epsilon) - apply auto - done - then have ?thesis - using r_def p_def by auto - } - ultimately have ?thesis - by blast - } - moreover - { - assume "y = -\ \ y = \" - then have ?thesis - using assms[rule_format, of 1] by (cases x) auto - } - ultimately show ?thesis - by (cases y) auto +proof (cases "x = -\ \ x = \ \ y = -\ \ y = \") + case True + then show ?thesis + using assms[of 1] by auto +next + case False + then obtain p q where "x = ereal p" "y = ereal q" + by (metis MInfty_eq_minfinity ereal.distinct(3) uminus_ereal.elims) + then show ?thesis + by (metis assms field_le_epsilon ereal_less(2) ereal_less_eq(3) plus_ereal.simps(1)) qed lemma ereal_le_epsilon2: fixes x y :: ereal - assumes "\e. 0 < e \ x \ y + ereal e" + assumes "\e::real. 0 < e \ x \ y + ereal e" shows "x \ y" -proof - - { - fix e :: ereal - assume "e > 0" - { - assume "e = \" - then have "x \ y + e" - by auto - } - moreover - { - assume "e \ \" - then obtain r where "e = ereal r" - using \e > 0\ by (cases e) auto - then have "x \ y + e" - using assms[rule_format, of r] \e>0\ by auto - } - ultimately have "x \ y + e" - by blast - } - then show ?thesis - using ereal_le_epsilon by auto +proof (rule ereal_le_epsilon) + show "\\::ereal. 0 < \ \ x \ y + \" + using assms less_ereal.elims(2) zero_less_real_of_ereal by fastforce qed lemma ereal_le_real: fixes x y :: ereal - assumes "\z. x \ ereal z \ y \ ereal z" + assumes "\z. x \ ereal z \ y \ ereal z" shows "y \ x" by (metis assms ereal_bot ereal_cases ereal_infty_less_eq(2) ereal_less_eq(1) linorder_le_cases) @@ -1240,10 +1188,7 @@ proof (cases "finite A") case True then show ?thesis by (induct A) auto -next - case False - then show ?thesis by auto -qed +qed auto lemma prod_ereal_pos: fixes f :: "'a \ ereal" @@ -1253,10 +1198,7 @@ case True from this pos show ?thesis by induct auto -next - case False - then show ?thesis by simp -qed +qed auto lemma prod_PInf: fixes f :: "'a \ ereal" @@ -1278,10 +1220,7 @@ using insert by (auto simp: prod_ereal_0) finally show ?case . qed simp -next - case False - then show ?thesis by simp -qed +qed auto lemma prod_ereal: "(\i\A. ereal (f i)) = ereal (prod f A)" proof (cases "finite A") @@ -1478,13 +1417,7 @@ and "0 < e" shows "x - e < x" and "x < x + e" - using assms - apply (cases x, cases e) - apply auto - using assms - apply (cases x, cases e) - apply auto - done + using assms by (cases x, cases e, auto)+ lemma ereal_minus_eq_PInfty_iff: fixes x y :: ereal @@ -1494,28 +1427,28 @@ lemma ereal_diff_add_eq_diff_diff_swap: fixes x y z :: ereal shows "\y\ \ \ \ x - (y + z) = x - y - z" -by(cases x y z rule: ereal3_cases) simp_all + by(cases x y z rule: ereal3_cases) simp_all lemma ereal_diff_add_assoc2: fixes x y z :: ereal shows "x + y - z = x - z + y" -by(cases x y z rule: ereal3_cases) simp_all + by(cases x y z rule: ereal3_cases) simp_all lemma ereal_add_uminus_conv_diff: fixes x y z :: ereal shows "- x + y = y - x" -by(cases x y rule: ereal2_cases) simp_all + by(cases x y rule: ereal2_cases) simp_all lemma ereal_minus_diff_eq: fixes x y :: ereal shows "\ x = \ \ y \ \; x = -\ \ y \ - \ \ \ - (x - y) = y - x" -by(cases x y rule: ereal2_cases) simp_all + by(cases x y rule: ereal2_cases) simp_all lemma ediff_le_self [simp]: "x - y \ (x :: enat)" -by(cases x y rule: enat.exhaust[case_product enat.exhaust]) simp_all + by(cases x y rule: enat.exhaust[case_product enat.exhaust]) simp_all lemma ereal_abs_diff: fixes a b::ereal shows "abs(a-b) \ abs a + abs b" -by (cases rule: ereal2_cases[of a b]) (auto) + by (cases rule: ereal2_cases[of a b]) (auto) subsubsection \Division\ @@ -1843,17 +1776,10 @@ instance proof show "Sup {} = (bot::ereal)" - apply (auto simp: bot_ereal_def Sup_ereal_def) - apply (rule some1_equality) - apply (metis ereal_bot ereal_less_eq(2)) - apply (metis ereal_less_eq(2)) - done + using ereal_bot by (auto simp: bot_ereal_def Sup_ereal_def) show "Inf {} = (top::ereal)" - apply (auto simp: top_ereal_def Inf_ereal_def) - apply (rule some1_equality) - apply (metis ereal_top ereal_less_eq(1)) - apply (metis ereal_less_eq(1)) - done + unfolding top_ereal_def Inf_ereal_def + using ereal_infty_less_eq(1) ereal_less_eq(1) by blast qed (auto intro: someI2_ex ereal_complete_Sup ereal_complete_Inf simp: Sup_ereal_def Inf_ereal_def bot_ereal_def top_ereal_def) @@ -1868,51 +1794,35 @@ qed lemma min_PInf [simp]: "min (\::ereal) x = x" -by (metis min_top top_ereal_def) + by (metis min_top top_ereal_def) lemma min_PInf2 [simp]: "min x (\::ereal) = x" -by (metis min_top2 top_ereal_def) + by (metis min_top2 top_ereal_def) lemma max_PInf [simp]: "max (\::ereal) x = \" -by (metis max_top top_ereal_def) + by (metis max_top top_ereal_def) lemma max_PInf2 [simp]: "max x (\::ereal) = \" -by (metis max_top2 top_ereal_def) + by (metis max_top2 top_ereal_def) lemma min_MInf [simp]: "min (-\::ereal) x = -\" -by (metis min_bot bot_ereal_def) + by (metis min_bot bot_ereal_def) lemma min_MInf2 [simp]: "min x (-\::ereal) = -\" -by (metis min_bot2 bot_ereal_def) + by (metis min_bot2 bot_ereal_def) lemma max_MInf [simp]: "max (-\::ereal) x = x" -by (metis max_bot bot_ereal_def) + by (metis max_bot bot_ereal_def) lemma max_MInf2 [simp]: "max x (-\::ereal) = x" -by (metis max_bot2 bot_ereal_def) + by (metis max_bot2 bot_ereal_def) subsection \Extended real intervals\ lemma real_greaterThanLessThan_infinity_eq: "real_of_ereal ` {N::ereal<..<\} = (if N = \ then {} else if N = -\ then UNIV else {real_of_ereal N<..})" -proof - - { - fix x::real - have "x \ real_of_ereal ` {- \<..<\::ereal}" - by (auto intro!: image_eqI[where x="ereal x"]) - } moreover { - fix x::ereal - assume "N \ - \" "N < x" "x \ \" - then have "real_of_ereal N < real_of_ereal x" - by (cases N; cases x; simp) - } moreover { - fix x::real - assume "N \ \" "real_of_ereal N < x" - then have "x \ real_of_ereal ` {N<..<\}" - by (cases N) (auto intro!: image_eqI[where x="ereal x"]) - } ultimately show ?thesis by auto -qed + by (force simp: real_less_ereal_iff intro!: image_eqI[where x="ereal _"] elim!: less_ereal.elims) lemma real_greaterThanLessThan_minus_infinity_eq: "real_of_ereal ` {-\<..<.. real_of_ereal ` {N<..<\}" - apply safe - subgoal by force - subgoal by force - subgoal for x y z - by (cases y; cases z) (auto intro!: image_eqI[where x=z] simp: ) - done + by (force elim!: less_ereal.elims) lemma real_atLeastGreaterThan_eq: "real_of_ereal ` {N<.. then {} else @@ -1942,11 +1847,19 @@ else if M = - \ then {} else if M = \ then {real_of_ereal N<..} else {real_of_ereal N <..< real_of_ereal M})" - apply (subst real_greaterThanLessThan_inter) - apply (subst real_greaterThanLessThan_minus_infinity_eq) - apply (subst real_greaterThanLessThan_infinity_eq) - apply auto - done +proof (cases "M = -\ \ M = \ \ N = -\ \ N = \") + case True + then show ?thesis + by (auto simp: real_greaterThanLessThan_minus_infinity_eq real_greaterThanLessThan_infinity_eq ) +next + case False + then obtain p q where "M = ereal p" "N = ereal q" + by (metis MInfty_eq_minfinity ereal.distinct(3) uminus_ereal.elims) + moreover have "\x. \q < x; x < p\ \ x \ real_of_ereal ` {ereal q<.. real_of_ereal ` {a<.. t" shows "b \ \" - using assms - apply (cases b) - subgoal by force - subgoal by (metis PInfty_neq_ereal(2) assms dual_order.strict_trans1 ereal_infty_less(1) - ereal_less_ereal_Ex greaterThanLessThan_empty_iff greaterThanLessThan_iff greaterThan_iff - image_eqI less_imp_le linordered_field_no_ub not_less order_trans - real_greaterThanLessThan_infinity_eq real_image_ereal_ivl real_of_ereal.simps(1)) - subgoal by force - done +proof (cases b) + case PInf + then show ?thesis + using assms + apply clarsimp + by (metis UNIV_I assms(1) ereal_less_PInfty greaterThan_iff less_eq_ereal_def less_le_trans real_image_ereal_ivl) +qed auto lemma real_ereal_bound_lemma_down: - assumes "s \ real_of_ereal ` {a<.. real_of_ereal ` {a<.. s" + assumes s: "s \ real_of_ereal ` {a<.. real_of_ereal ` {a<.. s" shows "a \ - \" - using assms - apply (cases b) - subgoal - apply safe - using assms(1) - apply (auto simp: real_greaterThanLessThan_minus_infinity_eq) - done - subgoal by (auto simp: real_greaterThanLessThan_minus_infinity_eq) - subgoal by auto - done +proof (cases b) + case (real r) + then show ?thesis + using assms real_greaterThanLessThan_minus_infinity_eq by force +next + case PInf + then show ?thesis + using t real_greaterThanLessThan_infinity_eq by auto +next + case MInf + then show ?thesis + using s by auto +qed subsection "Topological space" @@ -2081,14 +1995,15 @@ using isCont_tendsto_compose[of x ereal f F] continuous_on_ereal[of UNIV "\x. x"] by (simp add: continuous_on_eq_continuous_at) -lemma tendsto_uminus_ereal[tendsto_intros, simp, intro]: "(f \ x) F \ ((\x. - f x::ereal) \ - x) F" - apply (rule tendsto_compose[where g=uminus]) - apply (auto intro!: order_tendstoI simp: eventually_at_topological) - apply (rule_tac x="{..< -a}" in exI) - apply (auto split: ereal.split simp: ereal_less_uminus_reorder) [] - apply (rule_tac x="{- a <..}" in exI) - apply (auto split: ereal.split simp: ereal_uminus_reorder) [] - done +lemma tendsto_uminus_ereal[tendsto_intros, simp, intro]: + assumes "(f \ x) F" + shows "((\x. - f x::ereal) \ - x) F" +proof (rule tendsto_compose[OF order_tendstoI assms]) + show "\a. a < - x \ \\<^sub>F x in at x. a < - x" + by (metis ereal_less_uminus_reorder eventually_at_topological lessThan_iff open_lessThan) + show "\a. - x < a \ \\<^sub>F x in at x. - x < a" + by (metis ereal_uminus_reorder(2) eventually_at_topological greaterThan_iff open_greaterThan) +qed lemma at_infty_ereal_eq_at_top: "at \ = filtermap ereal at_top" unfolding filter_eq_iff eventually_at_filter eventually_at_top_linorder eventually_filtermap @@ -2384,7 +2299,7 @@ and pos: "\i. f i \ -\" "\i. g i \ -\" shows "(SUP i. f i + g i) = Sup (f ` UNIV) + Sup (g ` UNIV)" apply (subst SUP_ereal_add_left[symmetric, OF UNIV_not_empty]) - apply (metis SUP_upper UNIV_I assms(4) ereal_infty_less_eq(2)) + apply (metis SUP_upper UNIV_I assms(4) ereal_infty_less_eq(2)) apply (subst (2) add.commute) apply (subst SUP_ereal_add_left[symmetric, OF UNIV_not_empty assms(3)]) apply (subst (2) add.commute) @@ -2711,38 +2626,22 @@ unfolding open_generated_order[where 'a=real] proof (induct rule: generate_topology.induct) case (Basis S) - moreover { - fix x - have "ereal ` {..< x} = { -\ <..< ereal x }" - apply auto - apply (case_tac xa) - apply auto - done - } - moreover { - fix x - have "ereal ` {x <..} = { ereal x <..< \ }" - apply auto - apply (case_tac xa) - apply auto - done - } + moreover have "\x. ereal ` {..< x} = { -\ <..< ereal x }" + using ereal_less_ereal_Ex by auto + moreover have "\x. ereal ` {x <..} = { ereal x <..< \ }" + using less_ereal.elims(2) by fastforce ultimately show ?case - by auto + by auto qed (auto simp add: image_Union image_Int) lemma open_image_real_of_ereal: fixes X::"ereal set" assumes "open X" - assumes "\ \ X" - assumes "-\ \ X" + assumes infty: "\ \ X" "-\ \ X" shows "open (real_of_ereal ` X)" proof - have "real_of_ereal ` X = ereal -` X" - apply safe - subgoal by (metis assms(2) assms(3) real_of_ereal.elims vimageI) - subgoal using image_iff by fastforce - done + using infty ereal_real by (force simp: set_eq_iff) thus ?thesis by (auto intro!: open_ereal_vimage assms) qed @@ -3452,13 +3351,15 @@ lemma suminf_add_ereal: fixes f g :: "nat \ ereal" - assumes "\i. 0 \ f i" - and "\i. 0 \ g i" + assumes "\i. 0 \ f i" "\i. 0 \ g i" shows "(\i. f i + g i) = suminf f + suminf g" - apply (subst (1 2 3) suminf_ereal_eq_SUP) - unfolding sum.distrib - apply (intro assms add_nonneg_nonneg SUP_ereal_add_pos incseq_sumI sum_nonneg ballI)+ - done +proof - + have "(SUP n. \i ereal" @@ -3602,20 +3503,13 @@ and "\n i. 0 \ f n i" shows "(\i. SUP n. f n i) = (SUP n. \i. f n i)" proof - - { - fix n :: nat - have "(\iin. (\iin i. 0 \ f n i" "\i. 0 \ (SUP n\I. f n i)" using \I \ {}\ nonneg by (auto intro: SUP_upper2) show "(SUP n. \iI. f n i) = (SUP n\I. SUP j. \it\ \ \" shows "open ((\x. m * x + t) ` S)" proof - - have "open ((\x. inverse m * (x + -t)) -` S)" + have "continuous_on UNIV (\x. inverse m * (x + - t))" using m t - apply (intro open_vimage \open S\) - apply (intro continuous_at_imp_continuous_on ballI tendsto_cmult_ereal continuous_at[THEN iffD2] - tendsto_ident_at tendsto_add_left_ereal) - apply auto - done + by (intro continuous_at_imp_continuous_on ballI continuous_at[THEN iffD2]; force) + then have "open ((\x. inverse m * (x + -t)) -` S)" + using \open S\ open_vimage by blast also have "(\x. inverse m * (x + -t)) -` S = (\x. (x - t) / m) -` S" using m t by (auto simp: divide_ereal_def mult.commute minus_ereal_def simp flip: uminus_ereal.simps) @@ -3902,8 +3791,7 @@ proof - from 1 2 have "limsup X \ liminf X" by auto hence 3: "limsup X = liminf X" - apply (subst eq_iff, rule conjI) - by (rule Liminf_le_Limsup, auto) + by (simp add: Liminf_le_Limsup order_class.order.antisym) hence 4: "convergent (\n. ereal (X n))" by (subst convergent_ereal) hence "limsup X = lim (\n. ereal(X n))" @@ -3911,8 +3799,7 @@ also from 1 2 3 have "limsup X = L" by auto finally have "lim (\n. ereal(X n)) = L" .. hence "(\n. ereal (X n)) \ L" - apply (elim subst) - by (subst convergent_LIMSEQ_iff [symmetric], rule 4) + using "4" convergent_LIMSEQ_iff by force thus ?thesis by simp qed @@ -3954,13 +3841,8 @@ next case (real r) then show ?thesis - unfolding liminf_SUP_INF limsup_INF_SUP - apply (subst INF_ereal_minus_right) - apply auto - apply (subst SUP_ereal_minus_right) - apply auto - done -qed (insert \c \ -\\, simp) + by (simp add: liminf_SUP_INF limsup_INF_SUP INF_ereal_minus_right SUP_ereal_minus_right) +qed (use \c \ -\\ in simp) subsubsection \Continuity\ @@ -4055,39 +3937,20 @@ lemma continuous_on_iff_real: fixes f :: "'a::t2_space \ ereal" - assumes *: "\x. x \ A \ \f x\ \ \" + assumes "\x. x \ A \ \f x\ \ \" shows "continuous_on A f \ continuous_on A (real_of_ereal \ f)" -proof - +proof + assume L: "continuous_on A f" have "f ` A \ UNIV - {\, -\}" using assms by force - then have *: "continuous_on (f ` A) real_of_ereal" - using continuous_on_real by (simp add: continuous_on_subset) - have **: "continuous_on ((real_of_ereal \ f) ` A) ereal" - by (intro continuous_on_ereal continuous_on_id) - { - assume "continuous_on A f" - then have "continuous_on A (real_of_ereal \ f)" - apply (subst continuous_on_compose) - using * - apply auto - done - } - moreover - { - assume "continuous_on A (real_of_ereal \ f)" - then have "continuous_on A (ereal \ (real_of_ereal \ f))" - apply (subst continuous_on_compose) - using ** - apply auto - done - then have "continuous_on A f" - apply (subst continuous_on_cong[of _ A _ "ereal \ (real_of_ereal \ f)"]) - using assms ereal_real - apply auto - done - } - ultimately show ?thesis - by auto + then show "continuous_on A (real_of_ereal \ f)" + by (meson L continuous_on_compose continuous_on_real continuous_on_subset) +next + assume R: "continuous_on A (real_of_ereal \ f)" + then have "continuous_on A (ereal \ (real_of_ereal \ f))" + by (meson continuous_at_iff_ereal continuous_on_eq_continuous_within) + then show "continuous_on A f" + using assms ereal_real' by auto qed lemma continuous_uminus_ereal [continuous_intros]: "continuous_on (A :: ereal set) uminus" @@ -4149,7 +4012,7 @@ from assms show "continuous_on UNIV (\a. a * ereal c)" using tendsto_cmult_ereal[of "ereal c" "\x. x" ] by (force simp: continuous_on_def mult_ac) -qed (insert assms, auto simp: mono_def ereal_mult_right_mono) +qed (use assms in \auto simp: mono_def ereal_mult_right_mono\) lemma Liminf_ereal_mult_left: assumes "F \ bot" "(c::real) \ 0" @@ -4321,10 +4184,7 @@ lemma continuous_on_diff_ereal: "continuous_on A f \ continuous_on A g \ (\x. x \ A \ \f x\ \ \) \ (\x. x \ A \ \g x\ \ \) \ continuous_on A (\z. f z - g z::ereal)" - apply (auto simp: continuous_on_def) - apply (intro tendsto_diff_ereal) - apply metis+ - done + by (auto simp: tendsto_diff_ereal continuous_on_def) subsubsection \Tests for code generator\