src/HOL/Library/Extended_Nonnegative_Real.thy
changeset 73253 f6bb31879698
parent 72236 11b81cd70633
child 73869 7181130f5872
child 73932 fd21b4a93043
equal deleted inserted replaced
73252:b4552595b04e 73253:f6bb31879698
   553   using of_nat_less_top[of "numeral i"] by simp
   553   using of_nat_less_top[of "numeral i"] by simp
   554 
   554 
   555 lemma ennreal_add_bot[simp]: "bot + x = (x::ennreal)"
   555 lemma ennreal_add_bot[simp]: "bot + x = (x::ennreal)"
   556   by transfer simp
   556   by transfer simp
   557 
   557 
       
   558 lemma add_top_right_ennreal [simp]: "x + top = (top :: ennreal)"
       
   559   by (cases x) auto
       
   560 
       
   561 lemma add_top_left_ennreal [simp]: "top + x = (top :: ennreal)"
       
   562   by (cases x) auto
       
   563 
       
   564 lemma ennreal_top_mult_left [simp]: "x \<noteq> 0 \<Longrightarrow> x * top = (top :: ennreal)"
       
   565   by (subst ennreal_mult_eq_top_iff) auto
       
   566 
       
   567 lemma ennreal_top_mult_right [simp]: "x \<noteq> 0 \<Longrightarrow> top * x = (top :: ennreal)"
       
   568   by (subst ennreal_mult_eq_top_iff) auto
       
   569 
       
   570 
       
   571 lemma power_top_ennreal [simp]: "n > 0 \<Longrightarrow> top ^ n = (top :: ennreal)"
       
   572   by (induction n) auto
       
   573 
       
   574 lemma power_eq_top_ennreal_iff: "x ^ n = top \<longleftrightarrow> x = (top :: ennreal) \<and> n > 0"
       
   575   by (induction n) (auto simp: ennreal_mult_eq_top_iff)
       
   576 
       
   577 lemma ennreal_mult_le_mult_iff: "c \<noteq> 0 \<Longrightarrow> c \<noteq> top \<Longrightarrow> c * a \<le> c * b \<longleftrightarrow> a \<le> (b :: ennreal)"
       
   578   including ennreal.lifting
       
   579   by (transfer, subst ereal_mult_le_mult_iff) (auto simp: top_ereal_def)
       
   580 
       
   581 lemma power_mono_ennreal: "x \<le> y \<Longrightarrow> x ^ n \<le> (y ^ n :: ennreal)"
       
   582   by (induction n) (auto intro!: mult_mono)
       
   583 
   558 instance ennreal :: semiring_char_0
   584 instance ennreal :: semiring_char_0
   559 proof (standard, safe intro!: linorder_injI)
   585 proof (standard, safe intro!: linorder_injI)
   560   have *: "1 + of_nat k \<noteq> (0::ennreal)" for k
   586   have *: "1 + of_nat k \<noteq> (0::ennreal)" for k
   561     using add_pos_nonneg[OF zero_less_one, of "of_nat k :: ennreal"] by auto
   587     using add_pos_nonneg[OF zero_less_one, of "of_nat k :: ennreal"] by auto
   562   fix x y :: nat assume "x < y" "of_nat x = (of_nat y::ennreal)" then show False
   588   fix x y :: nat assume "x < y" "of_nat x = (of_nat y::ennreal)" then show False
   680   by transfer (simp add: divide_ereal_def[symmetric] ereal_times_divide_eq)
   706   by transfer (simp add: divide_ereal_def[symmetric] ereal_times_divide_eq)
   681 
   707 
   682 lemma ennreal_zero_less_divide: "0 < a / b \<longleftrightarrow> (0 < a \<and> b < (top::ennreal))"
   708 lemma ennreal_zero_less_divide: "0 < a / b \<longleftrightarrow> (0 < a \<and> b < (top::ennreal))"
   683   unfolding divide_ennreal_def
   709   unfolding divide_ennreal_def
   684   by transfer (auto simp: ereal_zero_less_0_iff top_ereal_def ereal_0_gt_inverse)
   710   by transfer (auto simp: ereal_zero_less_0_iff top_ereal_def ereal_0_gt_inverse)
       
   711 
       
   712 lemma add_divide_distrib_ennreal: "(a + b) / c = a / c + b / (c :: ennreal)"
       
   713   by (simp add: divide_ennreal_def ring_distribs)
   685 
   714 
   686 lemma divide_right_mono_ennreal:
   715 lemma divide_right_mono_ennreal:
   687   fixes a b c :: ennreal
   716   fixes a b c :: ennreal
   688   shows "a \<le> b \<Longrightarrow> a / c \<le> b / c"
   717   shows "a \<le> b \<Longrightarrow> a / c \<le> b / c"
   689   unfolding divide_ennreal_def by (intro mult_mono) auto
   718   unfolding divide_ennreal_def by (intro mult_mono) auto
   974       by (induction n)
  1003       by (induction n)
   975          (auto simp add: ennreal_power ennreal_mult[symmetric] inverse_ennreal)
  1004          (auto simp add: ennreal_power ennreal_mult[symmetric] inverse_ennreal)
   976   qed
  1005   qed
   977 qed
  1006 qed
   978 
  1007 
       
  1008 lemma power_divide_distrib_ennreal [algebra_simps]:
       
  1009   "(x / y) ^ n = x ^ n / (y ^ n :: ennreal)"
       
  1010   by (simp add: divide_ennreal_def algebra_simps ennreal_inverse_power)
       
  1011 
   979 lemma ennreal_divide_numeral: "0 \<le> x \<Longrightarrow> ennreal x / numeral b = ennreal (x / numeral b)"
  1012 lemma ennreal_divide_numeral: "0 \<le> x \<Longrightarrow> ennreal x / numeral b = ennreal (x / numeral b)"
   980   by (subst divide_ennreal[symmetric]) auto
  1013   by (subst divide_ennreal[symmetric]) auto
   981 
  1014 
   982 lemma prod_ennreal: "(\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Prod>i\<in>A. ennreal (f i)) = ennreal (prod f A)"
  1015 lemma prod_ennreal: "(\<And>i. i \<in> A \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Prod>i\<in>A. ennreal (f i)) = ennreal (prod f A)"
   983   by (induction A rule: infinite_finite_induct)
  1016   by (induction A rule: infinite_finite_induct)
   984      (auto simp: ennreal_mult prod_nonneg)
  1017      (auto simp: ennreal_mult prod_nonneg)
       
  1018 
       
  1019 lemma prod_mono_ennreal:
       
  1020   assumes "\<And>x. x \<in> A \<Longrightarrow> f x \<le> (g x :: ennreal)"
       
  1021   shows   "prod f A \<le> prod g A"
       
  1022   using assms by (induction A rule: infinite_finite_induct) (auto intro!: mult_mono)
   985 
  1023 
   986 lemma mult_right_ennreal_cancel: "a * ennreal c = b * ennreal c \<longleftrightarrow> (a = b \<or> c \<le> 0)"
  1024 lemma mult_right_ennreal_cancel: "a * ennreal c = b * ennreal c \<longleftrightarrow> (a = b \<or> c \<le> 0)"
   987 proof (cases "0 \<le> c")
  1025 proof (cases "0 \<le> c")
   988   case True
  1026   case True
   989   then show ?thesis
  1027   then show ?thesis