# HG changeset patch # User hoelzl # Date 1384280935 -3600 # Node ID 7fb88ed6ff3c5a109f92332359bb89f7a20634b9 # Parent eaf25431d4c427b680671afd5628b42bbf4dbb52 better support for enat and ereal conversions diff -r eaf25431d4c4 -r 7fb88ed6ff3c src/HOL/Library/Extended_Nat.thy --- a/src/HOL/Library/Extended_Nat.thy Tue Nov 12 19:28:55 2013 +0100 +++ b/src/HOL/Library/Extended_Nat.thy Tue Nov 12 19:28:55 2013 +0100 @@ -60,10 +60,10 @@ lemmas enat2_cases = enat.exhaust[case_product enat.exhaust] lemmas enat3_cases = enat.exhaust[case_product enat.exhaust enat.exhaust] -lemma not_infinity_eq [iff]: "(x \ \) = (EX i. x = enat i)" +lemma not_infinity_eq [iff]: "(x \ \) = (\i. x = enat i)" by (cases x) auto -lemma not_enat_eq [iff]: "(ALL y. x ~= enat y) = (x = \)" +lemma not_enat_eq [iff]: "(\y. x \ enat y) = (x = \)" by (cases x) auto primrec the_enat :: "enat \ nat" @@ -94,6 +94,12 @@ lemma enat_1 [code_post]: "enat 1 = 1" by (simp add: one_enat_def) +lemma enat_0_iff: "enat x = 0 \ x = 0" "0 = enat x \ x = 0" + by (auto simp add: zero_enat_def) + +lemma enat_1_iff: "enat x = 1 \ x = 1" "1 = enat x \ x = 1" + by (auto simp add: one_enat_def) + lemma one_eSuc: "1 = eSuc 0" by (simp add: zero_enat_def one_enat_def eSuc_def) diff -r eaf25431d4c4 -r 7fb88ed6ff3c src/HOL/Library/Extended_Real.thy --- a/src/HOL/Library/Extended_Real.thy Tue Nov 12 19:28:55 2013 +0100 +++ b/src/HOL/Library/Extended_Real.thy Tue Nov 12 19:28:55 2013 +0100 @@ -188,6 +188,11 @@ "0 = ereal r \ r = 0" unfolding zero_ereal_def by simp_all +lemma ereal_eq_1[simp]: + "ereal r = 1 \ r = 1" + "1 = ereal r \ r = 1" + unfolding one_ereal_def by simp_all + instance proof fix a b c :: ereal @@ -288,9 +293,11 @@ lemma ereal_less[simp]: "ereal r < 0 \ (r < 0)" "0 < ereal r \ (0 < r)" + "ereal r < 1 \ (r < 1)" + "1 < ereal r \ (1 < r)" "0 < (\::ereal)" "-(\::ereal) < 0" - by (simp_all add: zero_ereal_def) + by (simp_all add: zero_ereal_def one_ereal_def) lemma ereal_less_eq[simp]: "x \ (\::ereal)" @@ -298,7 +305,9 @@ "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) + "ereal r \ 1 \ r \ 1" + "1 \ ereal r \ 1 \ r" + by (auto simp add: less_eq_ereal_def zero_ereal_def one_ereal_def) lemma ereal_infty_less_eq2: "a \ b \ a = \ \ b = (\::ereal)" @@ -458,6 +467,11 @@ shows "\a\ \ \ \ c < b \ a + c < a + b" by (cases rule: ereal2_cases[of b c]) auto +lemma ereal_add_nonneg_eq_0_iff: + fixes a b :: ereal + shows "0 \ a \ 0 \ b \ a + b = 0 \ a = 0 \ b = 0" + by (cases a b rule: ereal2_cases) auto + lemma ereal_uminus_eq_reorder: "- a = b \ a = (-b::ereal)" by auto @@ -516,8 +530,8 @@ lemma fixes f :: "nat \ ereal" - shows incseq_uminus[simp]: "incseq (\x. - f x) \ decseq f" - and decseq_uminus[simp]: "decseq (\x. - f x) \ incseq f" + shows ereal_incseq_uminus[simp]: "incseq (\x. - f x) \ decseq f" + and ereal_decseq_uminus[simp]: "decseq (\x. - f x) \ incseq f" unfolding decseq_def incseq_def by auto lemma incseq_ereal: "incseq f \ incseq (\x. ereal (f x))" @@ -620,14 +634,6 @@ lemma ereal_m1_less_0[simp]: "-(1::ereal) < 0" by (simp add: zero_ereal_def one_ereal_def) -lemma ereal_zero_m1[simp]: "1 \ (0::ereal)" - by (simp add: zero_ereal_def one_ereal_def) - -lemma ereal_times_0[simp]: - fixes x :: ereal - shows "0 * x = 0" - by (cases x) (auto simp: zero_ereal_def) - lemma ereal_times[simp]: "1 \ (\::ereal)" "(\::ereal) \ 1" "1 \ -(\::ereal)" "-(\::ereal) \ 1" @@ -655,12 +661,12 @@ (a = \ \ b < 0) \ (a < 0 \ b = \) \ (a = -\ \ b > 0) \ (a > 0 \ b = -\)" by (cases rule: ereal2_cases[of a b]) auto +lemma ereal_abs_mult: "\x * y :: ereal\ = \x\ * \y\" + by (cases x y rule: ereal2_cases) (auto simp: abs_mult) + lemma ereal_0_less_1[simp]: "0 < (1::ereal)" by (simp_all add: zero_ereal_def one_ereal_def) -lemma ereal_zero_one[simp]: "0 \ (1::ereal)" - by (simp_all add: zero_ereal_def one_ereal_def) - lemma ereal_mult_minus_left[simp]: fixes a b :: ereal shows "-a * b = - (a * b)" @@ -952,7 +958,7 @@ by simp } then show ?thesis - by (auto intro!: image_eqI) + by force qed lemma ereal_uminus_greaterThan[simp]: "uminus ` {(a::ereal)<..} = {..<-a}" @@ -1267,7 +1273,7 @@ shows "z / x \ z / y" using assms by (cases x y z rule: ereal3_cases) - (auto intro: divide_left_mono simp: field_simps sign_simps split: split_if_asm) + (auto intro: divide_left_mono simp: field_simps zero_less_mult_iff mult_less_0_iff split: split_if_asm) lemma ereal_divide_zero_left[simp]: fixes a :: ereal @@ -1277,7 +1283,7 @@ lemma ereal_times_divide_eq_left[simp]: fixes a b c :: ereal shows "b / c * a = b * a / c" - by (cases a b c rule: ereal3_cases) (auto simp: field_simps sign_simps) + by (cases a b c rule: ereal3_cases) (auto simp: field_simps zero_less_mult_iff mult_less_0_iff) subsection "Complete lattice" @@ -1380,7 +1386,7 @@ instance ereal :: linear_continuum proof show "\a b::ereal. a \ b" - using ereal_zero_one by blast + using zero_neq_one by blast qed lemma ereal_Sup_uminus_image_eq: "Sup (uminus ` S::ereal set) = - Inf S" @@ -1394,6 +1400,18 @@ lemma ereal_Inf_uminus_image_eq: "Inf (uminus ` S::ereal set) = - Sup S" using ereal_Sup_uminus_image_eq[of "uminus ` S"] by simp +lemma ereal_SUP_not_infty: + fixes f :: "_ \ ereal" + shows "A \ {} \ l \ -\ \ u \ \ \ \a\A. l \ f a \ f a \ u \ \SUPR A f\ \ \" + using SUP_upper2[of _ A l f] SUP_least[of A f u] + by (cases "SUPR A f") auto + +lemma ereal_INF_not_infty: + fixes f :: "_ \ ereal" + shows "A \ {} \ l \ -\ \ u \ \ \ \a\A. l \ f a \ f a \ u \ \INFI A f\ \ \" + using INF_lower2[of _ A f u] INF_greatest[of A l f] + by (cases "INFI A f") auto + lemma ereal_SUPR_uminus: fixes f :: "'a \ ereal" shows "(SUP i : R. -(f i)) = -(INF i : R. f i)" @@ -1712,8 +1730,7 @@ next case False have "\x\A. 0 \ x" - by (metis Infty_neq_0 PInf complete_lattice_class.Sup_least - ereal_infty_less_eq2 linorder_linear) + by (metis Infty_neq_0(2) PInf complete_lattice_class.Sup_least ereal_infty_less_eq2(1) linorder_linear) then obtain x where "x \ A" and "0 \ x" by auto have "\n::nat. \f. f \ A \ x + ereal (real n) \ f" @@ -1845,7 +1862,6 @@ finally show ?thesis . qed - subsection "Relation to @{typ enat}" definition "ereal_of_enat n = (case n of enat n \ ereal (real n) | \ \ \)" @@ -2413,12 +2429,6 @@ (is "?lhs \ ?rhs") unfolding le_Liminf_iff eventually_sequentially .. -lemma - fixes X :: "nat \ ereal" - shows ereal_incseq_uminus[simp]: "incseq (\i. - X i) = decseq X" - and ereal_decseq_uminus[simp]: "decseq (\i. - X i) = incseq X" - unfolding incseq_def decseq_def by auto - subsubsection {* Tests for code generator *}