# HG changeset patch # User hoelzl # Date 1311079109 -7200 # Node ID ab93d0190a5d9b5a3c6539332850846cc03cda09 # Parent c6f35921056eb0325d9417ac3150fe130561a6ed add ereal to typeclass infinity diff -r c6f35921056e -r ab93d0190a5d src/HOL/Library/Extended_Nat.thy --- a/src/HOL/Library/Extended_Nat.thy Tue Jul 19 14:37:49 2011 +0200 +++ b/src/HOL/Library/Extended_Nat.thy Tue Jul 19 14:38:29 2011 +0200 @@ -47,7 +47,6 @@ qed qed (auto simp add: Fin_def infinity_enat_def Abs_enat_inject) -declare [[coercion_enabled]] declare [[coercion "Fin::nat\enat"]] lemma not_Infty_eq[iff]: "(x \ \) = (EX i. x = Fin i)" diff -r c6f35921056e -r ab93d0190a5d src/HOL/Library/Extended_Real.thy --- a/src/HOL/Library/Extended_Real.thy Tue Jul 19 14:37:49 2011 +0200 +++ b/src/HOL/Library/Extended_Real.thy Tue Jul 19 14:38:29 2011 +0200 @@ -8,7 +8,7 @@ header {* Extended real number line *} theory Extended_Real - imports Complex_Main + imports Complex_Main Extended_Nat begin text {* @@ -40,44 +40,43 @@ datatype ereal = ereal real | PInfty | MInfty -notation (xsymbols) - PInfty ("\") - -notation (HTML output) - PInfty ("\") - -declare [[coercion "ereal :: real \ ereal"]] - instantiation ereal :: uminus begin fun uminus_ereal where "- (ereal r) = ereal (- r)" - | "- \ = MInfty" - | "- MInfty = \" + | "- PInfty = MInfty" + | "- MInfty = PInfty" instance .. end -lemma inj_ereal[simp]: "inj_on ereal A" - unfolding inj_on_def by auto - -lemma MInfty_neq_PInfty[simp]: - "\ \ - \" "- \ \ \" by simp_all +instantiation ereal :: infinity +begin + definition "(\::ereal) = PInfty" + instance .. +end -lemma MInfty_neq_ereal[simp]: - "ereal r \ - \" "- \ \ ereal r" by simp_all +definition "ereal_of_enat n = (case n of Fin n \ ereal (real n) | \ \ \)" -lemma MInfinity_cases[simp]: - "(case - \ of ereal r \ f r | \ \ y | MInfinity \ z) = z" - by simp +declare [[coercion "ereal :: real \ ereal"]] +declare [[coercion "ereal_of_enat :: enat \ ereal"]] +declare [[coercion "(\n. ereal (of_nat n)) :: nat \ ereal"]] lemma ereal_uminus_uminus[simp]: fixes a :: ereal shows "- (- a) = a" by (cases a) simp_all -lemma MInfty_eq[simp, code_post]: - "MInfty = - \" by simp +lemma + shows PInfty_eq_infinity[simp]: "PInfty = \" + and MInfty_eq_minfinity[simp]: "MInfty = - \" + and MInfty_neq_PInfty[simp]: "\ \ - (\::ereal)" "- \ \ (\::ereal)" + and MInfty_neq_ereal[simp]: "ereal r \ - \" "- \ \ ereal r" + and PInfty_neq_ereal[simp]: "ereal r \ \" "\ \ ereal r" + and PInfty_cases[simp]: "(case \ of ereal r \ f r | PInfty \ y | MInfty \ z) = y" + and MInfty_cases[simp]: "(case - \ of ereal r \ f r | PInfty \ y | MInfty \ z) = z" + by (simp_all add: infinity_ereal_def) -declare uminus_ereal.simps(2)[code_inline, simp del] +lemma inj_ereal[simp]: "inj_on ereal A" + unfolding inj_on_def by auto lemma ereal_cases[case_names real PInf MInf, cases type: ereal]: assumes "\r. x = ereal r \ P" @@ -106,7 +105,7 @@ lemma real_of_ereal[simp]: "real (- x :: ereal) = - (real x)" "real (ereal r) = r" - "real \ = 0" + "real (\::ereal) = 0" by (cases x) (simp_all add: real_of_ereal_def) lemma range_ereal[simp]: "range ereal = UNIV - {\, -\}" @@ -130,17 +129,17 @@ begin function abs_ereal where "\ereal r\ = ereal \r\" - | "\-\\ = \" - | "\\\ = \" + | "\-\\ = (\::ereal)" + | "\\\ = (\::ereal)" by (auto intro: ereal_cases) termination proof qed (rule wf_empty) instance .. end -lemma abs_eq_infinity_cases[elim!]: "\ \x\ = \ ; x = \ \ P ; x = -\ \ P \ \ P" +lemma abs_eq_infinity_cases[elim!]: "\ \x :: ereal\ = \ ; x = \ \ P ; x = -\ \ P \ \ P" by (cases x) auto -lemma abs_neq_infinity_cases[elim!]: "\ \x\ \ \ ; \r. x = ereal r \ P \ \ P" +lemma abs_neq_infinity_cases[elim!]: "\ \x :: ereal\ \ \ ; \r. x = ereal r \ P \ \ P" by (cases x) auto lemma abs_ereal_uminus[simp]: "\- x\ = \x::ereal\" @@ -155,11 +154,11 @@ function plus_ereal where "ereal r + ereal p = ereal (r + p)" | -"\ + a = \" | -"a + \ = \" | +"\ + a = (\::ereal)" | +"a + \ = (\::ereal)" | "ereal r + -\ = - \" | -"-\ + ereal p = -\" | -"-\ + -\ = -\" +"-\ + ereal p = -(\::ereal)" | +"-\ + -\ = -(\::ereal)" proof - case (goal1 P x) moreover then obtain a b where "x = (a, b)" by (cases x) auto @@ -169,8 +168,8 @@ termination proof qed (rule wf_empty) lemma Infty_neq_0[simp]: - "\ \ 0" "0 \ \" - "-\ \ 0" "0 \ -\" + "(\::ereal) \ 0" "0 \ (\::ereal)" + "-(\::ereal) \ 0" "0 \ -(\::ereal)" by (simp_all add: zero_ereal_def) lemma ereal_eq_0[simp]: @@ -204,21 +203,21 @@ by (cases a) simp_all lemma ereal_plus_eq_PInfty[simp]: - shows "a + b = \ \ a = \ \ b = \" + fixes a b :: ereal shows "a + b = \ \ a = \ \ b = \" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_plus_eq_MInfty[simp]: - shows "a + b = -\ \ + fixes a b :: ereal shows "a + b = -\ \ (a = -\ \ b = -\) \ a \ \ \ b \ \" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_add_cancel_left: - assumes "a \ -\" + fixes a b :: ereal assumes "a \ -\" shows "a + b = a + c \ (a = \ \ b = c)" using assms by (cases rule: ereal3_cases[of a b c]) auto lemma ereal_add_cancel_right: - assumes "a \ -\" + fixes a b :: ereal assumes "a \ -\" shows "b + a = c + a \ (a = \ \ b = c)" using assms by (cases rule: ereal3_cases[of a b c]) auto @@ -237,12 +236,12 @@ begin function less_ereal where -"ereal x < ereal y \ x < y" | -" \ < a \ False" | -" a < -\ \ False" | -"ereal x < \ \ True" | -" -\ < ereal r \ True" | -" -\ < \ \ True" +" ereal x < ereal y \ x < y" | +"(\::ereal) < a \ False" | +" a < -(\::ereal) \ False" | +"ereal x < \ \ True" | +" -\ < ereal r \ True" | +" -\ < (\::ereal) \ True" proof - case (goal1 P x) moreover then obtain a b where "x = (a,b)" by (cases x) auto @@ -253,33 +252,35 @@ definition "x \ (y::ereal) \ x < y \ x = y" lemma ereal_infty_less[simp]: - "x < \ \ (x \ \)" - "-\ < x \ (x \ -\)" + fixes x :: ereal + shows "x < \ \ (x \ \)" + "-\ < x \ (x \ -\)" by (cases x, simp_all) (cases x, simp_all) lemma ereal_infty_less_eq[simp]: - "\ \ x \ x = \" + fixes x :: ereal + shows "\ \ x \ x = \" "x \ -\ \ x = -\" by (auto simp add: less_eq_ereal_def) lemma ereal_less[simp]: "ereal r < 0 \ (r < 0)" "0 < ereal r \ (0 < r)" - "0 < \" - "-\ < 0" + "0 < (\::ereal)" + "-(\::ereal) < 0" by (simp_all add: zero_ereal_def) lemma ereal_less_eq[simp]: - "x \ \" - "-\ \ x" + "x \ (\::ereal)" + "-(\::ereal) \ x" "ereal r \ ereal p \ r \ p" "ereal r \ 0 \ r \ 0" "0 \ ereal r \ 0 \ r" by (auto simp add: less_eq_ereal_def zero_ereal_def) lemma ereal_infty_less_eq2: - "a \ b \ a = \ \ b = \" - "a \ b \ b = -\ \ a = -\" + "a \ b \ a = \ \ b = (\::ereal)" + "a \ b \ b = -\ \ a = -(\::ereal)" by simp_all instance @@ -304,15 +305,15 @@ qed lemma real_of_ereal_positive_mono: - "\0 \ x; x \ y; y \ \\ \ real x \ real y" + fixes x y :: ereal shows "\0 \ x; x \ y; y \ \\ \ real x \ real y" by (cases rule: ereal2_cases[of x y]) auto lemma ereal_MInfty_lessI[intro, simp]: - "a \ -\ \ -\ < a" + fixes a :: ereal shows "a \ -\ \ -\ < a" by (cases a) auto lemma ereal_less_PInfty[intro, simp]: - "a \ \ \ a < \" + fixes a :: ereal shows "a \ \ \ a < \" by (cases a) auto lemma ereal_less_ereal_Ex: @@ -373,14 +374,15 @@ lemma abs_ereal_pos[simp]: "0 \ \x :: ereal\" by (cases x) auto -lemma real_of_ereal_le_0[simp]: "real (X :: ereal) \ 0 \ (X \ 0 \ X = \)" - by (cases X) auto +lemma real_of_ereal_le_0[simp]: "real (x :: ereal) \ 0 \ (x \ 0 \ x = \)" + by (cases x) auto -lemma abs_real_of_ereal[simp]: "\real (X :: ereal)\ = real \X\" - by (cases X) auto +lemma abs_real_of_ereal[simp]: "\real (x :: ereal)\ = real \x\" + by (cases x) auto -lemma zero_less_real_of_ereal: "0 < real X \ (0 < X \ X \ \)" - by (cases X) auto +lemma zero_less_real_of_ereal: + fixes x :: ereal shows "0 < real x \ (0 < x \ x \ \)" + by (cases x) auto lemma ereal_0_le_uminus_iff[simp]: fixes a :: ereal shows "0 \ -a \ a \ 0" @@ -390,37 +392,13 @@ fixes a :: ereal shows "-a \ 0 \ 0 \ a" by (cases rule: ereal2_cases[of a]) auto +lemma ereal_dense2: "x < y \ \z. x < ereal z \ ereal z < y" + using lt_ex gt_ex dense by (cases x y rule: ereal2_cases) auto + lemma ereal_dense: fixes x y :: ereal assumes "x < y" - shows "EX z. x < z & z < y" -proof - -{ assume a: "x = (-\)" - { assume "y = \" hence ?thesis using a by (auto intro!: exI[of _ "0"]) } - moreover - { assume "y ~= \" - with `x < y` obtain r where r: "y = ereal r" by (cases y) auto - hence ?thesis using `x < y` a by (auto intro!: exI[of _ "ereal (r - 1)"]) - } ultimately have ?thesis by auto -} -moreover -{ assume "x ~= (-\)" - with `x < y` obtain p where p: "x = ereal p" by (cases x) auto - { assume "y = \" hence ?thesis using `x < y` p - by (auto intro!: exI[of _ "ereal (p + 1)"]) } - moreover - { assume "y ~= \" - with `x < y` obtain r where r: "y = ereal r" by (cases y) auto - with p `x < y` have "p < r" by auto - with dense obtain z where "p < z" "z < r" by auto - hence ?thesis using r p by (auto intro!: exI[of _ "ereal z"]) - } ultimately have ?thesis by auto -} ultimately show ?thesis by auto -qed - -lemma ereal_dense2: - fixes x y :: ereal assumes "x < y" - shows "EX z. x < ereal z & ereal z < y" - by (metis ereal_dense[OF `x < y`] ereal_cases less_ereal.simps(2,3)) + shows "\z. x < z \ z < y" + using ereal_dense2[OF `x < y`] by blast lemma ereal_add_strict_mono: fixes a b c d :: ereal @@ -428,7 +406,8 @@ shows "a + c < b + d" using assms by (cases rule: ereal3_cases[case_product ereal_cases, of a b c d]) auto -lemma ereal_less_add: "\a\ \ \ \ c < b \ a + c < a + b" +lemma ereal_less_add: + fixes a b c :: ereal shows "\a\ \ \ \ c < b \ a + c < a + b" by (cases rule: ereal2_cases[of b c]) auto lemma ereal_uminus_eq_reorder: "- a = b \ a = (-b::ereal)" by auto @@ -508,8 +487,8 @@ function sgn_ereal where "sgn (ereal r) = ereal (sgn r)" -| "sgn \ = 1" -| "sgn (-\) = -1" +| "sgn (\::ereal) = 1" +| "sgn (-\::ereal) = -1" by (auto intro: ereal_cases) termination proof qed (rule wf_empty) @@ -519,10 +498,10 @@ "\ * ereal r = (if r = 0 then 0 else if r > 0 then \ else -\)" | "ereal r * -\ = (if r = 0 then 0 else if r > 0 then -\ else \)" | "-\ * ereal r = (if r = 0 then 0 else if r > 0 then -\ else \)" | -"\ * \ = \" | -"-\ * \ = -\" | -"\ * -\ = -\" | -"-\ * -\ = \" +"(\::ereal) * \ = \" | +"-(\::ereal) * \ = -\" | +"(\::ereal) * -\ = -\" | +"-(\::ereal) * -\ = \" proof - case (goal1 P x) moreover then obtain a b where "x = (a, b)" by (cases x) auto @@ -570,13 +549,13 @@ by (cases x) (auto simp: zero_ereal_def) lemma ereal_times[simp]: - "1 \ \" "\ \ 1" - "1 \ -\" "-\ \ 1" + "1 \ (\::ereal)" "(\::ereal) \ 1" + "1 \ -(\::ereal)" "-(\::ereal) \ 1" by (auto simp add: times_ereal_def one_ereal_def) lemma ereal_plus_1[simp]: "1 + ereal r = ereal (r + 1)" "ereal r + 1 = ereal (r + 1)" - "1 + -\ = -\" "-\ + 1 = -\" + "1 + -(\::ereal) = -\" "-(\::ereal) + 1 = -\" unfolding one_ereal_def by auto lemma ereal_zero_times[simp]: @@ -584,12 +563,12 @@ by (cases rule: ereal2_cases[of a b]) auto lemma ereal_mult_eq_PInfty[simp]: - shows "a * b = \ \ + shows "a * b = (\::ereal) \ (a = \ \ b > 0) \ (a > 0 \ b = \) \ (a = -\ \ b < 0) \ (a < 0 \ b = -\)" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_mult_eq_MInfty[simp]: - shows "a * b = -\ \ + shows "a * b = -(\::ereal) \ (a = \ \ b < 0) \ (a < 0 \ b = \) \ (a = -\ \ b > 0) \ (a > 0 \ b = -\)" by (cases rule: ereal2_cases[of a b]) auto @@ -608,22 +587,22 @@ by (cases rule: ereal2_cases[of a b]) auto lemma ereal_mult_infty[simp]: - "a * \ = (if a = 0 then 0 else if 0 < a then \ else - \)" + "a * (\::ereal) = (if a = 0 then 0 else if 0 < a then \ else - \)" by (cases a) auto lemma ereal_infty_mult[simp]: - "\ * a = (if a = 0 then 0 else if 0 < a then \ else - \)" + "(\::ereal) * a = (if a = 0 then 0 else if 0 < a then \ else - \)" by (cases a) auto lemma ereal_mult_strict_right_mono: - assumes "a < b" and "0 < c" "c < \" + assumes "a < b" and "0 < c" "c < (\::ereal)" shows "a * c < b * c" using assms by (cases rule: ereal3_cases[of a b c]) (auto simp: zero_le_mult_iff ereal_less_PInfty) lemma ereal_mult_strict_left_mono: - "\ a < b ; 0 < c ; c < \\ \ c * a < c * b" + "\ a < b ; 0 < c ; c < (\::ereal)\ \ c * a < c * b" using ereal_mult_strict_right_mono by (simp add: mult_commute[of c]) lemma ereal_mult_right_mono: @@ -722,8 +701,7 @@ fixes x y :: ereal assumes "ALL z. x <= ereal z --> y <= ereal z" shows "y <= x" -by (metis assms ereal.exhaust ereal_bot ereal_less_eq(1) - ereal_less_eq(2) order_refl uminus_ereal.simps(2)) +by (metis assms ereal_bot ereal_cases ereal_infty_less_eq ereal_less_eq linorder_le_cases) lemma ereal_le_ereal: fixes x y :: ereal @@ -752,6 +730,7 @@ qed simp lemma setprod_PInf: + fixes f :: "'a \ ereal" assumes "\i. i \ I \ 0 \ f i" shows "(\i\I. f i) = \ \ finite I \ (\i\I. f i = \) \ (\i\I. f i \ 0)" proof cases @@ -788,7 +767,7 @@ lemma ereal_power[simp]: "(ereal x) ^ n = ereal (x^n)" by (induct n) (auto simp: one_ereal_def) -lemma ereal_power_PInf[simp]: "\ ^ n = (if n = 0 then 1 else \)" +lemma ereal_power_PInf[simp]: "(\::ereal) ^ n = (if n = 0 then 1 else \)" by (induct n) (auto simp: one_ereal_def) lemma ereal_power_uminus[simp]: @@ -835,15 +814,15 @@ "ereal r - ereal p = ereal (r - p)" "-\ - ereal r = -\" "ereal r - \ = -\" - "\ - x = \" - "-\ - \ = -\" + "(\::ereal) - x = \" + "-(\::ereal) - \ = -\" "x - -y = x + y" "x - 0 = x" "0 - x = -x" by (simp_all add: minus_ereal_def) lemma ereal_x_minus_x[simp]: - "x - x = (if \x\ = \ then \ else 0)" + "x - x = (if \x\ = \ then \ else 0::ereal)" by (cases x) simp_all lemma ereal_eq_minus_iff: @@ -917,12 +896,14 @@ by (cases rule: ereal3_cases[of a b c]) auto lemma ereal_add_le_add_iff: - "c + a \ c + b \ + fixes a b c :: ereal + shows "c + a \ c + b \ a \ b \ c = \ \ (c = -\ \ a \ \ \ b \ \)" by (cases rule: ereal3_cases[of a b c]) (simp_all add: field_simps) lemma ereal_mult_le_mult_iff: - "\c\ \ \ \ c * a \ c * b \ (0 < c \ a \ b) \ (c < 0 \ b \ a)" + fixes a b c :: ereal + shows "\c\ \ \ \ c * a \ c * b \ (0 < c \ a \ b) \ (c < 0 \ b \ a)" by (cases rule: ereal3_cases[of a b c]) (simp_all add: mult_le_cancel_left) lemma ereal_minus_mono: @@ -932,7 +913,8 @@ by (cases rule: ereal3_cases[case_product ereal_cases, of A B C D]) simp_all lemma real_of_ereal_minus: - "real (a - b) = (if \a\ = \ \ \b\ = \ then 0 else real a - real b)" + fixes a b :: ereal + shows "real (a - b) = (if \a\ = \ \ \b\ = \ then 0 else real a - real b)" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_diff_positive: @@ -953,8 +935,8 @@ function inverse_ereal where "inverse (ereal r) = (if r = 0 then \ else ereal (inverse r))" | -"inverse \ = 0" | -"inverse (-\) = 0" +"inverse (\::ereal) = 0" | +"inverse (-\::ereal) = 0" by (auto intro: ereal_cases) termination by (relation "{}") simp @@ -969,7 +951,7 @@ by (cases a) (auto simp: inverse_eq_divide) lemma ereal_inverse[simp]: - "inverse 0 = \" + "inverse (0::ereal) = \" "inverse (1::ereal) = 1" by (simp_all add: one_ereal_def zero_ereal_def) @@ -978,16 +960,16 @@ unfolding divide_ereal_def by (auto simp: divide_real_def) lemma ereal_divide_same[simp]: - "x / x = (if \x\ = \ \ x = 0 then 0 else 1)" + fixes x :: ereal shows "x / x = (if \x\ = \ \ x = 0 then 0 else 1)" by (cases x) (simp_all add: divide_real_def divide_ereal_def one_ereal_def) lemma ereal_inv_inv[simp]: - "inverse (inverse x) = (if x \ -\ then x else \)" + fixes x :: ereal shows "inverse (inverse x) = (if x \ -\ then x else \)" by (cases x) auto lemma ereal_inverse_minus[simp]: - "inverse (- x) = (if x = 0 then \ else -inverse x)" + fixes x :: ereal shows "inverse (- x) = (if x = 0 then \ else -inverse x)" by (cases x) simp_all lemma ereal_uminus_divide[simp]: @@ -995,7 +977,7 @@ unfolding divide_ereal_def by simp lemma ereal_divide_Infty[simp]: - "x / \ = 0" "x / -\ = 0" + fixes x :: ereal shows "x / \ = 0" "x / -\ = 0" unfolding divide_ereal_def by simp_all lemma ereal_divide_one[simp]: @@ -1012,19 +994,19 @@ using assms by (cases rule: ereal2_cases[of a b]) (auto simp: zero_le_divide_iff) lemma ereal_le_divide_pos: - "x > 0 \ x \ \ \ y \ z / x \ x * y \ z" + fixes x y z :: ereal shows "x > 0 \ x \ \ \ y \ z / x \ x * y \ z" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_divide_le_pos: - "x > 0 \ x \ \ \ z / x \ y \ z \ x * y" + fixes x y z :: ereal shows "x > 0 \ x \ \ \ z / x \ y \ z \ x * y" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_le_divide_neg: - "x < 0 \ x \ -\ \ y \ z / x \ z \ x * y" + fixes x y z :: ereal shows "x < 0 \ x \ -\ \ y \ z / x \ z \ x * y" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_divide_le_neg: - "x < 0 \ x \ -\ \ z / x \ y \ x * y \ z" + fixes x y z :: ereal shows "x < 0 \ x \ -\ \ z / x \ y \ x * y \ z" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_inverse_antimono_strict: @@ -1038,11 +1020,11 @@ by (cases rule: ereal2_cases[of x y]) auto lemma inverse_inverse_Pinfty_iff[simp]: - "inverse x = \ \ x = 0" + fixes x :: ereal shows "inverse x = \ \ x = 0" by (cases x) auto lemma ereal_inverse_eq_0: - "inverse x = 0 \ x = \ \ x = -\" + fixes x :: ereal shows "inverse x = 0 \ x = \ \ x = -\" by (cases x) auto lemma ereal_0_gt_inverse: @@ -1050,6 +1032,7 @@ by (cases x) auto lemma ereal_mult_less_right: + fixes a b c :: ereal assumes "b * a < c * a" "0 < a" "a < \" shows "b < c" using assms @@ -1057,7 +1040,7 @@ (auto split: split_if_asm simp: zero_less_mult_iff zero_le_mult_iff) lemma ereal_power_divide: - "y \ 0 \ (x / y :: ereal) ^ n = x^n / y^n" + fixes x y :: ereal shows "y \ 0 \ (x / y) ^ n = x^n / y^n" by (cases rule: ereal2_cases[of x y]) (auto simp: one_ereal_def zero_ereal_def power_divide not_le power_less_zero_eq zero_le_power_iff) @@ -1096,11 +1079,11 @@ instantiation ereal :: complete_lattice begin -definition "bot = -\" -definition "top = \" +definition "bot = (-\::ereal)" +definition "top = (\::ereal)" -definition "Sup S = (LEAST z. ALL x:S. x <= z :: ereal)" -definition "Inf S = (GREATEST z. ALL x:S. z <= x :: ereal)" +definition "Sup S = (LEAST z. \x\S. x \ z :: ereal)" +definition "Inf S = (GREATEST z. \x\S. z \ x :: ereal)" lemma ereal_complete_Sup: fixes S :: "ereal set" assumes "S \ {}" @@ -1303,11 +1286,13 @@ using Sup_eq_MInfty[of "uminus`S"] unfolding ereal_Sup_uminus_image_eq ereal_image_uminus_shift by simp -lemma Inf_eq_MInfty: "-\ : S ==> Inf S = -\" +lemma Inf_eq_MInfty: + fixes S :: "ereal set" shows "-\ \ S \ Inf S = -\" unfolding Inf_ereal_def by (auto intro!: Greatest_equality) -lemma Sup_eq_PInfty: "\ : S ==> Sup S = \" +lemma Sup_eq_PInfty: + fixes S :: "ereal set" shows "\ \ S \ Sup S = \" unfolding Sup_ereal_def by (auto intro!: Least_equality) @@ -1371,7 +1356,7 @@ lemma SUP_nat_Infty: "(SUP i::nat. ereal (real i)) = \" proof - - { fix x assume "x \ \" + { fix x ::ereal assume "x \ \" then have "\k::nat. x < ereal (real k)" proof (cases x) case MInf then show ?thesis by (intro exI[of _ 0]) auto @@ -1465,6 +1450,7 @@ qed lemma SUP_ereal_le_addI: + fixes f :: "'i \ ereal" assumes "\i. f i + y \ z" and "y \ -\" shows "SUPR UNIV f + y \ z" proof (cases y) @@ -1554,7 +1540,7 @@ unfolding SUPR_def Sup_eq_top_iff[where 'a=ereal, unfolded top_ereal_def] apply simp proof safe - fix x assume "x \ \" + fix x :: ereal assume "x \ \" show "\i\A. x < f i" proof (cases x) case PInf with `x \ \` show ?thesis by simp @@ -1646,7 +1632,6 @@ "A \ {} \ \f::nat \ ereal. range f \ g`A \ SUPR A g = SUPR UNIV f" using Sup_countable_SUPR[of "g`A"] by (auto simp: SUPR_def) - lemma Sup_ereal_cadd: fixes A :: "ereal set" assumes "A \ {}" and "a \ -\" shows "Sup ((\x. a + x) ` A) = a + Sup A" @@ -1674,6 +1659,7 @@ ereal_Sup_uminus_image_eq) lemma SUPR_ereal_cminus: + fixes f :: "'i \ ereal" fixes A assumes "A \ {}" and "a \ -\" shows "(SUP x:A. a - f x) = a - (INF x:A. f x)" using Sup_ereal_cminus[of "f`A" a] assms @@ -1692,7 +1678,7 @@ qed lemma INFI_ereal_cminus: - fixes A assumes "A \ {}" and "\a\ \ \" + fixes a :: ereal assumes "A \ {}" and "\a\ \ \" shows "(INF x:A. a - f x) = a - (SUP x:A. f x)" using Inf_ereal_cminus[of "f`A" a] assms unfolding SUPR_def INFI_def image_image @@ -1703,6 +1689,7 @@ by (cases rule: ereal2_cases[of a b]) auto lemma INFI_ereal_add: + fixes f :: "nat \ ereal" assumes "decseq f" "decseq g" and fin: "\i. f i \ \" "\i. g i \ \" shows "(INF i. f i + g i) = INFI UNIV f + INFI UNIV g" proof - @@ -1824,6 +1811,7 @@ by (metis atLeastAtMost_singleton closed_ereal_atLeastAtMost) lemma ereal_open_cont_interval: + fixes S :: "ereal set" assumes "open S" "x \ S" "\x\ \ \" obtains e where "e>0" "{x-e <..< x+e} \ S" proof- @@ -1841,6 +1829,7 @@ qed lemma ereal_open_cont_interval2: + fixes S :: "ereal set" assumes "open S" "x \ S" and x: "\x\ \ \" obtains a b where "a < x" "x < b" "{a <..< b} \ S" proof- @@ -1901,9 +1890,13 @@ qed lemma Lim_PInfty: "f ----> \ <-> (ALL B. EX N. ALL n>=N. f n >= ereal B)" (is "?l = ?r") -proof assume ?r show ?l apply(rule topological_tendstoI) +proof + assume ?r + show ?l + apply(rule topological_tendstoI) unfolding eventually_sequentially - proof- fix S assume "open S" "\ : S" + proof- + fix S :: "ereal set" assume "open S" "\ : S" from open_PInfty[OF this] guess B .. note B=this from `?r`[rule_format,of "B+1"] guess N .. note N=this show "EX N. ALL n>=N. f n : S" apply(rule_tac x=N in exI) @@ -1913,7 +1906,9 @@ finally show ?case using B by fastsimp qed qed -next assume ?l show ?r +next + assume ?l + show ?r proof fix B::real have "open {ereal B<..}" "\ : {ereal B<..}" by auto from topological_tendstoD[OF `?l` this,unfolded eventually_sequentially] guess N .. note N=this @@ -1923,9 +1918,14 @@ lemma Lim_MInfty: "f ----> (-\) <-> (ALL B. EX N. ALL n>=N. f n <= ereal B)" (is "?l = ?r") -proof assume ?r show ?l apply(rule topological_tendstoI) +proof + assume ?r + show ?l + apply(rule topological_tendstoI) unfolding eventually_sequentially - proof- fix S assume "open S" "(-\) : S" + proof- + fix S :: "ereal set" + assume "open S" "(-\) : S" from open_MInfty[OF this] guess B .. note B=this from `?r`[rule_format,of "B-(1::real)"] guess N .. note N=this show "EX N. ALL n>=N. f n : S" apply(rule_tac x=N in exI) @@ -2041,7 +2041,7 @@ by (cases rule: ereal2_cases[of a b]) auto lemma real_of_ereal_eq_0: - "real x = 0 \ x = \ \ x = -\ \ x = 0" + fixes x :: ereal shows "real x = 0 \ x = \ \ x = -\ \ x = 0" by (cases x) auto lemma tendsto_ereal_realD: @@ -2075,6 +2075,7 @@ (simp_all add: zero_less_mult_iff) lemma ereal_inj_affinity: + fixes m t :: ereal assumes "\m\ \ \" "m \ 0" "\t\ \ \" shows "inj_on (\x. m * x + t) A" using assms @@ -2082,33 +2083,39 @@ (auto intro!: inj_onI simp: ereal_add_cancel_right ereal_mult_cancel_left) lemma ereal_PInfty_eq_plus[simp]: + fixes a b :: ereal shows "\ = a + b \ a = \ \ b = \" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_MInfty_eq_plus[simp]: + fixes a b :: ereal shows "-\ = a + b \ (a = -\ \ b \ \) \ (b = -\ \ a \ \)" by (cases rule: ereal2_cases[of a b]) auto lemma ereal_less_divide_pos: - "x > 0 \ x \ \ \ y < z / x \ x * y < z" + fixes x y :: ereal + shows "x > 0 \ x \ \ \ y < z / x \ x * y < z" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_divide_less_pos: - "x > 0 \ x \ \ \ y / x < z \ y < x * z" + fixes x y z :: ereal + shows "x > 0 \ x \ \ \ y / x < z \ y < x * z" by (cases rule: ereal3_cases[of x y z]) (auto simp: field_simps) lemma ereal_divide_eq: - "b \ 0 \ \b\ \ \ \ a / b = c \ a = b * c" + fixes a b c :: ereal + shows "b \ 0 \ \b\ \ \ \ a / b = c \ a = b * c" by (cases rule: ereal3_cases[of a b c]) (simp_all add: field_simps) -lemma ereal_inverse_not_MInfty[simp]: "inverse a \ -\" +lemma ereal_inverse_not_MInfty[simp]: "inverse (a::ereal) \ -\" by (cases a) auto lemma ereal_mult_m1[simp]: "x * ereal (-1) = -x" by (cases x) auto lemma ereal_LimI_finite: + fixes x :: ereal assumes "\x\ \ \" assumes "!!r. 0 < r ==> EX N. ALL n>=N. u n < x + r & x < u n + r" shows "u ----> x" @@ -2138,6 +2145,7 @@ qed lemma ereal_LimI_finite_iff: + fixes x :: ereal assumes "\x\ \ \" shows "u ----> x <-> (ALL r. 0 < r --> (EX N. ALL n>=N. u n < x + r & x < u n + r))" (is "?lhs <-> ?rhs") @@ -2503,7 +2511,7 @@ from this show ?thesis using ext by blast qed -lemma open_image_ereal: "open(UNIV-{\,(-\)})" +lemma open_image_ereal: "open(UNIV-{ \ , (-\ :: ereal)})" by (metis range_ereal open_ereal open_UNIV) lemma ereal_le_distrib: diff -r c6f35921056e -r ab93d0190a5d src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy --- a/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Tue Jul 19 14:37:49 2011 +0200 +++ b/src/HOL/Multivariate_Analysis/Extended_Real_Limits.thy Tue Jul 19 14:38:29 2011 +0200 @@ -163,6 +163,7 @@ qed lemma ereal_open_affinity_pos: + fixes S :: "ereal set" assumes "open S" and m: "m \ \" "0 < m" and t: "\t\ \ \" shows "open ((\x. m * x + t) ` S)" proof - @@ -209,6 +210,7 @@ qed lemma ereal_open_affinity: + fixes S :: "ereal set" assumes "open S" and m: "\m\ \ \" "m \ 0" and t: "\t\ \ \" shows "open ((\x. m * x + t) ` S)" proof cases @@ -268,7 +270,7 @@ qed -lemma ereal_open_atLeast: "open {x..} \ x = -\" +lemma ereal_open_atLeast: fixes x :: ereal shows "open {x..} \ x = -\" proof assume "x = -\" then have "{x..} = UNIV" by auto then show "open {x..}" by auto @@ -384,7 +386,7 @@ shows "(f ---> \) net \ Liminf net f = \" proof (intro lim_imp_Liminf iffI assms) assume rhs: "Liminf net f = \" - { fix S assume "open S & \ : S" + { fix S :: "ereal set" assume "open S & \ : S" then obtain m where "{ereal m<..} <= S" using open_PInfty2 by auto moreover have "eventually (\x. f x \ {ereal m<..}) net" using rhs unfolding Liminf_Sup top_ereal_def[symmetric] Sup_eq_top_iff @@ -893,7 +895,7 @@ using continuous_at_iff_ereal assms by (auto simp add: continuous_on_eq_continuous_at) -lemma continuous_on_real: "continuous_on (UNIV-{\,(-\)}) real" +lemma continuous_on_real: "continuous_on (UNIV-{\,(-\::ereal)}) real" using continuous_at_of_ereal continuous_on_eq_continuous_at open_image_ereal by auto @@ -1001,7 +1003,9 @@ assume "finite A" then show ?thesis by induct auto qed simp -lemma setsum_Pinfty: "(\x\P. f x) = \ \ (finite P \ (\i\P. f i = \))" +lemma setsum_Pinfty: + fixes f :: "'a \ ereal" + shows "(\x\P. f x) = \ \ (finite P \ (\i\P. f i = \))" proof safe assume *: "setsum f P = \" show "finite P" @@ -1023,6 +1027,7 @@ qed lemma setsum_Inf: + fixes f :: "'a \ ereal" shows "\setsum f A\ = \ \ (finite A \ (\i\A. \f i\ = \))" proof assume *: "\setsum f A\ = \" @@ -1045,6 +1050,7 @@ qed lemma setsum_real_of_ereal: + fixes f :: "'i \ ereal" assumes "\x. x \ S \ \f x\ \ \" shows "(\x\S. real (f x)) = real (setsum f S)" proof - @@ -1186,6 +1192,7 @@ intro!: SUPR_ereal_cmult ) lemma suminf_PInfty: + fixes f :: "nat \ ereal" assumes "\i. 0 \ f i" "suminf f \ \" shows "f i \ \" proof - @@ -1253,13 +1260,14 @@ qed lemma suminf_ereal_PInf[simp]: - "(\x. \) = \" + "(\x. \::ereal) = \" proof - - have "(\i) \ (\x. \)" by (rule suminf_upper) auto + have "(\i) \ (\x. \::ereal)" by (rule suminf_upper) auto then show ?thesis by simp qed lemma summable_real_of_ereal: + fixes f :: "nat \ ereal" assumes f: "\i. 0 \ f i" and fin: "(\i. f i) \ \" shows "summable (\i. real (f i))" proof (rule summable_def[THEN iffD2]) diff -r c6f35921056e -r ab93d0190a5d src/HOL/Probability/Borel_Space.thy --- a/src/HOL/Probability/Borel_Space.thy Tue Jul 19 14:37:49 2011 +0200 +++ b/src/HOL/Probability/Borel_Space.thy Tue Jul 19 14:38:29 2011 +0200 @@ -1122,7 +1122,7 @@ show "(real -` B \ space borel :: ereal set) \ sets borel" proof cases assume "0 \ B" - then have *: "real -` B = real -` (B - {0}) \ {-\, \, 0}" + then have *: "real -` B = real -` (B - {0}) \ {-\, \, 0::ereal}" by (auto simp add: real_of_ereal_eq_0) then show "(real -` B :: ereal set) \ space borel \ sets borel" using open_real by auto @@ -1148,7 +1148,8 @@ qed auto lemma (in sigma_algebra) borel_measurable_ereal_iff_real: - "f \ borel_measurable M \ + fixes f :: "'a \ ereal" + shows "f \ borel_measurable M \ ((\x. real (f x)) \ borel_measurable M \ f -` {\} \ space M \ sets M \ f -` {-\} \ space M \ sets M)" proof safe assume *: "(\x. real (f x)) \ borel_measurable M" "f -` {\} \ space M \ sets M" "f -` {-\} \ space M \ sets M" @@ -1208,7 +1209,8 @@ qed auto lemma (in sigma_algebra) borel_measurable_eq_atMost_ereal: - "(f::'a \ ereal) \ borel_measurable M \ (\a. f -` {..a} \ space M \ sets M)" + fixes f :: "'a \ ereal" + shows "f \ borel_measurable M \ (\a. f -` {..a} \ space M \ sets M)" proof (intro iffI allI) assume pos[rule_format]: "\a. f -` {..a} \ space M \ sets M" show "f \ borel_measurable M" @@ -1226,7 +1228,7 @@ by (auto simp: not_le) then show "f -` {\} \ space M \ sets M" using pos by (auto simp del: UN_simps intro!: Diff) moreover - have "{-\} = {..-\}" by auto + have "{-\::ereal} = {..-\}" by auto then show "f -` {-\} \ space M \ sets M" using pos by auto moreover have "{x\space M. f x \ ereal a} \ sets M" using pos[of "ereal a"] by (simp add: vimage_def Int_def conj_commute) diff -r c6f35921056e -r ab93d0190a5d src/HOL/Probability/Radon_Nikodym.thy --- a/src/HOL/Probability/Radon_Nikodym.thy Tue Jul 19 14:37:49 2011 +0200 +++ b/src/HOL/Probability/Radon_Nikodym.thy Tue Jul 19 14:38:29 2011 +0200 @@ -951,15 +951,15 @@ proof (rule AE_I') { fix f :: "'a \ ereal" assume borel: "f \ borel_measurable M" and eq: "\A. A \ sets M \ ?\ A = (\\<^isup>+x. f x * indicator A x \M)" - let "?A i" = "Q0 \ {x \ space M. f x < of_nat i}" + let "?A i" = "Q0 \ {x \ space M. f x < (i::nat)}" have "(\i. ?A i) \ null_sets" proof (rule null_sets_UN) - fix i have "?A i \ sets M" + fix i ::nat have "?A i \ sets M" using borel Q0(1) by auto - have "?\ (?A i) \ (\\<^isup>+x. of_nat i * indicator (?A i) x \M)" + have "?\ (?A i) \ (\\<^isup>+x. (i::ereal) * indicator (?A i) x \M)" unfolding eq[OF `?A i \ sets M`] by (auto intro!: positive_integral_mono simp: indicator_def) - also have "\ = of_nat i * \ (?A i)" + also have "\ = i * \ (?A i)" using `?A i \ sets M` by (auto intro!: positive_integral_cmult_indicator) also have "\ < \" using `?A i \ sets M`[THEN finite_measure] by auto @@ -1067,7 +1067,7 @@ interpret \: measure_space ?N where "borel_measurable ?N = borel_measurable M" and "measure ?N = \" and "sets ?N = sets M" and "space ?N = space M" using \ by (auto simp: measurable_def) - def A \ "\i. f -` (case i of 0 \ {\} | Suc n \ {.. of_nat (Suc n)}) \ space M" + def A \ "\i. f -` (case i of 0 \ {\} | Suc n \ {.. ereal(of_nat (Suc n))}) \ space M" { fix i j have "A i \ Q j \ sets M" unfolding A_def using f Q apply (rule_tac Int) @@ -1095,7 +1095,7 @@ case PInf with x show ?thesis unfolding A_def by (auto intro: exI[of _ 0]) next case (real r) - with less_PInf_Ex_of_nat[of "f x"] obtain n where "f x < of_nat n" by (auto simp: real_eq_of_nat) + with less_PInf_Ex_of_nat[of "f x"] obtain n :: nat where "f x < n" by (auto simp: real_eq_of_nat) then show ?thesis using x real unfolding A_def by (auto intro!: exI[of _ "Suc n"]) next case MInf with x show ?thesis @@ -1115,9 +1115,9 @@ next case (Suc n) then have "(\\<^isup>+x. f x * indicator (A i \ Q j) x \M) \ - (\\<^isup>+x. of_nat (Suc n) * indicator (Q j) x \M)" + (\\<^isup>+x. (Suc n :: ereal) * indicator (Q j) x \M)" by (auto intro!: positive_integral_mono simp: indicator_def A_def) - also have "\ = of_nat (Suc n) * \ (Q j)" + also have "\ = Suc n * \ (Q j)" using Q by (auto intro!: positive_integral_cmult_indicator) also have "\ < \" using Q by (auto simp: real_eq_of_nat[symmetric])