better support for enat and ereal conversions
authorhoelzl
Tue, 12 Nov 2013 19:28:55 +0100
changeset 557897fb88ed6ff3c
parent 55788 eaf25431d4c4
child 55790 dbb8ecfe1337
better support for enat and ereal conversions
src/HOL/Library/Extended_Nat.thy
src/HOL/Library/Extended_Real.thy
     1.1 --- a/src/HOL/Library/Extended_Nat.thy	Tue Nov 12 19:28:55 2013 +0100
     1.2 +++ b/src/HOL/Library/Extended_Nat.thy	Tue Nov 12 19:28:55 2013 +0100
     1.3 @@ -60,10 +60,10 @@
     1.4  lemmas enat2_cases = enat.exhaust[case_product enat.exhaust]
     1.5  lemmas enat3_cases = enat.exhaust[case_product enat.exhaust enat.exhaust]
     1.6  
     1.7 -lemma not_infinity_eq [iff]: "(x \<noteq> \<infinity>) = (EX i. x = enat i)"
     1.8 +lemma not_infinity_eq [iff]: "(x \<noteq> \<infinity>) = (\<exists>i. x = enat i)"
     1.9    by (cases x) auto
    1.10  
    1.11 -lemma not_enat_eq [iff]: "(ALL y. x ~= enat y) = (x = \<infinity>)"
    1.12 +lemma not_enat_eq [iff]: "(\<forall>y. x \<noteq> enat y) = (x = \<infinity>)"
    1.13    by (cases x) auto
    1.14  
    1.15  primrec the_enat :: "enat \<Rightarrow> nat"
    1.16 @@ -94,6 +94,12 @@
    1.17  lemma enat_1 [code_post]: "enat 1 = 1"
    1.18    by (simp add: one_enat_def)
    1.19  
    1.20 +lemma enat_0_iff: "enat x = 0 \<longleftrightarrow> x = 0" "0 = enat x \<longleftrightarrow> x = 0"
    1.21 +  by (auto simp add: zero_enat_def)
    1.22 +
    1.23 +lemma enat_1_iff: "enat x = 1 \<longleftrightarrow> x = 1" "1 = enat x \<longleftrightarrow> x = 1"
    1.24 +  by (auto simp add: one_enat_def)
    1.25 +
    1.26  lemma one_eSuc: "1 = eSuc 0"
    1.27    by (simp add: zero_enat_def one_enat_def eSuc_def)
    1.28  
     2.1 --- a/src/HOL/Library/Extended_Real.thy	Tue Nov 12 19:28:55 2013 +0100
     2.2 +++ b/src/HOL/Library/Extended_Real.thy	Tue Nov 12 19:28:55 2013 +0100
     2.3 @@ -188,6 +188,11 @@
     2.4    "0 = ereal r \<longleftrightarrow> r = 0"
     2.5    unfolding zero_ereal_def by simp_all
     2.6  
     2.7 +lemma ereal_eq_1[simp]:
     2.8 +  "ereal r = 1 \<longleftrightarrow> r = 1"
     2.9 +  "1 = ereal r \<longleftrightarrow> r = 1"
    2.10 +  unfolding one_ereal_def by simp_all
    2.11 +
    2.12  instance
    2.13  proof
    2.14    fix a b c :: ereal
    2.15 @@ -288,9 +293,11 @@
    2.16  lemma ereal_less[simp]:
    2.17    "ereal r < 0 \<longleftrightarrow> (r < 0)"
    2.18    "0 < ereal r \<longleftrightarrow> (0 < r)"
    2.19 +  "ereal r < 1 \<longleftrightarrow> (r < 1)"
    2.20 +  "1 < ereal r \<longleftrightarrow> (1 < r)"
    2.21    "0 < (\<infinity>::ereal)"
    2.22    "-(\<infinity>::ereal) < 0"
    2.23 -  by (simp_all add: zero_ereal_def)
    2.24 +  by (simp_all add: zero_ereal_def one_ereal_def)
    2.25  
    2.26  lemma ereal_less_eq[simp]:
    2.27    "x \<le> (\<infinity>::ereal)"
    2.28 @@ -298,7 +305,9 @@
    2.29    "ereal r \<le> ereal p \<longleftrightarrow> r \<le> p"
    2.30    "ereal r \<le> 0 \<longleftrightarrow> r \<le> 0"
    2.31    "0 \<le> ereal r \<longleftrightarrow> 0 \<le> r"
    2.32 -  by (auto simp add: less_eq_ereal_def zero_ereal_def)
    2.33 +  "ereal r \<le> 1 \<longleftrightarrow> r \<le> 1"
    2.34 +  "1 \<le> ereal r \<longleftrightarrow> 1 \<le> r"
    2.35 +  by (auto simp add: less_eq_ereal_def zero_ereal_def one_ereal_def)
    2.36  
    2.37  lemma ereal_infty_less_eq2:
    2.38    "a \<le> b \<Longrightarrow> a = \<infinity> \<Longrightarrow> b = (\<infinity>::ereal)"
    2.39 @@ -458,6 +467,11 @@
    2.40    shows "\<bar>a\<bar> \<noteq> \<infinity> \<Longrightarrow> c < b \<Longrightarrow> a + c < a + b"
    2.41    by (cases rule: ereal2_cases[of b c]) auto
    2.42  
    2.43 +lemma ereal_add_nonneg_eq_0_iff:
    2.44 +  fixes a b :: ereal
    2.45 +  shows "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> a + b = 0 \<longleftrightarrow> a = 0 \<and> b = 0"
    2.46 +  by (cases a b rule: ereal2_cases) auto
    2.47 +
    2.48  lemma ereal_uminus_eq_reorder: "- a = b \<longleftrightarrow> a = (-b::ereal)"
    2.49    by auto
    2.50  
    2.51 @@ -516,8 +530,8 @@
    2.52  
    2.53  lemma
    2.54    fixes f :: "nat \<Rightarrow> ereal"
    2.55 -  shows incseq_uminus[simp]: "incseq (\<lambda>x. - f x) \<longleftrightarrow> decseq f"
    2.56 -  and decseq_uminus[simp]: "decseq (\<lambda>x. - f x) \<longleftrightarrow> incseq f"
    2.57 +  shows ereal_incseq_uminus[simp]: "incseq (\<lambda>x. - f x) \<longleftrightarrow> decseq f"
    2.58 +    and ereal_decseq_uminus[simp]: "decseq (\<lambda>x. - f x) \<longleftrightarrow> incseq f"
    2.59    unfolding decseq_def incseq_def by auto
    2.60  
    2.61  lemma incseq_ereal: "incseq f \<Longrightarrow> incseq (\<lambda>x. ereal (f x))"
    2.62 @@ -620,14 +634,6 @@
    2.63  lemma ereal_m1_less_0[simp]: "-(1::ereal) < 0"
    2.64    by (simp add: zero_ereal_def one_ereal_def)
    2.65  
    2.66 -lemma ereal_zero_m1[simp]: "1 \<noteq> (0::ereal)"
    2.67 -  by (simp add: zero_ereal_def one_ereal_def)
    2.68 -
    2.69 -lemma ereal_times_0[simp]:
    2.70 -  fixes x :: ereal
    2.71 -  shows "0 * x = 0"
    2.72 -  by (cases x) (auto simp: zero_ereal_def)
    2.73 -
    2.74  lemma ereal_times[simp]:
    2.75    "1 \<noteq> (\<infinity>::ereal)" "(\<infinity>::ereal) \<noteq> 1"
    2.76    "1 \<noteq> -(\<infinity>::ereal)" "-(\<infinity>::ereal) \<noteq> 1"
    2.77 @@ -655,12 +661,12 @@
    2.78      (a = \<infinity> \<and> b < 0) \<or> (a < 0 \<and> b = \<infinity>) \<or> (a = -\<infinity> \<and> b > 0) \<or> (a > 0 \<and> b = -\<infinity>)"
    2.79    by (cases rule: ereal2_cases[of a b]) auto
    2.80  
    2.81 +lemma ereal_abs_mult: "\<bar>x * y :: ereal\<bar> = \<bar>x\<bar> * \<bar>y\<bar>"
    2.82 +  by (cases x y rule: ereal2_cases) (auto simp: abs_mult)
    2.83 +
    2.84  lemma ereal_0_less_1[simp]: "0 < (1::ereal)"
    2.85    by (simp_all add: zero_ereal_def one_ereal_def)
    2.86  
    2.87 -lemma ereal_zero_one[simp]: "0 \<noteq> (1::ereal)"
    2.88 -  by (simp_all add: zero_ereal_def one_ereal_def)
    2.89 -
    2.90  lemma ereal_mult_minus_left[simp]:
    2.91    fixes a b :: ereal
    2.92    shows "-a * b = - (a * b)"
    2.93 @@ -952,7 +958,7 @@
    2.94        by simp
    2.95    }
    2.96    then show ?thesis
    2.97 -    by (auto intro!: image_eqI)
    2.98 +    by force
    2.99  qed
   2.100  
   2.101  lemma ereal_uminus_greaterThan[simp]: "uminus ` {(a::ereal)<..} = {..<-a}"
   2.102 @@ -1267,7 +1273,7 @@
   2.103    shows "z / x \<le> z / y"
   2.104    using assms
   2.105    by (cases x y z rule: ereal3_cases)
   2.106 -    (auto intro: divide_left_mono simp: field_simps sign_simps split: split_if_asm)
   2.107 +     (auto intro: divide_left_mono simp: field_simps zero_less_mult_iff mult_less_0_iff split: split_if_asm)
   2.108  
   2.109  lemma ereal_divide_zero_left[simp]:
   2.110    fixes a :: ereal
   2.111 @@ -1277,7 +1283,7 @@
   2.112  lemma ereal_times_divide_eq_left[simp]:
   2.113    fixes a b c :: ereal
   2.114    shows "b / c * a = b * a / c"
   2.115 -  by (cases a b c rule: ereal3_cases) (auto simp: field_simps sign_simps)
   2.116 +  by (cases a b c rule: ereal3_cases) (auto simp: field_simps zero_less_mult_iff mult_less_0_iff)
   2.117  
   2.118  
   2.119  subsection "Complete lattice"
   2.120 @@ -1380,7 +1386,7 @@
   2.121  instance ereal :: linear_continuum
   2.122  proof
   2.123    show "\<exists>a b::ereal. a \<noteq> b"
   2.124 -    using ereal_zero_one by blast
   2.125 +    using zero_neq_one by blast
   2.126  qed
   2.127  
   2.128  lemma ereal_Sup_uminus_image_eq: "Sup (uminus ` S::ereal set) = - Inf S"
   2.129 @@ -1394,6 +1400,18 @@
   2.130  lemma ereal_Inf_uminus_image_eq: "Inf (uminus ` S::ereal set) = - Sup S"
   2.131    using ereal_Sup_uminus_image_eq[of "uminus ` S"] by simp
   2.132  
   2.133 +lemma ereal_SUP_not_infty:
   2.134 +  fixes f :: "_ \<Rightarrow> ereal"
   2.135 +  shows "A \<noteq> {} \<Longrightarrow> l \<noteq> -\<infinity> \<Longrightarrow> u \<noteq> \<infinity> \<Longrightarrow> \<forall>a\<in>A. l \<le> f a \<and> f a \<le> u \<Longrightarrow> \<bar>SUPR A f\<bar> \<noteq> \<infinity>"
   2.136 +  using SUP_upper2[of _ A l f] SUP_least[of A f u]
   2.137 +  by (cases "SUPR A f") auto
   2.138 +
   2.139 +lemma ereal_INF_not_infty:
   2.140 +  fixes f :: "_ \<Rightarrow> ereal"
   2.141 +  shows "A \<noteq> {} \<Longrightarrow> l \<noteq> -\<infinity> \<Longrightarrow> u \<noteq> \<infinity> \<Longrightarrow> \<forall>a\<in>A. l \<le> f a \<and> f a \<le> u \<Longrightarrow> \<bar>INFI A f\<bar> \<noteq> \<infinity>"
   2.142 +  using INF_lower2[of _ A f u] INF_greatest[of A l f]
   2.143 +  by (cases "INFI A f") auto
   2.144 +
   2.145  lemma ereal_SUPR_uminus:
   2.146    fixes f :: "'a \<Rightarrow> ereal"
   2.147    shows "(SUP i : R. -(f i)) = -(INF i : R. f i)"
   2.148 @@ -1712,8 +1730,7 @@
   2.149    next
   2.150      case False
   2.151      have "\<exists>x\<in>A. 0 \<le> x"
   2.152 -      by (metis Infty_neq_0 PInf complete_lattice_class.Sup_least
   2.153 -          ereal_infty_less_eq2 linorder_linear)
   2.154 +      by (metis Infty_neq_0(2) PInf complete_lattice_class.Sup_least ereal_infty_less_eq2(1) linorder_linear)
   2.155      then obtain x where "x \<in> A" and "0 \<le> x"
   2.156        by auto
   2.157      have "\<forall>n::nat. \<exists>f. f \<in> A \<and> x + ereal (real n) \<le> f"
   2.158 @@ -1845,7 +1862,6 @@
   2.159    finally show ?thesis .
   2.160  qed
   2.161  
   2.162 -
   2.163  subsection "Relation to @{typ enat}"
   2.164  
   2.165  definition "ereal_of_enat n = (case n of enat n \<Rightarrow> ereal (real n) | \<infinity> \<Rightarrow> \<infinity>)"
   2.166 @@ -2413,12 +2429,6 @@
   2.167    (is "?lhs \<longleftrightarrow> ?rhs")
   2.168    unfolding le_Liminf_iff eventually_sequentially ..
   2.169  
   2.170 -lemma
   2.171 -  fixes X :: "nat \<Rightarrow> ereal"
   2.172 -  shows ereal_incseq_uminus[simp]: "incseq (\<lambda>i. - X i) = decseq X"
   2.173 -    and ereal_decseq_uminus[simp]: "decseq (\<lambda>i. - X i) = incseq X"
   2.174 -  unfolding incseq_def decseq_def by auto
   2.175 -
   2.176  
   2.177  subsubsection {* Tests for code generator *}
   2.178