src/HOL/Library/Extended_Nonnegative_Real.thy
changeset 62975 1d066f6ab25d
parent 62648 ee48e0b4f669
child 63060 293ede07b775
equal deleted inserted replaced
62974:f17602cbf76a 62975:1d066f6ab25d
     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 
    56 lemma setsum_le_suminf:
   218 lemma setsum_le_suminf:
    57   fixes f :: "nat \<Rightarrow> 'a::{ordered_comm_monoid_add, linorder_topology}"
   219   fixes f :: "nat \<Rightarrow> 'a::{ordered_comm_monoid_add, linorder_topology}"
    58   shows "summable f \<Longrightarrow> finite I \<Longrightarrow> \<forall>m\<in>- I. 0 \<le> f m \<Longrightarrow> setsum f I \<le> suminf f"
   220   shows "summable f \<Longrightarrow> finite I \<Longrightarrow> \<forall>m\<in>- I. 0 \<le> f m \<Longrightarrow> setsum f I \<le> suminf f"
    59   by (rule sums_le[OF _ sums_If_finite_set summable_sums]) auto
   221   by (rule sums_le[OF _ sums_If_finite_set summable_sums]) auto
    60 
   222 
       
   223 subsection \<open>Defining the extended non-negative reals\<close>
       
   224 
       
   225 text \<open>Basic definitions and type class setup\<close>
       
   226 
    61 typedef ennreal = "{x :: ereal. 0 \<le> x}"
   227 typedef ennreal = "{x :: ereal. 0 \<le> x}"
    62   morphisms enn2ereal e2ennreal'
   228   morphisms enn2ereal e2ennreal'
    63   by auto
   229   by auto
    64 
   230 
    65 definition "e2ennreal x = e2ennreal' (max 0 x)"
   231 definition "e2ennreal x = e2ennreal' (max 0 x)"
    66 
   232 
       
   233 lemma enn2ereal_range: "e2ennreal ` {0..} = UNIV"
       
   234 proof -
       
   235   have "\<exists>y\<ge>0. x = e2ennreal y" for x
       
   236     by (cases x) (auto simp: e2ennreal_def max_absorb2)
       
   237   then show ?thesis
       
   238     by (auto simp: image_iff Bex_def)
       
   239 qed
       
   240 
    67 lemma type_definition_ennreal': "type_definition enn2ereal e2ennreal {x. 0 \<le> x}"
   241 lemma type_definition_ennreal': "type_definition enn2ereal e2ennreal {x. 0 \<le> x}"
    68   using type_definition_ennreal
   242   using type_definition_ennreal
    69   by (auto simp: type_definition_def e2ennreal_def max_absorb2)
   243   by (auto simp: type_definition_def e2ennreal_def max_absorb2)
    70 
   244 
    71 setup_lifting type_definition_ennreal'
   245 setup_lifting type_definition_ennreal'
    72 
   246 
    73 lift_definition ennreal :: "real \<Rightarrow> ennreal" is "sup 0 \<circ> ereal"
       
    74   by simp
       
    75 
       
    76 declare [[coercion ennreal]]
       
    77 declare [[coercion e2ennreal]]
   247 declare [[coercion e2ennreal]]
    78 
   248 
    79 instantiation ennreal :: complete_linorder
   249 instantiation ennreal :: complete_linorder
    80 begin
   250 begin
    81 
   251 
    97   by standard
   267   by standard
    98      (transfer ; auto simp: Inf_lower Inf_greatest Sup_upper Sup_least le_max_iff_disj max.absorb1)+
   268      (transfer ; auto simp: Inf_lower Inf_greatest Sup_upper Sup_least le_max_iff_disj max.absorb1)+
    99 
   269 
   100 end
   270 end
   101 
   271 
   102 lemma ennreal_cases:
   272 lemma pcr_ennreal_enn2ereal[simp]: "pcr_ennreal (enn2ereal x) x"
   103   fixes x :: ennreal
   273   by (simp add: ennreal.pcr_cr_eq cr_ennreal_def)
   104   obtains (real) r :: real where "0 \<le> r" "x = ennreal r" | (top) "x = top"
   274 
   105   apply transfer
   275 lemma rel_fun_eq_pcr_ennreal: "rel_fun op = pcr_ennreal f g \<longleftrightarrow> f = enn2ereal \<circ> g"
   106   subgoal for x thesis
   276   by (auto simp: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def)
   107     by (cases x) (auto simp: max.absorb2 top_ereal_def)
       
   108   done
       
   109 
   277 
   110 instantiation ennreal :: infinity
   278 instantiation ennreal :: infinity
   111 begin
   279 begin
   112 
   280 
   113 definition infinity_ennreal :: ennreal
   281 definition infinity_ennreal :: ennreal
   154 
   322 
   155 instance ..
   323 instance ..
   156 
   324 
   157 end
   325 end
   158 
   326 
   159 lemma ennreal_zero_less_one: "0 < (1::ennreal)"
   327 lemma ennreal_zero_less_one: "0 < (1::ennreal)" -- \<open>TODO: remove \<close>
   160   by transfer auto
   328   by transfer auto
   161 
   329 
   162 instance ennreal :: dioid
   330 instance ennreal :: dioid
   163 proof (standard; transfer)
   331 proof (standard; transfer)
   164   fix a b :: ereal assume "0 \<le> a" "0 \<le> b" then show "(a \<le> b) = (\<exists>c\<in>Collect (op \<le> 0). b = a + c)"
   332   fix a b :: ereal assume "0 \<le> a" "0 \<le> b" then show "(a \<le> b) = (\<exists>c\<in>Collect (op \<le> 0). b = a + c)"
   171      (transfer ; auto intro: add_mono mult_mono mult_ac ereal_left_distrib ereal_mult_left_mono)+
   339      (transfer ; auto intro: add_mono mult_mono mult_ac ereal_left_distrib ereal_mult_left_mono)+
   172 
   340 
   173 instance ennreal :: linordered_nonzero_semiring
   341 instance ennreal :: linordered_nonzero_semiring
   174   proof qed (transfer; simp)
   342   proof qed (transfer; simp)
   175 
   343 
       
   344 instance ennreal :: strict_ordered_ab_semigroup_add
       
   345 proof
       
   346   fix a b c d :: ennreal show "a < b \<Longrightarrow> c < d \<Longrightarrow> a + c < b + d"
       
   347     by transfer (auto intro!: ereal_add_strict_mono)
       
   348 qed
       
   349 
   176 declare [[coercion "of_nat :: nat \<Rightarrow> ennreal"]]
   350 declare [[coercion "of_nat :: nat \<Rightarrow> ennreal"]]
   177 
   351 
   178 lemma e2ennreal_neg: "x \<le> 0 \<Longrightarrow> e2ennreal x = 0"
   352 lemma e2ennreal_neg: "x \<le> 0 \<Longrightarrow> e2ennreal x = 0"
   179   unfolding zero_ennreal_def e2ennreal_def by (simp add: max_absorb1)
   353   unfolding zero_ennreal_def e2ennreal_def by (simp add: max_absorb1)
   180 
   354 
   181 lemma e2ennreal_mono: "x \<le> y \<Longrightarrow> e2ennreal x \<le> e2ennreal y"
   355 lemma e2ennreal_mono: "x \<le> y \<Longrightarrow> e2ennreal x \<le> e2ennreal y"
   182   by (cases "0 \<le> x" "0 \<le> y" rule: bool.exhaust[case_product bool.exhaust])
   356   by (cases "0 \<le> x" "0 \<le> y" rule: bool.exhaust[case_product bool.exhaust])
   183      (auto simp: e2ennreal_neg less_eq_ennreal.abs_eq eq_onp_def)
   357      (auto simp: e2ennreal_neg less_eq_ennreal.abs_eq eq_onp_def)
       
   358 
       
   359 lemma enn2ereal_nonneg[simp]: "0 \<le> enn2ereal x"
       
   360   using ennreal.enn2ereal[of x] by simp
       
   361 
       
   362 lemma ereal_ennreal_cases:
       
   363   obtains b where "0 \<le> a" "a = enn2ereal b" | "a < 0"
       
   364   using e2ennreal'_inverse[of a, symmetric] by (cases "0 \<le> a") (auto intro: enn2ereal_nonneg)
       
   365 
       
   366 lemma rel_fun_liminf[transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal liminf liminf"
       
   367 proof -
       
   368   have "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal (\<lambda>x. sup 0 (liminf x)) liminf"
       
   369     unfolding liminf_SUP_INF[abs_def] by (transfer_prover_start, transfer_step+; simp)
       
   370   then show ?thesis
       
   371     apply (subst (asm) (2) rel_fun_def)
       
   372     apply (subst (2) rel_fun_def)
       
   373     apply (auto simp: comp_def max.absorb2 Liminf_bounded rel_fun_eq_pcr_ennreal)
       
   374     done
       
   375 qed
       
   376 
       
   377 lemma rel_fun_limsup[transfer_rule]: "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal limsup limsup"
       
   378 proof -
       
   379   have "rel_fun (rel_fun op = pcr_ennreal) pcr_ennreal (\<lambda>x. INF n. sup 0 (SUP i:{n..}. x i)) limsup"
       
   380     unfolding limsup_INF_SUP[abs_def] by (transfer_prover_start, transfer_step+; simp)
       
   381   then show ?thesis
       
   382     unfolding limsup_INF_SUP[abs_def]
       
   383     apply (subst (asm) (2) rel_fun_def)
       
   384     apply (subst (2) rel_fun_def)
       
   385     apply (auto simp: comp_def max.absorb2 Sup_upper2 rel_fun_eq_pcr_ennreal)
       
   386     apply (subst (asm) max.absorb2)
       
   387     apply (rule SUP_upper2)
       
   388     apply auto
       
   389     done
       
   390 qed
       
   391 
       
   392 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)"
       
   393   by (induction I rule: infinite_finite_induct) (auto simp: setsum_nonneg zero_ennreal.rep_eq plus_ennreal.rep_eq)
       
   394 
       
   395 lemma transfer_e2ennreal_setsum [transfer_rule]:
       
   396   "rel_fun (rel_fun op = pcr_ennreal) (rel_fun op = pcr_ennreal) setsum setsum"
       
   397   by (auto intro!: rel_funI simp: rel_fun_eq_pcr_ennreal comp_def)
       
   398 
       
   399 lemma enn2ereal_of_nat[simp]: "enn2ereal (of_nat n) = ereal n"
       
   400   by (induction n) (auto simp: zero_ennreal.rep_eq one_ennreal.rep_eq plus_ennreal.rep_eq)
       
   401 
       
   402 lemma enn2ereal_numeral[simp]: "enn2ereal (numeral a) = numeral a"
       
   403   apply (subst of_nat_numeral[of a, symmetric])
       
   404   apply (subst enn2ereal_of_nat)
       
   405   apply simp
       
   406   done
       
   407 
       
   408 lemma transfer_numeral[transfer_rule]: "pcr_ennreal (numeral a) (numeral a)"
       
   409   unfolding cr_ennreal_def pcr_ennreal_def by auto
   184 
   410 
   185 subsection \<open>Cancellation simprocs\<close>
   411 subsection \<open>Cancellation simprocs\<close>
   186 
   412 
   187 lemma ennreal_add_left_cancel: "a + b = a + c \<longleftrightarrow> a = (\<infinity>::ennreal) \<or> b = c"
   413 lemma ennreal_add_left_cancel: "a + b = a + c \<longleftrightarrow> a = (\<infinity>::ennreal) \<or> b = c"
   188   unfolding infinity_ennreal_def by transfer (simp add: top_ereal_def ereal_add_cancel_left)
   414   unfolding infinity_ennreal_def by transfer (simp add: top_ereal_def ereal_add_cancel_left)
   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"
   483   "\<forall>\<^sub>F x in F. 0 \<le> f x \<Longrightarrow> 0 \<le> x \<Longrightarrow> ((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F"
  1312   "\<forall>\<^sub>F x in F. 0 \<le> f x \<Longrightarrow> 0 \<le> x \<Longrightarrow> ((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F"
   484   by (auto dest: tendsto_ennrealD)
  1313   by (auto dest: tendsto_ennrealD)
   485      (auto simp: ennreal_def
  1314      (auto simp: ennreal_def
   486            intro!: continuous_on_tendsto_compose[OF continuous_on_e2ennreal[of UNIV]] tendsto_max)
  1315            intro!: continuous_on_tendsto_compose[OF continuous_on_e2ennreal[of UNIV]] tendsto_max)
   487 
  1316 
   488 lemma ennreal_zero[simp]: "ennreal 0 = 0"
  1317 lemma tendsto_enn2ereal_iff[simp]: "((\<lambda>i. enn2ereal (f i)) \<longlongrightarrow> enn2ereal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F"
   489   by (simp add: ennreal_def max.absorb1 zero_ennreal.abs_eq)
  1318   using continuous_on_enn2ereal[THEN continuous_on_tendsto_compose, of f x F]
   490 
  1319     continuous_on_e2ennreal[THEN continuous_on_tendsto_compose, of "\<lambda>x. enn2ereal (f x)" "enn2ereal x" F UNIV]
   491 lemma ennreal_plus[simp]:
  1320   by auto
   492   "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a + b) = ennreal a + ennreal b"
  1321 
   493   by (transfer fixing: a b) (auto simp: max_absorb2)
  1322 lemma continuous_on_add_ennreal:
   494 
  1323   fixes f g :: "'a::topological_space \<Rightarrow> ennreal"
   495 lemma ennreal_inj[simp]:
  1324   shows "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> continuous_on A (\<lambda>x. f x + g x)"
   496   "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal a = ennreal b \<longleftrightarrow> a = b"
  1325   by (transfer fixing: A) (auto intro!: tendsto_add_ereal_nonneg simp: continuous_on_def)
   497   by (transfer fixing: a b) (auto simp: max_absorb2)
  1326 
   498 
  1327 lemma continuous_on_inverse_ennreal[continuous_intros]:
   499 lemma ennreal_le_iff[simp]: "0 \<le> y \<Longrightarrow> ennreal x \<le> ennreal y \<longleftrightarrow> x \<le> y"
  1328   fixes f :: "'a::topological_space \<Rightarrow> ennreal"
   500   by (auto simp: ennreal_def zero_ereal_def less_eq_ennreal.abs_eq eq_onp_def split: split_max)
  1329   shows "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))"
   501 
  1330 proof (transfer fixing: A)
   502 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)"
  1331   show "pred_fun (\<lambda>_. True)  (op \<le> 0) f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))" if "continuous_on A f"
   503   by (induction I rule: infinite_finite_induct) (auto simp: setsum_nonneg)
  1332     for f :: "'a \<Rightarrow> ereal"
       
  1333     using continuous_on_compose2[OF continuous_on_inverse_ereal that] by (auto simp: subset_eq)
       
  1334 qed
       
  1335 
       
  1336 instance ennreal :: topological_comm_monoid_add
       
  1337 proof
       
  1338   show "((\<lambda>x. fst x + snd x) \<longlongrightarrow> a + b) (nhds a \<times>\<^sub>F nhds b)" for a b :: ennreal
       
  1339     using continuous_on_add_ennreal[of UNIV fst snd]
       
  1340     using tendsto_at_iff_tendsto_nhds[symmetric, of "\<lambda>x::(ennreal \<times> ennreal). fst x + snd x"]
       
  1341     by (auto simp: continuous_on_eq_continuous_at)
       
  1342        (simp add: isCont_def nhds_prod[symmetric])
       
  1343 qed
       
  1344 
       
  1345 lemma sup_continuous_add_ennreal[order_continuous_intros]:
       
  1346   fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal"
       
  1347   shows "sup_continuous f \<Longrightarrow> sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>x. f x + g x)"
       
  1348   by transfer (auto intro!: sup_continuous_add)
       
  1349 
       
  1350 lemma ennreal_suminf_lessD: "(\<Sum>i. f i :: ennreal) < x \<Longrightarrow> f i < x"
       
  1351   using le_less_trans[OF setsum_le_suminf[OF summableI, of "{i}" f]] by simp
   504 
  1352 
   505 lemma sums_ennreal[simp]: "(\<And>i. 0 \<le> f i) \<Longrightarrow> 0 \<le> x \<Longrightarrow> (\<lambda>i. ennreal (f i)) sums ennreal x \<longleftrightarrow> f sums x"
  1353 lemma sums_ennreal[simp]: "(\<And>i. 0 \<le> f i) \<Longrightarrow> 0 \<le> x \<Longrightarrow> (\<lambda>i. ennreal (f i)) sums ennreal x \<longleftrightarrow> f sums x"
   506   unfolding sums_def by (simp add: always_eventually setsum_nonneg)
  1354   unfolding sums_def by (simp add: always_eventually setsum_nonneg)
   507 
  1355 
   508 lemma summable_suminf_not_top: "(\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top \<Longrightarrow> summable f"
  1356 lemma summable_suminf_not_top: "(\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top \<Longrightarrow> summable 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"]
   585 lemma INF_ennreal_const_add:
  1417 lemma INF_ennreal_const_add:
   586   fixes f g :: "nat \<Rightarrow> ennreal"
  1418   fixes f g :: "nat \<Rightarrow> ennreal"
   587   shows "(INF i. c + f i) = c + (INF i. f i)"
  1419   shows "(INF i. c + f i) = c + (INF i. f i)"
   588   using INF_ennreal_add_const[of f c] by (simp add: ac_simps)
  1420   using INF_ennreal_add_const[of f c] by (simp add: ac_simps)
   589 
  1421 
   590 lemma sup_continuous_e2ennreal[order_continuous_intros]:
  1422 lemma SUP_mult_left_ennreal: "c * (SUP i:I. f i) = (SUP i:I. c * f i ::ennreal)"
   591   assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. e2ennreal (f x))"
  1423 proof cases
   592   apply (rule sup_continuous_compose[OF _ f])
  1424   assume "I \<noteq> {}" then show ?thesis
   593   apply (rule continuous_at_left_imp_sup_continuous)
  1425     by transfer (auto simp add: SUP_ereal_mult_left max_absorb2 SUP_upper2)
   594   apply (auto simp: mono_def e2ennreal_mono continuous_at_e2ennreal)
  1426 qed (simp add: bot_ennreal)
   595   done
  1427 
   596 
  1428 lemma SUP_mult_right_ennreal: "(SUP i:I. f i) * c = (SUP i:I. f i * c ::ennreal)"
   597 lemma sup_continuous_enn2ereal[order_continuous_intros]:
  1429   using SUP_mult_left_ennreal by (simp add: mult.commute)
   598   assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. enn2ereal (f x))"
  1430 
   599   apply (rule sup_continuous_compose[OF _ f])
  1431 lemma SUP_divide_ennreal: "(SUP i:I. f i) / c = (SUP i:I. f i / c ::ennreal)"
   600   apply (rule continuous_at_left_imp_sup_continuous)
  1432   using SUP_mult_right_ennreal by (simp add: divide_ennreal_def)
   601   apply (simp_all add: mono_def less_eq_ennreal.rep_eq continuous_at_enn2ereal)
       
   602   done
       
   603 
       
   604 lemma ennreal_1[simp]: "ennreal 1 = 1"
       
   605   by transfer (simp add: max_absorb2)
       
   606 
       
   607 lemma ennreal_of_nat_eq_real_of_nat: "of_nat i = ennreal (of_nat i)"
       
   608   by (induction i) simp_all
       
   609 
  1433 
   610 lemma ennreal_SUP_of_nat_eq_top: "(SUP x. of_nat x :: ennreal) = top"
  1434 lemma ennreal_SUP_of_nat_eq_top: "(SUP x. of_nat x :: ennreal) = top"
   611 proof (intro antisym top_greatest le_SUP_iff[THEN iffD2] allI impI)
  1435 proof (intro antisym top_greatest le_SUP_iff[THEN iffD2] allI impI)
   612   fix y :: ennreal assume "y < top"
  1436   fix y :: ennreal assume "y < top"
   613   then obtain r where "y = ennreal r"
  1437   then obtain r where "y = ennreal r"
   627     using assms by (auto intro!: SUP_least intro: SUP_upper2)
  1451     using assms by (auto intro!: SUP_least intro: SUP_upper2)
   628   then show ?thesis
  1452   then show ?thesis
   629     by (auto simp: ennreal_SUP_of_nat_eq_top top_unique)
  1453     by (auto simp: ennreal_SUP_of_nat_eq_top top_unique)
   630 qed
  1454 qed
   631 
  1455 
   632 lemma sup_continuous_SUP[order_continuous_intros]:
       
   633   fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice"
       
   634   assumes M: "\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)"
       
   635   shows  "sup_continuous (SUP i:I. M i)"
       
   636   unfolding sup_continuous_def by (auto simp add: sup_continuousD[OF M] intro: SUP_commute)
       
   637 
       
   638 lemma sup_continuous_apply_SUP[order_continuous_intros]:
       
   639   fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice"
       
   640   shows "(\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)) \<Longrightarrow> sup_continuous (\<lambda>x. SUP i:I. M i x)"
       
   641   unfolding SUP_apply[symmetric] by (rule sup_continuous_SUP)
       
   642 
       
   643 lemma sup_continuous_lfp'[order_continuous_intros]:
       
   644   assumes 1: "sup_continuous f"
       
   645   assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (f g)"
       
   646   shows "sup_continuous (lfp f)"
       
   647 proof -
       
   648   have "sup_continuous ((f ^^ i) bot)" for i
       
   649   proof (induction i)
       
   650     case (Suc i) then show ?case
       
   651       by (auto intro!: 2)
       
   652   qed (simp add: bot_fun_def sup_continuous_const)
       
   653   then show ?thesis
       
   654     unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros)
       
   655 qed
       
   656 
       
   657 lemma sup_continuous_lfp''[order_continuous_intros]:
       
   658   assumes 1: "\<And>s. sup_continuous (f s)"
       
   659   assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>s. f s (g s))"
       
   660   shows "sup_continuous (\<lambda>x. lfp (f x))"
       
   661 proof -
       
   662   have "sup_continuous (\<lambda>x. (f x ^^ i) bot)" for i
       
   663   proof (induction i)
       
   664     case (Suc i) then show ?case
       
   665       by (auto intro!: 2)
       
   666   qed (simp add: bot_fun_def sup_continuous_const)
       
   667   then show ?thesis
       
   668     unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros)
       
   669 qed
       
   670 
       
   671 lemma ennreal_INF_const_minus:
  1456 lemma ennreal_INF_const_minus:
   672   fixes f :: "'a \<Rightarrow> ennreal"
  1457   fixes f :: "'a \<Rightarrow> ennreal"
   673   shows "I \<noteq> {} \<Longrightarrow> (SUP x:I. c - f x) = c - (INF x:I. f x)"
  1458   shows "I \<noteq> {} \<Longrightarrow> (SUP x:I. c - f x) = c - (INF x:I. f x)"
   674   by (transfer fixing: I)
  1459   by (transfer fixing: I)
   675      (simp add: sup_max[symmetric] SUP_sup_const1 SUP_ereal_minus_right del: sup_ereal_def)
  1460      (simp add: sup_max[symmetric] SUP_sup_const1 SUP_ereal_minus_right del: sup_ereal_def)
   676 
  1461 
   677 lemma ennreal_diff_add_assoc:
  1462 lemma of_nat_Sup_ennreal:
   678   fixes a b c :: ennreal
  1463   assumes "A \<noteq> {}" "bdd_above A"
   679   shows "a \<le> b \<Longrightarrow> c + b - a = c + (b - a)"
  1464   shows "of_nat (Sup A) = (SUP a:A. of_nat a :: ennreal)"
   680   apply transfer
  1465 proof (intro antisym)
   681   subgoal for a b c
  1466   show "(SUP a:A. of_nat a::ennreal) \<le> of_nat (Sup A)"
   682     apply (cases a b c rule: ereal3_cases)
  1467     by (intro SUP_least of_nat_mono) (auto intro: cSup_upper assms)
   683     apply (auto simp: field_simps max_absorb2)
  1468   have "Sup A \<in> A"
   684     done
  1469     unfolding Sup_nat_def using assms by (intro Max_in) (auto simp: bdd_above_nat)
   685   done
  1470   then show "of_nat (Sup A) \<le> (SUP a:A. of_nat a::ennreal)"
   686 
  1471     by (intro SUP_upper)
   687 lemma ennreal_top_minus[simp]:
  1472 qed
   688   fixes c :: ennreal
       
   689   shows "top - c = top"
       
   690   by transfer (auto simp: top_ereal_def max_absorb2)
       
   691 
       
   692 lemma le_ennreal_iff:
       
   693   "0 \<le> r \<Longrightarrow> x \<le> ennreal r \<longleftrightarrow> (\<exists>q\<ge>0. x = ennreal q \<and> q \<le> r)"
       
   694   apply (transfer fixing: r)
       
   695   subgoal for x
       
   696     by (cases x) (auto simp: max_absorb2 cong: conj_cong)
       
   697   done
       
   698 
       
   699 lemma ennreal_minus: "0 \<le> q \<Longrightarrow> q \<le> r \<Longrightarrow> ennreal r - ennreal q = ennreal (r - q)"
       
   700   by transfer (simp add: max_absorb2)
       
   701 
  1473 
   702 lemma ennreal_tendsto_const_minus:
  1474 lemma ennreal_tendsto_const_minus:
   703   fixes g :: "'a \<Rightarrow> ennreal"
  1475   fixes g :: "'a \<Rightarrow> ennreal"
   704   assumes ae: "\<forall>\<^sub>F x in F. g x \<le> c"
  1476   assumes ae: "\<forall>\<^sub>F x in F. g x \<le> c"
   705   assumes g: "((\<lambda>x. c - g x) \<longlongrightarrow> 0) F"
  1477   assumes g: "((\<lambda>x. c - g x) \<longlongrightarrow> 0) F"
   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