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 |