src/HOL/Library/Extended_Nonnegative_Real.thy
author nipkow
Tue, 17 Jun 2025 06:29:55 +0200
changeset 82732 71574900b6ba
parent 81804 5a2e05eb7001
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     1
(*  Title:      HOL/Library/Extended_Nonnegative_Real.thy
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     2
    Author:     Johannes Hölzl
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     3
*)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     4
77811
ae9e6218443d proper section headings
haftmann
parents: 76137
diff changeset
     5
section \<open>The type of non-negative extended real numbers\<close>
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     6
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     7
theory Extended_Nonnegative_Real
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
     8
  imports Extended_Real Indicator_Function
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     9
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    10
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    11
lemma ereal_ineq_diff_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    12
  assumes "b \<noteq> (-\<infinity>::ereal)" "a \<ge> b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    13
  shows "a = b + (a-b)"
67691
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
    14
by (metis add.commute assms ereal_eq_minus_iff ereal_minus_le_iff ereal_plus_eq_PInfty)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    15
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    16
lemma Limsup_const_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    17
  fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    18
  shows "F \<noteq> bot \<Longrightarrow> Limsup F (\<lambda>x. c + f x) = c + Limsup F f"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
    19
  by (intro Limsup_compose_continuous_mono monoI add_mono continuous_intros) auto
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    20
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    21
lemma Liminf_const_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    22
  fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    23
  shows "F \<noteq> bot \<Longrightarrow> Liminf F (\<lambda>x. c + f x) = c + Liminf F f"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
    24
  by (intro Liminf_compose_continuous_mono monoI add_mono continuous_intros) auto
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    25
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    26
lemma Liminf_add_const:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    27
  fixes c :: "'a::{complete_linorder, linorder_topology, topological_monoid_add, ordered_ab_semigroup_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    28
  shows "F \<noteq> bot \<Longrightarrow> Liminf F (\<lambda>x. f x + c) = Liminf F f + c"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
    29
  by (intro Liminf_compose_continuous_mono monoI add_mono continuous_intros) auto
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    30
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    31
lemma sums_offset:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    32
  fixes f g :: "nat \<Rightarrow> 'a :: {t2_space, topological_comm_monoid_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    33
  assumes "(\<lambda>n. f (n + i)) sums l" shows "f sums (l + (\<Sum>j<i. f j))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    34
proof  -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    35
  have "(\<lambda>k. (\<Sum>n<k. f (n + i)) + (\<Sum>j<i. f j)) \<longlonglongrightarrow> l + (\<Sum>j<i. f j)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    36
    using assms by (auto intro!: tendsto_add simp: sums_def)
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
    37
  moreover have "(\<Sum>j<k + i. f j) = (\<Sum>n<k. f (n + i)) + (\<Sum>j<i. f j)" for k :: nat
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
    38
  proof -
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    39
    have "(\<Sum>j<k + i. f j) = (\<Sum>j=i..<k + i. f j) + (\<Sum>j=0..<i. f j)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
    40
      by (subst sum.union_disjoint[symmetric]) (auto intro!: sum.cong)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    41
    also have "(\<Sum>j=i..<k + i. f j) = (\<Sum>j\<in>(\<lambda>n. n + i)`{0..<k}. f j)"
67411
3f4b0c84630f restored naming of lemmas after corresponding constants
haftmann
parents: 67408
diff changeset
    42
      unfolding image_add_atLeastLessThan by simp
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
    43
    finally show ?thesis
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
    44
      by (auto simp: inj_on_def atLeast0LessThan sum.reindex)
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
    45
  qed
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    46
  ultimately have "(\<lambda>k. (\<Sum>n<k + i. f n)) \<longlonglongrightarrow> l + (\<Sum>j<i. f j)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    47
    by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    48
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    49
    unfolding sums_def by (rule LIMSEQ_offset)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    50
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    51
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    52
lemma suminf_offset:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    53
  fixes f g :: "nat \<Rightarrow> 'a :: {t2_space, topological_comm_monoid_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    54
  shows "summable (\<lambda>j. f (j + i)) \<Longrightarrow> suminf f = (\<Sum>j. f (j + i)) + (\<Sum>j<i. f j)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    55
  by (intro sums_unique[symmetric] sums_offset summable_sums)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    56
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    57
lemma eventually_at_left_1: "(\<And>z::real. 0 < z \<Longrightarrow> z < 1 \<Longrightarrow> P z) \<Longrightarrow> eventually P (at_left 1)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    58
  by (subst eventually_at_left[of 0]) (auto intro: exI[of _ 0])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    59
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    60
lemma mult_eq_1:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    61
  fixes a b :: "'a :: {ordered_semiring, comm_monoid_mult}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    62
  shows "0 \<le> a \<Longrightarrow> a \<le> 1 \<Longrightarrow> b \<le> 1 \<Longrightarrow> a * b = 1 \<longleftrightarrow> (a = 1 \<and> b = 1)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    63
  by (metis mult.left_neutral eq_iff mult.commute mult_right_mono)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    64
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    65
lemma ereal_add_diff_cancel:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    66
  fixes a b :: ereal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    67
  shows "\<bar>b\<bar> \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    68
  by (cases a b rule: ereal2_cases) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    69
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    70
lemma add_top:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    71
  fixes x :: "'a::{order_top, ordered_comm_monoid_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    72
  shows "0 \<le> x \<Longrightarrow> x + top = top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    73
  by (intro top_le add_increasing order_refl)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    74
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    75
lemma top_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    76
  fixes x :: "'a::{order_top, ordered_comm_monoid_add}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    77
  shows "0 \<le> x \<Longrightarrow> top + x = top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    78
  by (intro top_le add_increasing2 order_refl)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    79
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    80
lemma le_lfp: "mono f \<Longrightarrow> x \<le> lfp f \<Longrightarrow> f x \<le> lfp f"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    81
  by (subst lfp_unfold) (auto dest: monoD)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    82
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    83
lemma lfp_transfer:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    84
  assumes \<alpha>: "sup_continuous \<alpha>" and f: "sup_continuous f" and mg: "mono g"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    85
  assumes bot: "\<alpha> bot \<le> lfp g" and eq: "\<And>x. x \<le> lfp f \<Longrightarrow> \<alpha> (f x) = g (\<alpha> x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    86
  shows "\<alpha> (lfp f) = lfp g"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    87
proof (rule antisym)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    88
  note mf = sup_continuous_mono[OF f]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    89
  have f_le_lfp: "(f ^^ i) bot \<le> lfp f" for i
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    90
    by (induction i) (auto intro: le_lfp mf)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    91
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    92
  have "\<alpha> ((f ^^ i) bot) \<le> lfp g" for i
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    93
    by (induction i) (auto simp: bot eq f_le_lfp intro!: le_lfp mg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    94
  then show "\<alpha> (lfp f) \<le> lfp g"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    95
    unfolding sup_continuous_lfp[OF f]
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
    96
    by (simp add: SUP_least \<alpha>[THEN sup_continuousD] mf mono_funpow)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    97
  show "lfp g \<le> \<alpha> (lfp f)"
63979
95c3ae4baba8 clarified lfp/gfp statements and proofs;
wenzelm
parents: 63940
diff changeset
    98
    by (rule lfp_lowerbound) (simp add: eq[symmetric] lfp_fixpoint[OF mf])
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
    99
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   100
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   101
lemma sup_continuous_applyD: "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x h)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   102
  using sup_continuous_apply[THEN sup_continuous_compose] .
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   103
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   104
lemma sup_continuous_SUP[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   105
  fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   106
  assumes M: "\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   107
  shows  "sup_continuous (SUP i\<in>I. M i)"
69861
62e47f06d22c avoid context-sensitive simp rules whose context-free form (image_comp) is not simp by default
haftmann
parents: 69661
diff changeset
   108
  unfolding sup_continuous_def by (auto simp add: sup_continuousD [OF M] image_comp intro: SUP_commute)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   109
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   110
lemma sup_continuous_apply_SUP[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   111
  fixes M :: "_ \<Rightarrow> _ \<Rightarrow> 'a::complete_lattice"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   112
  shows "(\<And>i. i \<in> I \<Longrightarrow> sup_continuous (M i)) \<Longrightarrow> sup_continuous (\<lambda>x. SUP i\<in>I. M i x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   113
  unfolding SUP_apply[symmetric] by (rule sup_continuous_SUP)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   114
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   115
lemma sup_continuous_lfp'[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   116
  assumes 1: "sup_continuous f"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   117
  assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (f g)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   118
  shows "sup_continuous (lfp f)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   119
proof -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   120
  have "sup_continuous ((f ^^ i) bot)" for i
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   121
  proof (induction i)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   122
    case (Suc i) then show ?case
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   123
      by (auto intro!: 2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   124
  qed (simp add: bot_fun_def sup_continuous_const)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   125
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   126
    unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   127
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   128
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   129
lemma sup_continuous_lfp''[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   130
  assumes 1: "\<And>s. sup_continuous (f s)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   131
  assumes 2: "\<And>g. sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>s. f s (g s))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   132
  shows "sup_continuous (\<lambda>x. lfp (f x))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   133
proof -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   134
  have "sup_continuous (\<lambda>x. (f x ^^ i) bot)" for i
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   135
  proof (induction i)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   136
    case (Suc i) then show ?case
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   137
      by (auto intro!: 2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   138
  qed (simp add: bot_fun_def sup_continuous_const)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   139
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   140
    unfolding sup_continuous_lfp[OF 1] by (intro order_continuous_intros)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   141
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   142
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   143
lemma mono_INF_fun:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   144
    "(\<And>x y. mono (F x y)) \<Longrightarrow> mono (\<lambda>z x. INF y \<in> X x. F x y z :: 'a :: complete_lattice)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   145
  by (auto intro!: INF_mono[OF bexI] simp: le_fun_def mono_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   146
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   147
lemma continuous_on_cmult_ereal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   148
  "\<bar>c::ereal\<bar> \<noteq> \<infinity> \<Longrightarrow> continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. c * f x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   149
  using tendsto_cmult_ereal[of c f "f x" "at x within A" for x]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   150
  by (auto simp: continuous_on_def simp del: tendsto_cmult_ereal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   151
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   152
lemma real_of_nat_Sup:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   153
  assumes "A \<noteq> {}" "bdd_above A"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   154
  shows "of_nat (Sup A) = (SUP a\<in>A. of_nat a :: real)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   155
proof (intro antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   156
  show "(SUP a\<in>A. of_nat a::real) \<le> of_nat (Sup A)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   157
    using assms by (intro cSUP_least of_nat_mono) (auto intro: cSup_upper)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   158
  have "Sup A \<in> A"
71834
919a55257e62 Fixes for Sup{} = (0::nat)
paulson <lp15@cam.ac.uk>
parents: 70381
diff changeset
   159
    using assms by (auto simp: Sup_nat_def bdd_above_nat)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   160
  then show "of_nat (Sup A) \<le> (SUP a\<in>A. of_nat a::real)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   161
    by (intro cSUP_upper bdd_above_image_mono assms) (auto simp: mono_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   162
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   163
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   164
lemma (in complete_lattice) SUP_sup_const1:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   165
  "I \<noteq> {} \<Longrightarrow> (SUP i\<in>I. sup c (f i)) = sup c (SUP i\<in>I. f i)"
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   166
  using SUP_sup_distrib[of "\<lambda>_. c" I f] by simp
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   167
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   168
lemma (in complete_lattice) SUP_sup_const2:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   169
  "I \<noteq> {} \<Longrightarrow> (SUP i\<in>I. sup (f i) c) = sup (SUP i\<in>I. f i) c"
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   170
  using SUP_sup_distrib[of f I "\<lambda>_. c"] by simp
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   171
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   172
lemma one_less_of_natD:
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   173
  assumes "(1::'a::linordered_semidom) < of_nat n" shows "1 < n"
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   174
  by (cases n) (use assms in auto)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   175
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   176
subsection \<open>Defining the extended non-negative reals\<close>
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   177
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   178
text \<open>Basic definitions and type class setup\<close>
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   179
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   180
typedef ennreal = "{x :: ereal. 0 \<le> x}"
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   181
  morphisms enn2ereal e2ennreal'
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   182
  by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   183
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   184
definition "e2ennreal x = e2ennreal' (max 0 x)"
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   185
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   186
lemma enn2ereal_range: "e2ennreal ` {0..} = UNIV"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   187
proof -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   188
  have "\<exists>y\<ge>0. x = e2ennreal y" for x
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   189
    by (cases x) (auto simp: e2ennreal_def max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   190
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   191
    by (auto simp: image_iff Bex_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   192
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   193
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   194
lemma type_definition_ennreal': "type_definition enn2ereal e2ennreal {x. 0 \<le> x}"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   195
  using type_definition_ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   196
  by (auto simp: type_definition_def e2ennreal_def max_absorb2)
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   197
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   198
setup_lifting type_definition_ennreal'
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   199
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   200
declare [[coercion e2ennreal]]
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   201
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   202
instantiation ennreal :: complete_linorder
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   203
begin
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   204
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   205
lift_definition top_ennreal :: ennreal is top by (rule top_greatest)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   206
lift_definition bot_ennreal :: ennreal is 0 by (rule order_refl)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   207
lift_definition sup_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is sup by (rule le_supI1)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   208
lift_definition inf_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is inf by (rule le_infI)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   209
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   210
lift_definition Inf_ennreal :: "ennreal set \<Rightarrow> ennreal" is "Inf"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   211
  by (rule Inf_greatest)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   212
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   213
lift_definition Sup_ennreal :: "ennreal set \<Rightarrow> ennreal" is "sup 0 \<circ> Sup"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   214
  by auto
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   215
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   216
lift_definition less_eq_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> bool" is "(\<le>)" .
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   217
lift_definition less_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> bool" is "(<)" .
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   218
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   219
instance
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   220
  by standard
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
   221
     (transfer; auto simp: Inf_lower Inf_greatest Sup_upper Sup_least le_max_iff_disj max.absorb1)+
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   222
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   223
end
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   224
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   225
lemma pcr_ennreal_enn2ereal[simp]: "pcr_ennreal (enn2ereal x) x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   226
  by (simp add: ennreal.pcr_cr_eq cr_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   227
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   228
lemma rel_fun_eq_pcr_ennreal: "rel_fun (=) pcr_ennreal f g \<longleftrightarrow> f = enn2ereal \<circ> g"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   229
  by (auto simp: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   230
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   231
instantiation ennreal :: infinity
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   232
begin
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   233
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   234
definition infinity_ennreal :: ennreal
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
   235
  where [simp]: "\<infinity> = (top::ennreal)"
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   236
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   237
instance ..
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   238
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   239
end
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   240
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   241
instantiation ennreal :: "{semiring_1_no_zero_divisors, comm_semiring_1}"
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   242
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   243
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   244
lift_definition one_ennreal :: ennreal is 1 by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   245
lift_definition zero_ennreal :: ennreal is 0 by simp
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   246
lift_definition plus_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is "(+)" by simp
69064
5840724b1d71 Prefix form of infix with * on either side no longer needs special treatment
nipkow
parents: 68752
diff changeset
   247
lift_definition times_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is "(*)" by simp
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   248
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   249
instance
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   250
  by standard (transfer; auto simp: field_simps ereal_right_distrib)+
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   251
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   252
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   253
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   254
instantiation ennreal :: minus
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   255
begin
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   256
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   257
lift_definition minus_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is "\<lambda>a b. max 0 (a - b)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   258
  by simp
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   259
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   260
instance ..
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   261
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   262
end
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   263
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   264
instance ennreal :: numeral ..
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   265
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   266
instantiation ennreal :: inverse
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   267
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   268
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   269
lift_definition inverse_ennreal :: "ennreal \<Rightarrow> ennreal" is inverse
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   270
  by (rule inverse_ereal_ge0I)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   271
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   272
definition divide_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   273
  where "x div y = x * inverse (y :: ennreal)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   274
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   275
instance ..
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   276
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   277
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   278
67443
3abf6a722518 standardized towards new-style formal comments: isabelle update_comments;
wenzelm
parents: 67411
diff changeset
   279
lemma ennreal_zero_less_one: "0 < (1::ennreal)" \<comment> \<open>TODO: remove\<close>
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   280
  by transfer auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   281
62376
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   282
instance ennreal :: dioid
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   283
proof (standard; transfer)
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   284
  fix a b :: ereal assume "0 \<le> a" "0 \<le> b" then show "(a \<le> b) = (\<exists>c\<in>Collect ((\<le>) 0). b = a + c)"
62376
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   285
    unfolding ereal_ex_split Bex_def
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   286
    by (cases a b rule: ereal2_cases) (auto intro!: exI[of _ "real_of_ereal (b - a)"])
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   287
qed
85f38d5f8807 Rename ordered_comm_monoid_add to ordered_cancel_comm_monoid_add. Introduce ordreed_comm_monoid_add, canonically_ordered_comm_monoid and dioid. Setup nat, entat and ennreal as dioids.
hoelzl
parents: 62375
diff changeset
   288
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   289
instance ennreal :: ordered_comm_semiring
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   290
  by standard
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
   291
     (transfer; auto intro: add_mono mult_mono mult_ac ereal_left_distrib ereal_mult_left_mono)+
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   292
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   293
instance ennreal :: linordered_nonzero_semiring
67691
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
   294
proof
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
   295
  fix a b::ennreal
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
   296
  show "a < b \<Longrightarrow> a + 1 < b + 1"
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
   297
    by transfer (simp add: add_right_mono ereal_add_cancel_right less_le)
db202a00a29c fixing ennreal using add_mono1; shifting results from linordered_semidom to linordered_nonzero_semiring
paulson <lp15@cam.ac.uk>
parents: 67456
diff changeset
   298
qed (transfer; simp)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   299
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   300
instance ennreal :: strict_ordered_ab_semigroup_add
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   301
proof
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   302
  fix a b c d :: ennreal show "a < b \<Longrightarrow> c < d \<Longrightarrow> a + c < b + d"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   303
    by transfer (auto intro!: ereal_add_strict_mono)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   304
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   305
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   306
declare [[coercion "of_nat :: nat \<Rightarrow> ennreal"]]
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   307
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   308
lemma e2ennreal_neg: "x \<le> 0 \<Longrightarrow> e2ennreal x = 0"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   309
  unfolding zero_ennreal_def e2ennreal_def by (simp add: max_absorb1)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   310
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   311
lemma e2ennreal_mono: "x \<le> y \<Longrightarrow> e2ennreal x \<le> e2ennreal y"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   312
  by (cases "0 \<le> x" "0 \<le> y" rule: bool.exhaust[case_product bool.exhaust])
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   313
     (auto simp: e2ennreal_neg less_eq_ennreal.abs_eq eq_onp_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   314
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   315
lemma enn2ereal_nonneg[simp]: "0 \<le> enn2ereal x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   316
  using ennreal.enn2ereal[of x] by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   317
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   318
lemma ereal_ennreal_cases:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   319
  obtains b where "0 \<le> a" "a = enn2ereal b" | "a < 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   320
  using e2ennreal'_inverse[of a, symmetric] by (cases "0 \<le> a") (auto intro: enn2ereal_nonneg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   321
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   322
lemma rel_fun_liminf[transfer_rule]: "rel_fun (rel_fun (=) pcr_ennreal) pcr_ennreal liminf liminf"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   323
proof -
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   324
  have "\<forall>x y. rel_fun (=) pcr_ennreal x y \<longrightarrow> pcr_ennreal (sup 0 (liminf x)) (liminf y) \<Longrightarrow>
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   325
        \<forall>x y. rel_fun (=) pcr_ennreal x y \<longrightarrow> pcr_ennreal (liminf x) (liminf y)"
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   326
    by (auto simp: comp_def Liminf_bounded rel_fun_eq_pcr_ennreal)
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   327
  moreover have "rel_fun (rel_fun (=) pcr_ennreal) pcr_ennreal (\<lambda>x. sup 0 (liminf x)) liminf"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   328
    unfolding liminf_SUP_INF[abs_def] by (transfer_prover_start, transfer_step+; simp)
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   329
  ultimately show ?thesis
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   330
    by (simp add: rel_fun_def)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   331
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   332
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   333
lemma rel_fun_limsup[transfer_rule]: "rel_fun (rel_fun (=) pcr_ennreal) pcr_ennreal limsup limsup"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   334
proof -
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   335
  have [simp]: "max 0 (SUP x\<in>{n..}. enn2ereal (y x)) = (SUP x\<in>{n..}. enn2ereal (y x))" for n::nat and y
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   336
    by (meson SUP_upper atLeast_iff enn2ereal_nonneg max.absorb2 nle_le order_trans)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
   337
  have "rel_fun (rel_fun (=) pcr_ennreal) pcr_ennreal (\<lambda>x. INF n. sup 0 (SUP i\<in>{n..}. x i)) limsup"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   338
    unfolding limsup_INF_SUP[abs_def] by (transfer_prover_start, transfer_step+; simp)
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   339
  moreover 
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   340
  have "\<And>x y. \<lbrakk>rel_fun (=) pcr_ennreal x y;
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   341
                pcr_ennreal (INF n::nat. max 0 (Sup (x ` {n..}))) (INF n. Sup (y ` {n..}))\<rbrakk>
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   342
           \<Longrightarrow> pcr_ennreal (INF n. Sup (x ` {n..})) (INF n. Sup (y ` {n..}))"
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   343
    by (auto simp: comp_def rel_fun_eq_pcr_ennreal)
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   344
  ultimately show ?thesis
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   345
    by (simp add: limsup_INF_SUP rel_fun_def)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   346
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   347
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   348
lemma sum_enn2ereal[simp]: "(\<And>i. i \<in> I \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Sum>i\<in>I. enn2ereal (f i)) = enn2ereal (sum f I)"
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   349
  by (induction I rule: infinite_finite_induct) (auto simp: sum_nonneg zero_ennreal.rep_eq plus_ennreal.rep_eq)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   350
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   351
lemma transfer_e2ennreal_sum [transfer_rule]:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
   352
  "rel_fun (rel_fun (=) pcr_ennreal) (rel_fun (=) pcr_ennreal) sum sum"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   353
  by (auto intro!: rel_funI simp: rel_fun_eq_pcr_ennreal comp_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   354
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   355
lemma enn2ereal_of_nat[simp]: "enn2ereal (of_nat n) = ereal n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   356
  by (induction n) (auto simp: zero_ennreal.rep_eq one_ennreal.rep_eq plus_ennreal.rep_eq)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   357
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   358
lemma enn2ereal_numeral[simp]: "enn2ereal (numeral a) = numeral a"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   359
  by (metis enn2ereal_of_nat numeral_eq_ereal of_nat_numeral)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   360
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   361
lemma transfer_numeral[transfer_rule]: "pcr_ennreal (numeral a) (numeral a)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   362
  by (metis enn2ereal_numeral pcr_ennreal_enn2ereal)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   363
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   364
subsection \<open>Cancellation simprocs\<close>
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   365
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   366
lemma ennreal_add_left_cancel: "a + b = a + c \<longleftrightarrow> a = (\<infinity>::ennreal) \<or> b = c"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   367
  unfolding infinity_ennreal_def by transfer (simp add: top_ereal_def ereal_add_cancel_left)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   368
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   369
lemma ennreal_add_left_cancel_le: "a + b \<le> a + c \<longleftrightarrow> a = (\<infinity>::ennreal) \<or> b \<le> c"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   370
  unfolding infinity_ennreal_def by transfer (simp add: ereal_add_le_add_iff top_ereal_def disj_commute)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   371
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   372
lemma ereal_add_left_cancel_less:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   373
  fixes a b c :: ereal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   374
  shows "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> a + b < a + c \<longleftrightarrow> a \<noteq> \<infinity> \<and> b < c"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   375
  by (cases a b c rule: ereal3_cases) auto
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   376
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   377
lemma ennreal_add_left_cancel_less: "a + b < a + c \<longleftrightarrow> a \<noteq> (\<infinity>::ennreal) \<and> b < c"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   378
  unfolding infinity_ennreal_def
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   379
  by transfer (simp add: top_ereal_def ereal_add_left_cancel_less)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   380
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   381
ML \<open>
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   382
structure Cancel_Ennreal_Common =
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   383
struct
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   384
  (* copied from src/HOL/Tools/nat_numeral_simprocs.ML *)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   385
  fun find_first_t _    _ []         = raise TERM("find_first_t", [])
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   386
    | find_first_t past u (t::terms) =
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   387
          if u aconv t then (rev past @ terms)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   388
          else find_first_t (t::past) u terms
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   389
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   390
  fun dest_summing (Const (\<^const_name>\<open>Groups.plus\<close>, _) $ t $ u, ts) =
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   391
        dest_summing (t, dest_summing (u, ts))
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   392
    | dest_summing (t, ts) = t :: ts
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   393
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   394
  val mk_sum = Arith_Data.long_mk_sum
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   395
  fun dest_sum t = dest_summing (t, [])
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   396
  val find_first = find_first_t []
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   397
  val trans_tac = Numeral_Simprocs.trans_tac
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   398
  val norm_ss =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   399
    simpset_of (put_simpset HOL_basic_ss \<^context>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   400
      addsimps @{thms ac_simps add_0_left add_0_right})
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   401
  fun norm_tac ctxt = ALLGOALS (simp_tac (put_simpset norm_ss ctxt))
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   402
  fun simplify_meta_eq ctxt cancel_th th =
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   403
    Arith_Data.simplify_meta_eq [] ctxt
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   404
      ([th, cancel_th] MRS trans)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   405
  fun mk_eq (a, b) = HOLogic.mk_Trueprop (HOLogic.mk_eq (a, b))
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   406
end
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   407
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   408
structure Eq_Ennreal_Cancel = ExtractCommonTermFun
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   409
(open Cancel_Ennreal_Common
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   410
  val mk_bal = HOLogic.mk_eq
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   411
  val dest_bal = HOLogic.dest_bin \<^const_name>\<open>HOL.eq\<close> \<^typ>\<open>ennreal\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   412
  fun simp_conv _ _ = SOME @{thm ennreal_add_left_cancel}
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   413
)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   414
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   415
structure Le_Ennreal_Cancel = ExtractCommonTermFun
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   416
(open Cancel_Ennreal_Common
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   417
  val mk_bal = HOLogic.mk_binrel \<^const_name>\<open>Orderings.less_eq\<close>
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   418
  val dest_bal = HOLogic.dest_bin \<^const_name>\<open>Orderings.less_eq\<close> \<^typ>\<open>ennreal\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   419
  fun simp_conv _ _ = SOME @{thm ennreal_add_left_cancel_le}
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   420
)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   421
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   422
structure Less_Ennreal_Cancel = ExtractCommonTermFun
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   423
(open Cancel_Ennreal_Common
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   424
  val mk_bal = HOLogic.mk_binrel \<^const_name>\<open>Orderings.less\<close>
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   425
  val dest_bal = HOLogic.dest_bin \<^const_name>\<open>Orderings.less\<close> \<^typ>\<open>ennreal\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   426
  fun simp_conv _ _ = SOME @{thm ennreal_add_left_cancel_less}
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   427
)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   428
\<close>
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   429
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   430
simproc_setup ennreal_eq_cancel
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   431
  ("(l::ennreal) + m = n" | "(l::ennreal) = m + n") =
78099
4d9349989d94 more uniform simproc_setup: avoid vacuous abstraction over morphism, which sometimes captures context values in its functional closure;
wenzelm
parents: 77811
diff changeset
   432
  \<open>K (fn ctxt => fn ct => Eq_Ennreal_Cancel.proc ctxt (Thm.term_of ct))\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   433
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   434
simproc_setup ennreal_le_cancel
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   435
  ("(l::ennreal) + m \<le> n" | "(l::ennreal) \<le> m + n") =
78099
4d9349989d94 more uniform simproc_setup: avoid vacuous abstraction over morphism, which sometimes captures context values in its functional closure;
wenzelm
parents: 77811
diff changeset
   436
  \<open>K (fn ctxt => fn ct => Le_Ennreal_Cancel.proc ctxt (Thm.term_of ct))\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   437
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   438
simproc_setup ennreal_less_cancel
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   439
  ("(l::ennreal) + m < n" | "(l::ennreal) < m + n") =
78099
4d9349989d94 more uniform simproc_setup: avoid vacuous abstraction over morphism, which sometimes captures context values in its functional closure;
wenzelm
parents: 77811
diff changeset
   440
  \<open>K (fn ctxt => fn ct => Less_Ennreal_Cancel.proc ctxt (Thm.term_of ct))\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   441
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   442
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   443
subsection \<open>Order with top\<close>
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   444
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   445
lemma ennreal_zero_less_top[simp]: "0 < (top::ennreal)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   446
  by transfer (simp add: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   447
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   448
lemma ennreal_one_less_top[simp]: "1 < (top::ennreal)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   449
  by transfer (simp add: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   450
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   451
lemma ennreal_zero_neq_top[simp]: "0 \<noteq> (top::ennreal)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   452
  by transfer (simp add: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   453
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   454
lemma ennreal_top_neq_zero[simp]: "(top::ennreal) \<noteq> 0"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   455
  by transfer (simp add: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   456
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   457
lemma ennreal_top_neq_one[simp]: "top \<noteq> (1::ennreal)"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   458
  by transfer (simp add: top_ereal_def one_ereal_def flip: ereal_max)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   459
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   460
lemma ennreal_one_neq_top[simp]: "1 \<noteq> (top::ennreal)"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   461
  by transfer (simp add: top_ereal_def one_ereal_def flip: ereal_max)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   462
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   463
lemma ennreal_add_less_top[simp]:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   464
  fixes a b :: ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   465
  shows "a + b < top \<longleftrightarrow> a < top \<and> b < top"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   466
  by transfer (auto simp: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   467
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   468
lemma ennreal_add_eq_top[simp]:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   469
  fixes a b :: ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   470
  shows "a + b = top \<longleftrightarrow> a = top \<or> b = top"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   471
  by transfer (auto simp: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   472
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   473
lemma ennreal_sum_less_top[simp]:
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   474
  fixes f :: "'a \<Rightarrow> ennreal"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   475
  shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) < top \<longleftrightarrow> (\<forall>i\<in>I. f i < top)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   476
  by (induction I rule: finite_induct) auto
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   477
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   478
lemma ennreal_sum_eq_top[simp]:
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   479
  fixes f :: "'a \<Rightarrow> ennreal"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   480
  shows "finite I \<Longrightarrow> (\<Sum>i\<in>I. f i) = top \<longleftrightarrow> (\<exists>i\<in>I. f i = top)"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   481
  by (induction I rule: finite_induct) auto
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   482
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   483
lemma ennreal_mult_eq_top_iff:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   484
  fixes a b :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   485
  shows "a * b = top \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   486
  by transfer (auto simp: top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   487
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   488
lemma ennreal_top_eq_mult_iff:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   489
  fixes a b :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   490
  shows "top = a * b \<longleftrightarrow> (a = top \<and> b \<noteq> 0) \<or> (b = top \<and> a \<noteq> 0)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   491
  using ennreal_mult_eq_top_iff[of a b] by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   492
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   493
lemma ennreal_mult_less_top:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   494
  fixes a b :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   495
  shows "a * b < top \<longleftrightarrow> (a = 0 \<or> b = 0 \<or> (a < top \<and> b < top))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   496
  by transfer (auto simp add: top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   497
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   498
lemma top_power_ennreal: "top ^ n = (if n = 0 then 1 else top :: ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   499
  by (induction n) (simp_all add: ennreal_mult_eq_top_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   500
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   501
lemma ennreal_prod_eq_0[simp]:
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   502
  fixes f :: "'a \<Rightarrow> ennreal"
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   503
  shows "(prod f A = 0) = (finite A \<and> (\<exists>i\<in>A. f i = 0))"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   504
  by (induction A rule: infinite_finite_induct) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   505
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   506
lemma ennreal_prod_eq_top:
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   507
  fixes f :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   508
  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)))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   509
  by (induction I rule: infinite_finite_induct) (auto simp: ennreal_mult_eq_top_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   510
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   511
lemma ennreal_top_mult: "top * a = (if a = 0 then 0 else top :: ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   512
  by (simp add: ennreal_mult_eq_top_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   513
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   514
lemma ennreal_mult_top: "a * top = (if a = 0 then 0 else top :: ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   515
  by (simp add: ennreal_mult_eq_top_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   516
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   517
lemma enn2ereal_eq_top_iff[simp]: "enn2ereal x = \<infinity> \<longleftrightarrow> x = top"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   518
  by transfer (simp add: top_ereal_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   519
67451
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   520
lemma enn2ereal_top[simp]: "enn2ereal top = \<infinity>"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   521
  by transfer (simp add: top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   522
67451
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   523
lemma e2ennreal_infty[simp]: "e2ennreal \<infinity> = top"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   524
  by (simp add: top_ennreal.abs_eq top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   525
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   526
lemma ennreal_top_minus[simp]: "top - x = (top::ennreal)"
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   527
  by transfer (auto simp: top_ereal_def max_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   528
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   529
lemma minus_top_ennreal: "x - top = (if x = top then top else 0:: ennreal)"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   530
  by transfer (use ereal_eq_minus_iff top_ereal_def in force)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   531
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   532
lemma bot_ennreal: "bot = (0::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   533
  by transfer rule
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   534
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   535
lemma ennreal_of_nat_neq_top[simp]: "of_nat i \<noteq> (top::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   536
  by (induction i) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   537
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   538
lemma numeral_eq_of_nat: "(numeral a::ennreal) = of_nat (numeral a)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   539
  by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   540
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   541
lemma of_nat_less_top: "of_nat i < (top::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   542
  using less_le_trans[of "of_nat i" "of_nat (Suc i)" "top::ennreal"]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   543
  by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   544
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   545
lemma top_neq_numeral[simp]: "top \<noteq> (numeral i::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   546
  using of_nat_less_top[of "numeral i"] by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   547
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   548
lemma ennreal_numeral_less_top[simp]: "numeral i < (top::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   549
  using of_nat_less_top[of "numeral i"] by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   550
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   551
lemma ennreal_add_bot[simp]: "bot + x = (x::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   552
  by transfer simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   553
73253
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   554
lemma add_top_right_ennreal [simp]: "x + top = (top :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   555
  by (cases x) auto
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   556
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   557
lemma add_top_left_ennreal [simp]: "top + x = (top :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   558
  by (cases x) auto
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   559
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   560
lemma ennreal_top_mult_left [simp]: "x \<noteq> 0 \<Longrightarrow> x * top = (top :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   561
  by (subst ennreal_mult_eq_top_iff) auto
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   562
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   563
lemma ennreal_top_mult_right [simp]: "x \<noteq> 0 \<Longrightarrow> top * x = (top :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   564
  by (subst ennreal_mult_eq_top_iff) auto
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   565
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   566
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   567
lemma power_top_ennreal [simp]: "n > 0 \<Longrightarrow> top ^ n = (top :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   568
  by (induction n) auto
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   569
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   570
lemma power_eq_top_ennreal_iff: "x ^ n = top \<longleftrightarrow> x = (top :: ennreal) \<and> n > 0"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   571
  by (induction n) (auto simp: ennreal_mult_eq_top_iff)
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   572
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   573
lemma ennreal_mult_le_mult_iff: "c \<noteq> 0 \<Longrightarrow> c \<noteq> top \<Longrightarrow> c * a \<le> c * b \<longleftrightarrow> a \<le> (b :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   574
  including ennreal.lifting
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   575
  by (transfer, subst ereal_mult_le_mult_iff) (auto simp: top_ereal_def)
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   576
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   577
lemma power_mono_ennreal: "x \<le> y \<Longrightarrow> x ^ n \<le> (y ^ n :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   578
  by (induction n) (auto intro!: mult_mono)
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   579
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   580
instance ennreal :: semiring_char_0
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   581
proof (standard, safe intro!: linorder_injI)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   582
  have *: "1 + of_nat k \<noteq> (0::ennreal)" for k
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   583
    using add_pos_nonneg[OF zero_less_one, of "of_nat k :: ennreal"] by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   584
  fix x y :: nat assume "x < y" "of_nat x = (of_nat y::ennreal)" then show False
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   585
    by (auto simp add: less_iff_Suc_add *)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   586
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   587
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   588
subsection \<open>Arithmetic\<close>
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   589
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   590
lemma ennreal_minus_zero[simp]: "a - (0::ennreal) = a"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   591
  by transfer (auto simp: max_def)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   592
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   593
lemma ennreal_add_diff_cancel_right[simp]:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   594
  fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (x + y) - y = x"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   595
  by transfer (metis ereal_eq_minus_iff max_absorb2 not_MInfty_nonneg top_ereal_def)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   596
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   597
lemma ennreal_add_diff_cancel_left[simp]:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   598
  fixes x y z :: ennreal shows "y \<noteq> top \<Longrightarrow> (y + x) - y = x"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   599
  by (simp add: add.commute)
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   600
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   601
lemma
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   602
  fixes a b :: ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   603
  shows "a - b = 0 \<Longrightarrow> a \<le> b"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   604
  by transfer (metis ereal_diff_gr0 le_cases max.absorb2 not_less)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   605
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   606
lemma ennreal_minus_cancel:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   607
  fixes a b c :: ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   608
  shows "c \<noteq> top \<Longrightarrow> a \<le> c \<Longrightarrow> b \<le> c \<Longrightarrow> c - a = c - b \<Longrightarrow> a = b"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   609
  by (metis ennreal_add_diff_cancel_left ennreal_add_diff_cancel_right ennreal_add_eq_top less_eqE)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   610
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   611
lemma sup_const_add_ennreal:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   612
  fixes a b c :: "ennreal"
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   613
  shows "sup (c + a) (c + b) = c + sup a b"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   614
  by transfer (metis add_left_mono le_cases sup.absorb2 sup.orderE)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   615
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   616
lemma ennreal_diff_add_assoc:
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   617
  fixes a b c :: ennreal
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   618
  shows "a \<le> b \<Longrightarrow> c + b - a = c + (b - a)"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   619
  by (metis add.left_commute ennreal_add_diff_cancel_left ennreal_add_eq_top ennreal_top_minus less_eqE)
62378
85ed00c1fe7c generalize more theorems to support enat and ennreal
hoelzl
parents: 62376
diff changeset
   620
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   621
lemma mult_divide_eq_ennreal:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   622
  fixes a b :: ennreal
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   623
  shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   624
  unfolding divide_ennreal_def
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   625
  apply transfer
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   626
  by (metis abs_ereal_ge0 divide_ereal_def ereal_divide_eq ereal_times_divide_eq top_ereal_def)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   627
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   628
lemma divide_mult_eq: "a \<noteq> 0 \<Longrightarrow> a \<noteq> \<infinity> \<Longrightarrow> x * a / (b * a) = x / (b::ennreal)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   629
  unfolding divide_ennreal_def infinity_ennreal_def
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   630
  apply transfer
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   631
  subgoal for a b c
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   632
    by (cases a b c rule: ereal3_cases) (auto simp: top_ereal_def)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   633
  done
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   634
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   635
lemma ennreal_mult_divide_eq:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   636
  fixes a b :: ennreal
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   637
  shows "b \<noteq> 0 \<Longrightarrow> b \<noteq> top \<Longrightarrow> (a * b) / b = a"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   638
  by (fact mult_divide_eq_ennreal)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   639
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   640
lemma ennreal_add_diff_cancel:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   641
  fixes a b :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   642
  shows "b \<noteq> \<infinity> \<Longrightarrow> (a + b) - b = a"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   643
  by simp
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   644
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   645
lemma ennreal_minus_eq_0:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   646
  "a - b = 0 \<Longrightarrow> a \<le> (b::ennreal)"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   647
  by transfer (metis ereal_diff_gr0 le_cases max.absorb2 not_less)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   649
lemma ennreal_mono_minus_cancel:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   650
  fixes a b c :: ennreal
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   651
  shows "a - b \<le> a - c \<Longrightarrow> a < top \<Longrightarrow> b \<le> a \<Longrightarrow> c \<le> a \<Longrightarrow> c \<le> b"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   652
  by transfer
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   653
     (auto simp add: ereal_diff_positive top_ereal_def dest: ereal_mono_minus_cancel)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   654
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   655
lemma ennreal_mono_minus:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   656
  fixes a b c :: ennreal
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   657
  shows "c \<le> b \<Longrightarrow> a - b \<le> a - c"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   658
  by transfer (meson ereal_minus_mono max.mono order_refl)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   659
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   660
lemma ennreal_minus_pos_iff:
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   661
  fixes a b :: ennreal
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   662
  shows "a < top \<or> b < top \<Longrightarrow> 0 < a - b \<Longrightarrow> b < a"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   663
  by transfer (use add.left_neutral ereal_minus_le_iff less_irrefl not_less in fastforce)
62648
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   664
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   665
lemma ennreal_inverse_top[simp]: "inverse top = (0::ennreal)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   666
  by transfer (simp add: top_ereal_def ereal_inverse_eq_0)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   667
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   668
lemma ennreal_inverse_zero[simp]: "inverse 0 = (top::ennreal)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   669
  by transfer (simp add: top_ereal_def ereal_inverse_eq_0)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   670
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   671
lemma ennreal_top_divide: "top / (x::ennreal) = (if x = top then 0 else top)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   672
  unfolding divide_ennreal_def
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   673
  by transfer (simp add: top_ereal_def ereal_inverse_eq_0 ereal_0_gt_inverse)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   674
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   675
lemma ennreal_zero_divide[simp]: "0 / (x::ennreal) = 0"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   676
  by (simp add: divide_ennreal_def)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   677
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   678
lemma ennreal_divide_zero[simp]: "x / (0::ennreal) = (if x = 0 then 0 else top)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   679
  by (simp add: divide_ennreal_def ennreal_mult_top)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   680
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   681
lemma ennreal_divide_top[simp]: "x / (top::ennreal) = 0"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   682
  by (simp add: divide_ennreal_def ennreal_top_mult)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   683
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   684
lemma ennreal_times_divide: "a * (b / c) = a * b / (c::ennreal)"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   685
  unfolding divide_ennreal_def
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   686
  by transfer (simp add: divide_ereal_def[symmetric] ereal_times_divide_eq)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   687
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   688
lemma ennreal_zero_less_divide: "0 < a / b \<longleftrightarrow> (0 < a \<and> b < (top::ennreal))"
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   689
  unfolding divide_ennreal_def
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   690
  by transfer (auto simp: ereal_zero_less_0_iff top_ereal_def ereal_0_gt_inverse)
ee48e0b4f669 more stuff for extended nonnegative real numbers
hoelzl
parents: 62623
diff changeset
   691
73253
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   692
lemma add_divide_distrib_ennreal: "(a + b) / c = a / c + b / (c :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   693
  by (simp add: divide_ennreal_def ring_distribs)
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   694
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   695
lemma divide_right_mono_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   696
  fixes a b c :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   697
  shows "a \<le> b \<Longrightarrow> a / c \<le> b / c"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   698
  unfolding divide_ennreal_def by (intro mult_mono) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   699
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   700
lemma ennreal_mult_strict_right_mono: "(a::ennreal) < c \<Longrightarrow> 0 < b \<Longrightarrow> b < top \<Longrightarrow> a * b < c * b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   701
  by transfer (auto intro!: ereal_mult_strict_right_mono)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   702
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   703
lemma ennreal_indicator_less[simp]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   704
  "indicator A x \<le> (indicator B x::ennreal) \<longleftrightarrow> (x \<in> A \<longrightarrow> x \<in> B)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   705
  by (simp add: indicator_def not_le)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   706
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   707
lemma ennreal_inverse_positive: "0 < inverse x \<longleftrightarrow> (x::ennreal) \<noteq> top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   708
  by transfer (simp add: ereal_0_gt_inverse top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   709
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   710
lemma ennreal_inverse_mult': "((0 < b \<or> a < top) \<and> (0 < a \<or> b < top)) \<Longrightarrow> inverse (a * b::ennreal) = inverse a * inverse b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   711
  apply transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   712
  subgoal for a b
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   713
    by (cases a b rule: ereal2_cases) (auto simp: top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   714
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   715
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   716
lemma ennreal_inverse_mult: "a < top \<Longrightarrow> b < top \<Longrightarrow> inverse (a * b::ennreal) = inverse a * inverse b"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   717
  by (simp add: ennreal_inverse_mult')
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   718
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   719
lemma ennreal_inverse_1[simp]: "inverse (1::ennreal) = 1"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   720
  by transfer simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   721
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   722
lemma ennreal_inverse_eq_0_iff[simp]: "inverse (a::ennreal) = 0 \<longleftrightarrow> a = top"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   723
  by (metis ennreal_inverse_positive not_gr_zero)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   724
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   725
lemma ennreal_inverse_eq_top_iff[simp]: "inverse (a::ennreal) = top \<longleftrightarrow> a = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   726
  by transfer (simp add: top_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   727
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   728
lemma ennreal_divide_eq_0_iff[simp]: "(a::ennreal) / b = 0 \<longleftrightarrow> (a = 0 \<or> b = top)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   729
  by (simp add: divide_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   730
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   731
lemma ennreal_divide_eq_top_iff: "(a::ennreal) / b = top \<longleftrightarrow> ((a \<noteq> 0 \<and> b = 0) \<or> (a = top \<and> b \<noteq> top))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   732
  by (auto simp add: divide_ennreal_def ennreal_mult_eq_top_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   733
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   734
lemma one_divide_one_divide_ennreal[simp]: "1 / (1 / c) = (c::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   735
  including ennreal.lifting
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   736
  unfolding divide_ennreal_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   737
  by transfer auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   738
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   739
lemma ennreal_mult_left_cong:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   740
  "((a::ennreal) \<noteq> 0 \<Longrightarrow> b = c) \<Longrightarrow> a * b = a * c"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   741
  by (cases "a = 0") simp_all
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   742
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   743
lemma ennreal_mult_right_cong:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   744
  "((a::ennreal) \<noteq> 0 \<Longrightarrow> b = c) \<Longrightarrow> b * a = c * a"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   745
  by (cases "a = 0") simp_all
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   746
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   747
lemma ennreal_zero_less_mult_iff: "0 < a * b \<longleftrightarrow> 0 < a \<and> 0 < (b::ennreal)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   748
  using not_gr_zero by fastforce
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   749
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   750
lemma less_diff_eq_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   751
  fixes a b c :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   752
  shows "b < top \<or> c < top \<Longrightarrow> a < b - c \<longleftrightarrow> a + c < b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   753
  apply transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   754
  subgoal for a b c
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   755
    by (cases a b c rule: ereal3_cases) (auto split: split_max)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   756
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   757
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   758
lemma diff_add_cancel_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   759
  fixes a b :: ennreal shows "a \<le> b \<Longrightarrow> b - a + a = b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   760
  unfolding infinity_ennreal_def
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   761
  by transfer (metis (no_types) add.commute ereal_diff_positive ereal_ineq_diff_add max_def not_MInfty_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   762
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   763
lemma ennreal_diff_self[simp]: "a \<noteq> top \<Longrightarrow> a - a = (0::ennreal)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   764
  by (meson ennreal_minus_pos_iff less_imp_neq not_gr_zero top.not_eq_extremum)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   765
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   766
lemma ennreal_minus_mono:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   767
  fixes a b c :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   768
  shows "a \<le> c \<Longrightarrow> d \<le> b \<Longrightarrow> a - b \<le> c - d"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
   769
  by transfer (meson ereal_minus_mono max.mono order_refl)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   770
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   771
lemma ennreal_minus_eq_top[simp]: "a - (b::ennreal) = top \<longleftrightarrow> a = top"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   772
  by (metis add_top diff_add_cancel_ennreal ennreal_mono_minus ennreal_top_minus zero_le)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   773
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   774
lemma ennreal_divide_self[simp]: "a \<noteq> 0 \<Longrightarrow> a < top \<Longrightarrow> a / a = (1::ennreal)"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   775
  by (metis mult_1 mult_divide_eq_ennreal top.not_eq_extremum)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   776
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
   777
subsection \<open>Coercion from \<^typ>\<open>real\<close> to \<^typ>\<open>ennreal\<close>\<close>
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   778
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   779
lift_definition ennreal :: "real \<Rightarrow> ennreal" is "sup 0 \<circ> ereal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   780
  by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   781
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   782
declare [[coercion ennreal]]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   783
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
   784
lemma ennreal_cong: "x = y \<Longrightarrow> ennreal x = ennreal y"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   785
  by simp
63099
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   786
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   787
lemma ennreal_cases[cases type: ennreal]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   788
  fixes x :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   789
  obtains (real) r :: real where "0 \<le> r" "x = ennreal r" | (top) "x = top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   790
  apply transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   791
  subgoal for x thesis
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
   792
    by (cases x) (auto simp: top_ereal_def)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   793
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   794
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   795
lemmas ennreal2_cases = ennreal_cases[case_product ennreal_cases]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   796
lemmas ennreal3_cases = ennreal_cases[case_product ennreal2_cases]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   797
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   798
lemma ennreal_neq_top[simp]: "ennreal r \<noteq> top"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   799
  by transfer (simp add: top_ereal_def zero_ereal_def flip: ereal_max)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   800
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   801
lemma top_neq_ennreal[simp]: "top \<noteq> ennreal r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   802
  using ennreal_neq_top[of r] by (auto simp del: ennreal_neq_top)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   803
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   804
lemma ennreal_less_top[simp]: "ennreal x < top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   805
  by transfer (simp add: top_ereal_def max_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   806
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   807
lemma ennreal_neg: "x \<le> 0 \<Longrightarrow> ennreal x = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   808
  by transfer (simp add: max.absorb1)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   809
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   810
lemma ennreal_inj[simp]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   811
  "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal a = ennreal b \<longleftrightarrow> a = b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   812
  by (transfer fixing: a b) (auto simp: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   813
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   814
lemma ennreal_le_iff[simp]: "0 \<le> y \<Longrightarrow> ennreal x \<le> ennreal y \<longleftrightarrow> x \<le> y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   815
  by (auto simp: ennreal_def zero_ereal_def less_eq_ennreal.abs_eq eq_onp_def split: split_max)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   816
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   817
lemma le_ennreal_iff: "0 \<le> r \<Longrightarrow> x \<le> ennreal r \<longleftrightarrow> (\<exists>q\<ge>0. x = ennreal q \<and> q \<le> r)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   818
  by (cases x) (auto simp: top_unique)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   819
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   820
lemma ennreal_less_iff: "0 \<le> r \<Longrightarrow> ennreal r < ennreal q \<longleftrightarrow> r < q"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   821
  unfolding not_le[symmetric] by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   822
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   823
lemma ennreal_eq_zero_iff[simp]: "0 \<le> x \<Longrightarrow> ennreal x = 0 \<longleftrightarrow> x = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   824
  by transfer (auto simp: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   825
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   826
lemma ennreal_less_zero_iff[simp]: "0 < ennreal x \<longleftrightarrow> 0 < x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   827
  by transfer (auto simp: max_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   828
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   829
lemma ennreal_lessI: "0 < q \<Longrightarrow> r < q \<Longrightarrow> ennreal r < ennreal q"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   830
  by (cases "0 \<le> r") (auto simp: ennreal_less_iff ennreal_neg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   831
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   832
lemma ennreal_leI: "x \<le> y \<Longrightarrow> ennreal x \<le> ennreal y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   833
  by (cases "0 \<le> y") (auto simp: ennreal_neg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   834
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   835
lemma enn2ereal_ennreal[simp]: "0 \<le> x \<Longrightarrow> enn2ereal (ennreal x) = x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   836
  by transfer (simp add: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   837
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   838
lemma e2ennreal_enn2ereal[simp]: "e2ennreal (enn2ereal x) = x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   839
  by (simp add: e2ennreal_def max_absorb2 ennreal.enn2ereal_inverse)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   840
67456
7895c159d7b1 added lemma
nipkow
parents: 67452
diff changeset
   841
lemma enn2ereal_e2ennreal: "x \<ge> 0 \<Longrightarrow> enn2ereal (e2ennreal x) = x"
7895c159d7b1 added lemma
nipkow
parents: 67452
diff changeset
   842
by (metis e2ennreal_enn2ereal ereal_ennreal_cases not_le)
7895c159d7b1 added lemma
nipkow
parents: 67452
diff changeset
   843
67451
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   844
lemma e2ennreal_ereal [simp]: "e2ennreal (ereal x) = ennreal x"
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   845
by (metis e2ennreal_def enn2ereal_inverse ennreal.rep_eq sup_ereal_def)
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   846
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   847
lemma ennreal_0[simp]: "ennreal 0 = 0"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   848
  by (simp add: ennreal_def zero_ennreal.abs_eq)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   849
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   850
lemma ennreal_1[simp]: "ennreal 1 = 1"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   851
  by transfer (simp add: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   852
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   853
lemma ennreal_eq_0_iff: "ennreal x = 0 \<longleftrightarrow> x \<le> 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   854
  by (cases "0 \<le> x") (auto simp: ennreal_neg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   855
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   856
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))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   857
  by (cases "0 \<le> y") (auto simp: ennreal_eq_0_iff ennreal_neg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   858
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   859
lemma ennreal_eq_1[simp]: "ennreal x = 1 \<longleftrightarrow> x = 1"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   860
  by (cases "0 \<le> x") (auto simp: ennreal_neg simp flip: ennreal_1)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   861
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   862
lemma ennreal_le_1[simp]: "ennreal x \<le> 1 \<longleftrightarrow> x \<le> 1"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   863
  by (cases "0 \<le> x") (auto simp: ennreal_neg simp flip: ennreal_1)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   864
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   865
lemma ennreal_ge_1[simp]: "ennreal x \<ge> 1 \<longleftrightarrow> x \<ge> 1"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   866
  by (cases "0 \<le> x") (auto simp: ennreal_neg simp flip: ennreal_1)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   867
64284
f3b905b2eee2 HOL-Analysis: more theorems from Sébastien Gouëzel's Ergodic_Theory
hoelzl
parents: 64272
diff changeset
   868
lemma one_less_ennreal[simp]: "1 < ennreal x \<longleftrightarrow> 1 < x"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   869
  by (meson ennreal_le_1 linorder_not_le)
64284
f3b905b2eee2 HOL-Analysis: more theorems from Sébastien Gouëzel's Ergodic_Theory
hoelzl
parents: 64272
diff changeset
   870
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   871
lemma ennreal_plus[simp]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   872
  "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a + b) = ennreal a + ennreal b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   873
  by (transfer fixing: a b) (auto simp: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   874
70378
ebd108578ab1 more new material about analysis
paulson <lp15@cam.ac.uk>
parents: 70365
diff changeset
   875
lemma add_mono_ennreal: "x < ennreal y \<Longrightarrow> x' < ennreal y' \<Longrightarrow> x + x' < ennreal (y + y')"
ebd108578ab1 more new material about analysis
paulson <lp15@cam.ac.uk>
parents: 70365
diff changeset
   876
  by (metis (full_types) add_strict_mono ennreal_less_zero_iff ennreal_plus less_le not_less zero_le)
ebd108578ab1 more new material about analysis
paulson <lp15@cam.ac.uk>
parents: 70365
diff changeset
   877
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   878
lemma sum_ennreal[simp]: "(\<And>i. i \<in> I \<Longrightarrow> 0 \<le> f i) \<Longrightarrow> (\<Sum>i\<in>I. ennreal (f i)) = ennreal (sum f I)"
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
   879
  by (induction I rule: infinite_finite_induct) (auto simp: sum_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   880
63882
018998c00003 renamed listsum -> sum_list, listprod ~> prod_list
nipkow
parents: 63540
diff changeset
   881
lemma sum_list_ennreal[simp]:
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
   882
  assumes "\<And>x. x \<in> set xs \<Longrightarrow> f x \<ge> 0"
63882
018998c00003 renamed listsum -> sum_list, listprod ~> prod_list
nipkow
parents: 63540
diff changeset
   883
  shows   "sum_list (map (\<lambda>x. ennreal (f x)) xs) = ennreal (sum_list (map f xs))"
63099
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   884
using assms
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   885
proof (induction xs)
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   886
  case (Cons x xs)
63882
018998c00003 renamed listsum -> sum_list, listprod ~> prod_list
nipkow
parents: 63540
diff changeset
   887
  from Cons have "(\<Sum>x\<leftarrow>x # xs. ennreal (f x)) = ennreal (f x) + ennreal (sum_list (map f xs))"
63099
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   888
    by simp
63882
018998c00003 renamed listsum -> sum_list, listprod ~> prod_list
nipkow
parents: 63540
diff changeset
   889
  also from Cons.prems have "\<dots> = ennreal (f x + sum_list (map f xs))"
018998c00003 renamed listsum -> sum_list, listprod ~> prod_list
nipkow
parents: 63540
diff changeset
   890
    by (intro ennreal_plus [symmetric] sum_list_nonneg) auto
63099
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   891
  finally show ?case by simp
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   892
qed simp_all
af0e964aad7b Moved material from AFP/Randomised_Social_Choice to distribution
eberlm
parents: 63060
diff changeset
   893
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   894
lemma ennreal_of_nat_eq_real_of_nat: "of_nat i = ennreal (of_nat i)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   895
  by (induction i) simp_all
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   896
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   897
lemma of_nat_le_ennreal_iff[simp]: "0 \<le> r \<Longrightarrow> of_nat i \<le> ennreal r \<longleftrightarrow> of_nat i \<le> r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   898
  by (simp add: ennreal_of_nat_eq_real_of_nat)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   899
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   900
lemma ennreal_le_of_nat_iff[simp]: "ennreal r \<le> of_nat i \<longleftrightarrow> r \<le> of_nat i"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   901
  by (simp add: ennreal_of_nat_eq_real_of_nat)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   902
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   903
lemma ennreal_indicator: "ennreal (indicator A x) = indicator A x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   904
  by (auto split: split_indicator)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   905
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   906
lemma ennreal_numeral[simp]: "ennreal (numeral n) = numeral n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   907
  using ennreal_of_nat_eq_real_of_nat[of "numeral n"] by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   908
70271
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   909
lemma ennreal_less_numeral_iff [simp]: "ennreal n < numeral w \<longleftrightarrow> n < numeral w"
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   910
  by (metis ennreal_less_iff ennreal_numeral less_le not_less zero_less_numeral)
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   911
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   912
lemma numeral_less_ennreal_iff [simp]: "numeral w < ennreal n \<longleftrightarrow> numeral w < n"
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   913
  using ennreal_less_iff zero_le_numeral by fastforce
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   914
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   915
lemma numeral_le_ennreal_iff [simp]: "numeral n \<le> ennreal m \<longleftrightarrow> numeral n \<le> m"
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   916
  by (metis not_le ennreal_less_numeral_iff)
f7630118814c a few general lemmas
paulson <lp15@cam.ac.uk>
parents: 69861
diff changeset
   917
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   918
lemma min_ennreal: "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> min (ennreal x) (ennreal y) = ennreal (min x y)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   919
  by (auto split: split_min)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   920
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   921
lemma ennreal_half[simp]: "ennreal (1/2) = inverse 2"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   922
  by transfer auto
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   923
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   924
lemma ennreal_minus: "0 \<le> q \<Longrightarrow> ennreal r - ennreal q = ennreal (r - q)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   925
  by transfer (simp add: zero_ereal_def flip: ereal_max)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   926
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   927
lemma ennreal_minus_top[simp]: "ennreal a - top = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   928
  by (simp add: minus_top_ennreal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   929
67451
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   930
lemma e2eenreal_enn2ereal_diff [simp]:
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   931
  "e2ennreal(enn2ereal x - enn2ereal y) = x - y" for x y
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   932
by (cases x, cases y, auto simp add: ennreal_minus e2ennreal_neg)
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
   933
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   934
lemma ennreal_mult: "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   935
  by transfer (simp add: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   936
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   937
lemma ennreal_mult': "0 \<le> a \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   938
  by (cases "0 \<le> b") (auto simp: ennreal_mult ennreal_neg mult_nonneg_nonpos)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   939
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   940
lemma indicator_mult_ennreal: "indicator A x * ennreal r = ennreal (indicator A x * r)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   941
  by (simp split: split_indicator)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   942
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   943
lemma ennreal_mult'': "0 \<le> b \<Longrightarrow> ennreal (a * b) = ennreal a * ennreal b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   944
  by (cases "0 \<le> a") (auto simp: ennreal_mult ennreal_neg mult_nonpos_nonneg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   945
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   946
lemma numeral_mult_ennreal: "0 \<le> x \<Longrightarrow> numeral b * ennreal x = ennreal (numeral b * x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   947
  by (simp add: ennreal_mult)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   948
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   949
lemma ennreal_power: "0 \<le> r \<Longrightarrow> ennreal r ^ n = ennreal (r ^ n)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   950
  by (induction n) (auto simp: ennreal_mult)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   951
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   952
lemma power_eq_top_ennreal: "x ^ n = top \<longleftrightarrow> (n \<noteq> 0 \<and> (x::ennreal) = top)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   953
  using not_gr_zero power_eq_top_ennreal_iff by force
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   954
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   955
lemma inverse_ennreal: "0 < r \<Longrightarrow> inverse (ennreal r) = ennreal (inverse r)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   956
  by transfer (simp add: max.absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   957
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   958
lemma divide_ennreal: "0 \<le> r \<Longrightarrow> 0 < q \<Longrightarrow> ennreal r / ennreal q = ennreal (r / q)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   959
  by (simp add: divide_ennreal_def inverse_ennreal ennreal_mult[symmetric] inverse_eq_divide)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   960
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   961
lemma ennreal_inverse_power: "inverse (x ^ n :: ennreal) = inverse x ^ n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   962
proof (cases x rule: ennreal_cases)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   963
  case top with power_eq_top_ennreal[of x n] show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   964
    by (cases "n = 0") auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   965
next
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   966
  case (real r) then show ?thesis
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   967
  proof (cases "x = 0")
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   968
    case False then show ?thesis
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
   969
      by (smt (verit, best) ennreal_0 ennreal_power inverse_ennreal
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   970
               inverse_nonnegative_iff_nonnegative power_inverse real zero_less_power)
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
   971
  qed (simp add: top_power_ennreal)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   972
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   973
73253
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   974
lemma power_divide_distrib_ennreal [algebra_simps]:
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   975
  "(x / y) ^ n = x ^ n / (y ^ n :: ennreal)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   976
  by (simp add: divide_ennreal_def ennreal_inverse_power power_mult_distrib)
73253
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   977
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   978
lemma ennreal_divide_numeral: "0 \<le> x \<Longrightarrow> ennreal x / numeral b = ennreal (x / numeral b)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   979
  by (subst divide_ennreal[symmetric]) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   980
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   981
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)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   982
  by (induction A rule: infinite_finite_induct)
64272
f76b6dda2e56 setprod -> prod
nipkow
parents: 64267
diff changeset
   983
     (auto simp: ennreal_mult prod_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   984
73253
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   985
lemma prod_mono_ennreal:
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   986
  assumes "\<And>x. x \<in> A \<Longrightarrow> f x \<le> (g x :: ennreal)"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   987
  shows   "prod f A \<le> prod g A"
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   988
  using assms by (induction A rule: infinite_finite_induct) (auto intro!: mult_mono)
f6bb31879698 HOL-Analysis/Probability: Hoeffding's inequality, negative binomial distribution, etc.
Manuel Eberl <eberlm@in.tum.de>
parents: 72236
diff changeset
   989
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   990
lemma mult_right_ennreal_cancel: "a * ennreal c = b * ennreal c \<longleftrightarrow> (a = b \<or> c \<le> 0)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
   991
  by (metis ennreal_eq_0_iff mult_divide_eq_ennreal mult_eq_0_iff top_neq_ennreal)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   992
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   993
lemma ennreal_le_epsilon:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   994
  "(\<And>e::real. y < top \<Longrightarrow> 0 < e \<Longrightarrow> x \<le> y + ennreal e) \<Longrightarrow> x \<le> y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   995
  apply (cases y rule: ennreal_cases)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   996
  apply (cases x rule: ennreal_cases)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
   997
  apply (auto simp flip: ennreal_plus simp add: top_unique intro: zero_less_one field_le_epsilon)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   998
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
   999
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1000
lemma ennreal_rat_dense:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1001
  fixes x y :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1002
  shows "x < y \<Longrightarrow> \<exists>r::rat. x < real_of_rat r \<and> real_of_rat r < y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1003
proof transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1004
  fix x y :: ereal assume xy: "0 \<le> x" "0 \<le> y" "x < y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1005
  moreover
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1006
  from ereal_dense3[OF \<open>x < y\<close>]
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1007
  obtain r where r: "x < ereal (real_of_rat r)" "ereal (real_of_rat r) < y"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1008
    by auto
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1009
  then have "0 \<le> r"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1010
    using le_less_trans[OF \<open>0 \<le> x\<close> \<open>x < ereal (real_of_rat r)\<close>] by auto
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1011
  with r show "\<exists>r. x < (sup 0 \<circ> ereal) (real_of_rat r) \<and> (sup 0 \<circ> ereal) (real_of_rat r) < y"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1012
    by (intro exI[of _ r]) (auto simp: max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1013
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1014
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1015
lemma ennreal_Ex_less_of_nat: "(x::ennreal) < top \<Longrightarrow> \<exists>n. x < of_nat n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1016
  by (cases x rule: ennreal_cases)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1017
     (auto simp: ennreal_of_nat_eq_real_of_nat ennreal_less_iff reals_Archimedean2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1018
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
  1019
subsection \<open>Coercion from \<^typ>\<open>ennreal\<close> to \<^typ>\<open>real\<close>\<close>
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1020
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1021
definition "enn2real x = real_of_ereal (enn2ereal x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1022
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1023
lemma enn2real_nonneg[simp]: "0 \<le> enn2real x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1024
  by (auto simp: enn2real_def intro!: real_of_ereal_pos enn2ereal_nonneg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1025
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1026
lemma enn2real_mono: "a \<le> b \<Longrightarrow> b < top \<Longrightarrow> enn2real a \<le> enn2real b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1027
  by (auto simp add: enn2real_def less_eq_ennreal.rep_eq intro!: real_of_ereal_positive_mono enn2ereal_nonneg)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1028
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1029
lemma enn2real_of_nat[simp]: "enn2real (of_nat n) = n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1030
  by (auto simp: enn2real_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1031
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1032
lemma enn2real_ennreal[simp]: "0 \<le> r \<Longrightarrow> enn2real (ennreal r) = r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1033
  by (simp add: enn2real_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1034
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1035
lemma ennreal_enn2real[simp]: "r < top \<Longrightarrow> ennreal (enn2real r) = r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1036
  by (cases r rule: ennreal_cases) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1037
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1038
lemma real_of_ereal_enn2ereal[simp]: "real_of_ereal (enn2ereal x) = enn2real x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1039
  by (simp add: enn2real_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1040
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1041
lemma enn2real_top[simp]: "enn2real top = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1042
  unfolding enn2real_def top_ennreal.rep_eq top_ereal_def by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1043
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1044
lemma enn2real_0[simp]: "enn2real 0 = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1045
  unfolding enn2real_def zero_ennreal.rep_eq by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1046
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1047
lemma enn2real_1[simp]: "enn2real 1 = 1"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1048
  unfolding enn2real_def one_ennreal.rep_eq by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1049
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1050
lemma enn2real_numeral[simp]: "enn2real (numeral n) = (numeral n)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1051
  unfolding enn2real_def by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1052
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1053
lemma enn2real_mult: "enn2real (a * b) = enn2real a * enn2real b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1054
  unfolding enn2real_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1055
  by (simp del: real_of_ereal_enn2ereal add: times_ennreal.rep_eq)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1056
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1057
lemma enn2real_leI: "0 \<le> B \<Longrightarrow> x \<le> ennreal B \<Longrightarrow> enn2real x \<le> B"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1058
  by (cases x rule: ennreal_cases) (auto simp: top_unique)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1059
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1060
lemma enn2real_positive_iff: "0 < enn2real x \<longleftrightarrow> (0 < x \<and> x < top)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1061
  by (cases x rule: ennreal_cases) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1062
70380
2b0dca68c3ee More analysis / measure theory material
paulson <lp15@cam.ac.uk>
parents: 70378
diff changeset
  1063
lemma enn2real_eq_posreal_iff[simp]: "c > 0 \<Longrightarrow> enn2real x = c \<longleftrightarrow> x = c"
64320
ba194424b895 HOL-Probability: move stopping time from AFP/Markov_Models
hoelzl
parents: 64284
diff changeset
  1064
  by (cases x) auto
ba194424b895 HOL-Probability: move stopping time from AFP/Markov_Models
hoelzl
parents: 64284
diff changeset
  1065
70381
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1066
lemma ennreal_enn2real_if: "ennreal (enn2real r) = (if r = top then 0 else r)"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1067
  by(auto intro!: ennreal_enn2real simp add: less_top)
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1068
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
  1069
subsection \<open>Coercion from \<^typ>\<open>enat\<close> to \<^typ>\<open>ennreal\<close>\<close>
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1070
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1071
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1072
definition ennreal_of_enat :: "enat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1073
where
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1074
  "ennreal_of_enat n = (case n of \<infinity> \<Rightarrow> top | enat n \<Rightarrow> of_nat n)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1075
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1076
declare [[coercion ennreal_of_enat]]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1077
declare [[coercion "of_nat :: nat \<Rightarrow> ennreal"]]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1078
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1079
lemma ennreal_of_enat_infty[simp]: "ennreal_of_enat \<infinity> = \<infinity>"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1080
  by (simp add: ennreal_of_enat_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1081
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1082
lemma ennreal_of_enat_enat[simp]: "ennreal_of_enat (enat n) = of_nat n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1083
  by (simp add: ennreal_of_enat_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1084
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1085
lemma ennreal_of_enat_0[simp]: "ennreal_of_enat 0 = 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1086
  using ennreal_of_enat_enat[of 0] unfolding enat_0 by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1087
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1088
lemma ennreal_of_enat_1[simp]: "ennreal_of_enat 1 = 1"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1089
  using ennreal_of_enat_enat[of 1] unfolding enat_1 by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1090
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1091
lemma ennreal_top_neq_of_nat[simp]: "(top::ennreal) \<noteq> of_nat i"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1092
  using ennreal_of_nat_neq_top[of i] by metis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1093
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1094
lemma ennreal_of_enat_inj[simp]: "ennreal_of_enat i = ennreal_of_enat j \<longleftrightarrow> i = j"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1095
  by (cases i j rule: enat.exhaust[case_product enat.exhaust]) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1096
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1097
lemma ennreal_of_enat_le_iff[simp]: "ennreal_of_enat m \<le> ennreal_of_enat n \<longleftrightarrow> m \<le> n"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1098
  by (auto simp: ennreal_of_enat_def top_unique split: enat.split)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1099
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1100
lemma of_nat_less_ennreal_of_nat[simp]: "of_nat n \<le> ennreal_of_enat x \<longleftrightarrow> of_nat n \<le> x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1101
  by (cases x) (auto simp: of_nat_eq_enat)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1102
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1103
lemma ennreal_of_enat_Sup: "ennreal_of_enat (Sup X) = (SUP x\<in>X. ennreal_of_enat x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1104
proof -
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1105
  have "ennreal_of_enat (Sup X) \<le> (SUP x \<in> X. ennreal_of_enat x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1106
    unfolding Sup_enat_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1107
  proof (clarsimp, intro conjI impI)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1108
    fix x assume "finite X" "X \<noteq> {}"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1109
    then show "ennreal_of_enat (Max X) \<le> (SUP x \<in> X. ennreal_of_enat x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1110
      by (intro SUP_upper Max_in)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1111
  next
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1112
    assume "infinite X" "X \<noteq> {}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1113
    have "\<exists>y\<in>X. r < ennreal_of_enat y" if r: "r < top" for r
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1114
    proof -
74325
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1115
      obtain n where n: "r < of_nat n"
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1116
        using ennreal_Ex_less_of_nat[OF r] ..
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1117
      have "\<not> (X \<subseteq> enat ` {.. n})"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1118
        using \<open>infinite X\<close> by (auto dest: finite_subset)
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1119
      then obtain x where x: "x \<in> X" "x \<notin> enat ` {..n}"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1120
        by blast
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1121
      then have "of_nat n \<le> x"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1122
        by (cases x) (auto simp: of_nat_eq_enat)
63540
f8652d0534fa tuned proofs -- avoid unstructured calculation;
wenzelm
parents: 63539
diff changeset
  1123
      with x show ?thesis
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1124
        by (auto intro!: bexI[of _ x] less_le_trans[OF n])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1125
    qed
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1126
    then have "(SUP x \<in> X. ennreal_of_enat x) = top"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1127
      by simp
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1128
    then show "top \<le> (SUP x \<in> X. ennreal_of_enat x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1129
      unfolding top_unique by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1130
  qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1131
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1132
    by (auto intro!: antisym Sup_least intro: Sup_upper)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1133
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1134
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1135
lemma ennreal_of_enat_eSuc[simp]: "ennreal_of_enat (eSuc x) = 1 + ennreal_of_enat x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1136
  by (cases x) (auto simp: eSuc_enat)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1137
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1138
(* Contributed by Dominique Unruh *)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1139
lemma ennreal_of_enat_plus[simp]: \<open>ennreal_of_enat (a+b) = ennreal_of_enat a + ennreal_of_enat b\<close>
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1140
proof (induct a)
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1141
  case (enat nat)
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1142
  with enat.simps show ?case
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1143
    by (smt (verit, del_insts) add.commute add_top_left_ennreal enat.exhaust enat_defs(4) ennreal_of_enat_def of_nat_add)
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1144
qed auto
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1145
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1146
(* Contributed by Dominique Unruh *)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1147
lemma sum_ennreal_of_enat[simp]: "(\<Sum>i\<in>I. ennreal_of_enat (f i)) = ennreal_of_enat (sum f I)"
74639
f831b6e589dc tuned proofs -- avoid z3, which is unavailable on arm64-linux;
wenzelm
parents: 74475
diff changeset
  1148
  by (induct I rule: infinite_finite_induct) (auto simp: sum_nonneg)
f831b6e589dc tuned proofs -- avoid z3, which is unavailable on arm64-linux;
wenzelm
parents: 74475
diff changeset
  1149
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1150
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
  1151
subsection \<open>Topology on \<^typ>\<open>ennreal\<close>\<close>
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1152
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1153
lemma enn2ereal_Iio: "enn2ereal -` {..<a} = (if 0 \<le> a then {..< e2ennreal a} else {})"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1154
  using enn2ereal_nonneg
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1155
  by (cases a rule: ereal_ennreal_cases)
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1156
     (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def 
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1157
           simp del: enn2ereal_nonneg
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1158
           intro: le_less_trans less_imp_le)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1159
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1160
lemma enn2ereal_Ioi: "enn2ereal -` {a <..} = (if 0 \<le> a then {e2ennreal a <..} else UNIV)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1161
  by (cases a rule: ereal_ennreal_cases)
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1162
     (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq e2ennreal_def 
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1163
           intro: less_le_trans)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1164
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1165
instantiation ennreal :: linear_continuum_topology
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1166
begin
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1167
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1168
definition open_ennreal :: "ennreal set \<Rightarrow> bool"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1169
  where "(open :: ennreal set \<Rightarrow> bool) = generate_topology (range lessThan \<union> range greaterThan)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1170
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1171
instance
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1172
proof
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1173
  show "\<exists>a b::ennreal. a \<noteq> b"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1174
    using zero_neq_one by (intro exI)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1175
  show "\<And>x y::ennreal. x < y \<Longrightarrow> \<exists>z>x. z < y"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1176
  proof transfer
74325
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1177
    fix x y :: ereal
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1178
    assume *: "0 \<le> x"
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1179
    assume "x < y"
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1180
    from dense[OF this] obtain z where "x < z \<and> z < y" ..
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1181
    with * show "\<exists>z\<in>Collect ((\<le>) 0). x < z \<and> z < y"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1182
      by (intro bexI[of _ z]) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1183
  qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1184
qed (rule open_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1185
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
  1186
end
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1187
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1188
lemma continuous_on_e2ennreal: "continuous_on A e2ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1189
proof (rule continuous_on_subset)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1190
  show "continuous_on ({0..} \<union> {..0}) e2ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1191
  proof (rule continuous_on_closed_Un)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1192
    show "continuous_on {0 ..} e2ennreal"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1193
      by (simp add: continuous_onI_mono e2ennreal_mono enn2ereal_range)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1194
    show "continuous_on {.. 0} e2ennreal"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1195
      by (metis atMost_iff continuous_on_cong continuous_on_const e2ennreal_neg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1196
  qed auto
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1197
qed auto
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1198
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1199
lemma continuous_at_e2ennreal: "continuous (at x within A) e2ennreal"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1200
  using continuous_on_e2ennreal continuous_on_imp_continuous_within top.extremum
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1201
  by blast
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1202
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1203
lemma continuous_on_enn2ereal: "continuous_on UNIV enn2ereal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1204
  by (rule continuous_on_generate_topology[OF open_generated_order])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1205
     (auto simp add: enn2ereal_Iio enn2ereal_Ioi)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1206
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1207
lemma continuous_at_enn2ereal: "continuous (at x within A) enn2ereal"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1208
  by (meson UNIV_I continuous_at_imp_continuous_at_within
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1209
      continuous_on_enn2ereal continuous_on_eq_continuous_within)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1210
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1211
lemma sup_continuous_e2ennreal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1212
  assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. e2ennreal (f x))"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1213
proof (rule sup_continuous_compose[OF _ f])
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1214
  show "sup_continuous e2ennreal"
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1215
    by (simp add: continuous_at_e2ennreal continuous_at_left_imp_sup_continuous e2ennreal_mono mono_def)
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1216
qed
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1217
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1218
lemma sup_continuous_enn2ereal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1219
  assumes f: "sup_continuous f" shows "sup_continuous (\<lambda>x. enn2ereal (f x))"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1220
proof (rule sup_continuous_compose[OF _ f])
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1221
  show "sup_continuous enn2ereal"
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1222
  by (simp add: continuous_at_enn2ereal continuous_at_left_imp_sup_continuous less_eq_ennreal.rep_eq mono_def)
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1223
qed
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1224
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1225
lemma sup_continuous_mult_left_ennreal':
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1226
  fixes c :: "ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1227
  shows "sup_continuous (\<lambda>x. c * x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1228
  unfolding sup_continuous_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1229
  by transfer (auto simp: SUP_ereal_mult_left max.absorb2 SUP_upper2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1230
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1231
lemma sup_continuous_mult_left_ennreal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1232
  "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. c * f x :: ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1233
  by (rule sup_continuous_compose[OF sup_continuous_mult_left_ennreal'])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1234
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1235
lemma sup_continuous_mult_right_ennreal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1236
  "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x * c :: ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1237
  using sup_continuous_mult_left_ennreal[of f c] by (simp add: mult.commute)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1238
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1239
lemma sup_continuous_divide_ennreal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1240
  fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1241
  shows "sup_continuous f \<Longrightarrow> sup_continuous (\<lambda>x. f x / c)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1242
  unfolding divide_ennreal_def by (rule sup_continuous_mult_right_ennreal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1243
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1244
lemma transfer_enn2ereal_continuous_on [transfer_rule]:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
  1245
  "rel_fun (=) (rel_fun (rel_fun (=) pcr_ennreal) (=)) continuous_on continuous_on"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1246
proof -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1247
  have "continuous_on A f" if "continuous_on A (\<lambda>x. enn2ereal (f x))" for A and f :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1248
    using continuous_on_compose2[OF continuous_on_e2ennreal[of "{0..}"] that]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1249
    by (auto simp: ennreal.enn2ereal_inverse subset_eq e2ennreal_def max_absorb2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1250
  moreover
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1251
  have "continuous_on A (\<lambda>x. enn2ereal (f x))" if "continuous_on A f" for A and f :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1252
    using continuous_on_compose2[OF continuous_on_enn2ereal that] by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1253
  ultimately
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1254
  show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1255
    by (auto simp add: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1256
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1257
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1258
lemma transfer_sup_continuous[transfer_rule]:
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
  1259
  "(rel_fun (rel_fun (=) pcr_ennreal) (=)) sup_continuous sup_continuous"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1260
proof (safe intro!: rel_funI dest!: rel_fun_eq_pcr_ennreal[THEN iffD1])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1261
  show "sup_continuous (enn2ereal \<circ> f) \<Longrightarrow> sup_continuous f" for f :: "'a \<Rightarrow> _"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1262
    using sup_continuous_e2ennreal[of "enn2ereal \<circ> f"] by simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1263
  show "sup_continuous f \<Longrightarrow> sup_continuous (enn2ereal \<circ> f)" for f :: "'a \<Rightarrow> _"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1264
    using sup_continuous_enn2ereal[of f] by (simp add: comp_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1265
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1266
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1267
lemma continuous_on_ennreal[tendsto_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1268
  "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. ennreal (f x))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1269
  by transfer (auto intro!: continuous_on_max continuous_on_const continuous_on_ereal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1270
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1271
lemma tendsto_ennrealD:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1272
  assumes lim: "((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1273
  assumes *: "\<forall>\<^sub>F x in F. 0 \<le> f x" and x: "0 \<le> x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1274
  shows "(f \<longlongrightarrow> x) F"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1275
proof -
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
  1276
  have "((\<lambda>x. enn2ereal (ennreal (f x))) \<longlongrightarrow> enn2ereal (ennreal x)) F
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1277
    \<longleftrightarrow> (f \<longlongrightarrow> enn2ereal (ennreal x)) F"
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1278
    using "*" eventually_mono
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1279
    by (intro tendsto_cong) fastforce
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1280
  then show ?thesis
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1281
    using assms(1) continuous_at_enn2ereal isCont_tendsto_compose x by fastforce
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1282
qed
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1283
73869
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1284
lemma tendsto_ennreal_iff [simp]:
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1285
  \<open>((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1286
  if \<open>\<forall>\<^sub>F x in F. 0 \<le> f x\<close> \<open>0 \<le> x\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1287
proof
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1288
  assume \<open>?P\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1289
  then show \<open>?Q\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1290
    using that by (rule tendsto_ennrealD)
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1291
next
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1292
  assume \<open>?Q\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1293
  have \<open>continuous_on UNIV ereal\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1294
    using continuous_on_ereal [of _ id] by simp
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1295
  then have \<open>continuous_on UNIV (e2ennreal \<circ> ereal)\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1296
    by (rule continuous_on_compose) (simp_all add: continuous_on_e2ennreal)
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1297
  then have \<open>((\<lambda>x. (e2ennreal \<circ> ereal) (f x)) \<longlongrightarrow> (e2ennreal \<circ> ereal) x) F\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1298
    using \<open>?Q\<close> by (rule continuous_on_tendsto_compose) simp_all
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1299
  then show \<open>?P\<close>
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1300
    by (simp flip: e2ennreal_ereal)
7181130f5872 more default simp rules
haftmann
parents: 73253
diff changeset
  1301
qed
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1302
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1303
lemma tendsto_enn2ereal_iff[simp]: "((\<lambda>i. enn2ereal (f i)) \<longlongrightarrow> enn2ereal x) F \<longleftrightarrow> (f \<longlongrightarrow> x) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1304
  using continuous_on_enn2ereal[THEN continuous_on_tendsto_compose, of f x F]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1305
    continuous_on_e2ennreal[THEN continuous_on_tendsto_compose, of "\<lambda>x. enn2ereal (f x)" "enn2ereal x" F UNIV]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1306
  by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1307
70381
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1308
lemma ennreal_tendsto_0_iff: "(\<And>n. f n \<ge> 0) \<Longrightarrow> ((\<lambda>n. ennreal (f n)) \<longlonglongrightarrow> 0) \<longleftrightarrow> (f \<longlonglongrightarrow> 0)"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1309
  by (metis (mono_tags) ennreal_0 eventuallyI order_refl tendsto_ennreal_iff)
81332
f94b30fa2b6c tuned proofs;
wenzelm
parents: 80777
diff changeset
  1310
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1311
lemma continuous_on_add_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1312
  fixes f g :: "'a::topological_space \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1313
  shows "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> continuous_on A (\<lambda>x. f x + g x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1314
  by (transfer fixing: A) (auto intro!: tendsto_add_ereal_nonneg simp: continuous_on_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1315
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1316
lemma continuous_on_inverse_ennreal[continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1317
  fixes f :: "'a::topological_space \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1318
  shows "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1319
proof (transfer fixing: A)
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
  1320
  show "pred_fun top  ((\<le>) 0) f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))" if "continuous_on A f"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1321
    for f :: "'a \<Rightarrow> ereal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1322
    using continuous_on_compose2[OF continuous_on_inverse_ereal that] by (auto simp: subset_eq)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1323
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1324
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1325
instance ennreal :: topological_comm_monoid_add
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1326
proof
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1327
  show "((\<lambda>x. fst x + snd x) \<longlongrightarrow> a + b) (nhds a \<times>\<^sub>F nhds b)" for a b :: ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1328
    using continuous_on_add_ennreal[of UNIV fst snd]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1329
    using tendsto_at_iff_tendsto_nhds[symmetric, of "\<lambda>x::(ennreal \<times> ennreal). fst x + snd x"]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1330
    by (auto simp: continuous_on_eq_continuous_at)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1331
       (simp add: isCont_def nhds_prod[symmetric])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1332
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1333
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1334
lemma sup_continuous_add_ennreal[order_continuous_intros]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1335
  fixes f g :: "'a::complete_lattice \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1336
  shows "sup_continuous f \<Longrightarrow> sup_continuous g \<Longrightarrow> sup_continuous (\<lambda>x. f x + g x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1337
  by transfer (auto intro!: sup_continuous_add)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1338
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1339
lemma ennreal_suminf_lessD: "(\<Sum>i. f i :: ennreal) < x \<Longrightarrow> f i < x"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
  1340
  using le_less_trans[OF sum_le_suminf[OF summableI, of "{i}" f]] by simp
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1341
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1342
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"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
  1343
  unfolding sums_def by (simp add: always_eventually sum_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1344
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1345
lemma summable_suminf_not_top: "(\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top \<Longrightarrow> summable f"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1346
  using summable_sums[OF summableI, of "\<lambda>i. ennreal (f i)"]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1347
  by (cases "\<Sum>i. ennreal (f i)" rule: ennreal_cases)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1348
     (auto simp: summable_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1349
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1350
lemma suminf_ennreal[simp]:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1351
  "(\<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)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1352
  by (rule sums_unique[symmetric]) (simp add: summable_suminf_not_top suminf_nonneg summable_sums)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1353
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1354
lemma sums_enn2ereal[simp]: "(\<lambda>i. enn2ereal (f i)) sums enn2ereal x \<longleftrightarrow> f sums x"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
  1355
  unfolding sums_def by (simp add: always_eventually sum_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1356
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1357
lemma suminf_enn2ereal[simp]: "(\<Sum>i. enn2ereal (f i)) = enn2ereal (suminf f)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1358
  by (metis summableI summable_sums sums_enn2ereal sums_unique)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1359
67399
eab6ce8368fa ran isabelle update_op on all sources
nipkow
parents: 66936
diff changeset
  1360
lemma transfer_e2ennreal_suminf [transfer_rule]: "rel_fun (rel_fun (=) pcr_ennreal) pcr_ennreal suminf suminf"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1361
  by (auto simp: rel_funI rel_fun_eq_pcr_ennreal comp_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1362
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1363
lemma ennreal_suminf_cmult[simp]: "(\<Sum>i. r * f i) = r * (\<Sum>i. f i::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1364
  by transfer (auto intro!: suminf_cmult_ereal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1365
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1366
lemma ennreal_suminf_multc[simp]: "(\<Sum>i. f i * r) = (\<Sum>i. f i::ennreal) * r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1367
  using ennreal_suminf_cmult[of r f] by (simp add: ac_simps)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1368
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1369
lemma ennreal_suminf_divide[simp]: "(\<Sum>i. f i / r) = (\<Sum>i. f i::ennreal) / r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1370
  by (simp add: divide_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1371
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1372
lemma ennreal_suminf_neq_top: "summable f \<Longrightarrow> (\<And>i. 0 \<le> f i) \<Longrightarrow> (\<Sum>i. ennreal (f i)) \<noteq> top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1373
  using sums_ennreal[of f "suminf f"]
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1374
  by (simp add: suminf_nonneg flip: sums_unique summable_sums_iff del: sums_ennreal)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1375
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1376
lemma suminf_ennreal_eq:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1377
  "(\<And>i. 0 \<le> f i) \<Longrightarrow> f sums x \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1378
  using suminf_nonneg[of f] sums_unique[of f x]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1379
  by (intro sums_unique[symmetric]) (auto simp: summable_sums_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1380
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1381
lemma ennreal_suminf_bound_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1382
  fixes f :: "nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1383
  shows "(\<And>N. (\<Sum>n<N. f n) + y \<le> x) \<Longrightarrow> suminf f + y \<le> x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1384
  by transfer (auto intro!: suminf_bound_add)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1385
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1386
lemma ennreal_suminf_SUP_eq_directed:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1387
  fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1388
  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"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1389
  shows "(\<Sum>n. SUP i\<in>I. f i n) = (SUP i\<in>I. \<Sum>n. f i n)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1390
proof cases
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1391
  assume "I \<noteq> {}"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1392
  then obtain i where "i \<in> I" by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1393
  from * show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1394
    by (transfer fixing: I)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1395
       (auto simp: max_absorb2 SUP_upper2[OF \<open>i \<in> I\<close>] suminf_nonneg summable_ereal_pos \<open>I \<noteq> {}\<close>
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1396
             intro!: suminf_SUP_eq_directed)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1397
qed (simp add: bot_ennreal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1398
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1399
lemma INF_ennreal_add_const:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1400
  fixes f g :: "nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1401
  shows "(INF i. f i + c) = (INF i. f i) + c"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1402
  using continuous_at_Inf_mono[of "\<lambda>x. x + c" "f`UNIV"]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1403
  using continuous_add[of "at_right (Inf (range f))", of "\<lambda>x. x" "\<lambda>x. c"]
69861
62e47f06d22c avoid context-sensitive simp rules whose context-free form (image_comp) is not simp by default
haftmann
parents: 69661
diff changeset
  1404
  by (auto simp: mono_def image_comp)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1405
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1406
lemma INF_ennreal_const_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1407
  fixes f g :: "nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1408
  shows "(INF i. c + f i) = c + (INF i. f i)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1409
  using INF_ennreal_add_const[of f c] by (simp add: ac_simps)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1410
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1411
lemma SUP_mult_left_ennreal: "c * (SUP i\<in>I. f i) = (SUP i\<in>I. c * f i ::ennreal)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1412
proof cases
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1413
  assume "I \<noteq> {}" then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1414
    by transfer (auto simp add: SUP_ereal_mult_left max_absorb2 SUP_upper2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1415
qed (simp add: bot_ennreal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1416
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1417
lemma SUP_mult_right_ennreal: "(SUP i\<in>I. f i) * c = (SUP i\<in>I. f i * c ::ennreal)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1418
  using SUP_mult_left_ennreal by (simp add: mult.commute)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1419
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1420
lemma SUP_divide_ennreal: "(SUP i\<in>I. f i) / c = (SUP i\<in>I. f i / c ::ennreal)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1421
  using SUP_mult_right_ennreal by (simp add: divide_ennreal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1422
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1423
lemma ennreal_SUP_of_nat_eq_top: "(SUP x. of_nat x :: ennreal) = top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1424
proof (intro antisym top_greatest le_SUP_iff[THEN iffD2] allI impI)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1425
  fix y :: ennreal assume "y < top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1426
  then obtain r where "y = ennreal r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1427
    by (cases y rule: ennreal_cases) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1428
  then show "\<exists>i\<in>UNIV. y < of_nat i"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1429
    using reals_Archimedean2[of "max 1 r"] zero_less_one
67451
12bcfbac45a1 move lemmas by Gouezel to distribution
nipkow
parents: 67443
diff changeset
  1430
    by (simp add: ennreal_Ex_less_of_nat)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1431
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1432
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1433
lemma ennreal_SUP_eq_top:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1434
  fixes f :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1435
  assumes "\<And>n. \<exists>i\<in>I. of_nat n \<le> f i"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1436
  shows "(SUP i \<in> I. f i) = top"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1437
proof -
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1438
  have "(SUP x. of_nat x :: ennreal) \<le> (SUP i \<in> I. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1439
    using assms by (auto intro!: SUP_least intro: SUP_upper2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1440
  then show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1441
    by (auto simp: ennreal_SUP_of_nat_eq_top top_unique)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1442
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1443
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1444
lemma ennreal_INF_const_minus:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1445
  fixes f :: "'a \<Rightarrow> ennreal"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1446
  shows "I \<noteq> {} \<Longrightarrow> (SUP x\<in>I. c - f x) = c - (INF x\<in>I. f x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1447
  by (transfer fixing: I)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1448
     (simp add: sup_max[symmetric] SUP_sup_const1 SUP_ereal_minus_right del: sup_ereal_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1449
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1450
lemma of_nat_Sup_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1451
  assumes "A \<noteq> {}" "bdd_above A"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1452
  shows "of_nat (Sup A) = (SUP a\<in>A. of_nat a :: ennreal)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1453
proof (intro antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1454
  show "(SUP a\<in>A. of_nat a::ennreal) \<le> of_nat (Sup A)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1455
    by (intro SUP_least of_nat_mono) (auto intro: cSup_upper assms)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1456
  have "Sup A \<in> A"
71834
919a55257e62 Fixes for Sup{} = (0::nat)
paulson <lp15@cam.ac.uk>
parents: 70381
diff changeset
  1457
    using assms by (auto simp: Sup_nat_def bdd_above_nat)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1458
  then show "of_nat (Sup A) \<le> (SUP a\<in>A. of_nat a::ennreal)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1459
    by (intro SUP_upper)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1460
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1461
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1462
lemma ennreal_tendsto_const_minus:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1463
  fixes g :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1464
  assumes ae: "\<forall>\<^sub>F x in F. g x \<le> c"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1465
  assumes g: "((\<lambda>x. c - g x) \<longlongrightarrow> 0) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1466
  shows "(g \<longlongrightarrow> c) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1467
proof (cases c rule: ennreal_cases)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1468
  case top with tendsto_unique[OF _ g, of "top"] show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1469
    by (cases "F = bot") auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1470
next
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1471
  case (real r)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1472
  then have "\<forall>x. \<exists>q\<ge>0. g x \<le> c \<longrightarrow> (g x = ennreal q \<and> q \<le> r)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1473
    by (auto simp: le_ennreal_iff)
63060
293ede07b775 some uses of 'obtain' with structure statement;
wenzelm
parents: 62975
diff changeset
  1474
  then obtain f where *: "0 \<le> f x" "g x = ennreal (f x)" "f x \<le> r" if "g x \<le> c" for x
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1475
    by metis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1476
  from ae have ae2: "\<forall>\<^sub>F x in F. c - g x = ennreal (r - f x) \<and> f x \<le> r \<and> g x = ennreal (f x) \<and> 0 \<le> f x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1477
  proof eventually_elim
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1478
    fix x assume "g x \<le> c" with *[of x] \<open>0 \<le> r\<close> show "c - g x = ennreal (r - f x) \<and> f x \<le> r \<and> g x = ennreal (f x) \<and> 0 \<le> f x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1479
      by (auto simp: real ennreal_minus)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1480
  qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1481
  with g have "((\<lambda>x. ennreal (r - f x)) \<longlongrightarrow> ennreal 0) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1482
    by (auto simp add: tendsto_cong eventually_conj_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1483
  with ae2 have "((\<lambda>x. r - f x) \<longlongrightarrow> 0) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1484
    by (subst (asm) tendsto_ennreal_iff) (auto elim: eventually_mono)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1485
  then have "(f \<longlongrightarrow> r) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1486
    by (rule Lim_transform2[OF tendsto_const])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1487
  with ae2 have "((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal r) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1488
    by (subst tendsto_ennreal_iff) (auto elim: eventually_mono simp: real)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1489
  with ae2 show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1490
    by (auto simp: real tendsto_cong eventually_conj_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1491
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1492
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1493
lemma ennreal_SUP_add:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1494
  fixes f g :: "nat \<Rightarrow> ennreal"
69313
b021008c5397 removed legacy input syntax
haftmann
parents: 69260
diff changeset
  1495
  shows "incseq f \<Longrightarrow> incseq g \<Longrightarrow> (SUP i. f i + g i) = Sup (f ` UNIV) + Sup (g ` UNIV)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1496
  unfolding incseq_def le_fun_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1497
  by transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1498
     (simp add: SUP_ereal_add incseq_def le_fun_def max_absorb2 SUP_upper2)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1499
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
  1500
lemma ennreal_SUP_sum:
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1501
  fixes f :: "'a \<Rightarrow> nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1502
  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)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1503
  unfolding incseq_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1504
  by transfer
64267
b9a1486e79be setsum -> sum
nipkow
parents: 64008
diff changeset
  1505
     (simp add: SUP_ereal_sum incseq_def SUP_upper2 max_absorb2 sum_nonneg)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1506
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1507
lemma ennreal_liminf_minus:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1508
  fixes f :: "nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1509
  shows "(\<And>n. f n \<le> c) \<Longrightarrow> liminf (\<lambda>n. c - f n) = c - limsup f"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1510
  apply transfer
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1511
  apply (simp add: ereal_diff_positive liminf_ereal_cminus)
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1512
  by (metis max.absorb2 ereal_diff_positive Limsup_bounded eventually_sequentiallyI)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1513
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1514
lemma ennreal_continuous_on_cmult:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1515
  "(c::ennreal) < top \<Longrightarrow> continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. c * f x)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1516
  by (transfer fixing: A) (auto intro: continuous_on_cmult_ereal)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1517
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1518
lemma ennreal_tendsto_cmult:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1519
  "(c::ennreal) < top \<Longrightarrow> (f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. c * f x) \<longlongrightarrow> c * x) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1520
  by (rule continuous_on_tendsto_compose[where g=f, OF ennreal_continuous_on_cmult, where s=UNIV])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1521
     (auto simp: continuous_on_id)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1522
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1523
lemma tendsto_ennrealI[intro, simp, tendsto_intros]:
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1524
  "(f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. ennreal (f x)) \<longlongrightarrow> ennreal x) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1525
  by (auto simp: ennreal_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1526
           intro!: continuous_on_tendsto_compose[OF continuous_on_e2ennreal[of UNIV]] tendsto_max)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1527
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1528
lemma tendsto_enn2erealI [tendsto_intros]:
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1529
  assumes "(f \<longlongrightarrow> l) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1530
  shows "((\<lambda>i. enn2ereal(f i)) \<longlongrightarrow> enn2ereal l) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1531
using tendsto_enn2ereal_iff assms by auto
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1532
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1533
lemma tendsto_e2ennrealI [tendsto_intros]:
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1534
  assumes "(f \<longlongrightarrow> l) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1535
  shows "((\<lambda>i. e2ennreal(f i)) \<longlongrightarrow> e2ennreal l) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1536
proof -
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1537
  have *: "e2ennreal (max x 0) = e2ennreal x" for x
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1538
    by (simp add: e2ennreal_def max.commute)
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1539
  have "((\<lambda>i. max (f i) 0) \<longlongrightarrow> max l 0) F"
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1540
    using assms by (intro tendsto_intros) auto
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1541
  then have "((\<lambda>i. enn2ereal(e2ennreal (max (f i) 0))) \<longlongrightarrow> enn2ereal (e2ennreal (max l 0))) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1542
    by (subst enn2ereal_e2ennreal, auto)+
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1543
  then have "((\<lambda>i. e2ennreal (max (f i) 0)) \<longlongrightarrow> e2ennreal (max l 0)) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1544
    using tendsto_enn2ereal_iff by auto
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1545
  then show ?thesis
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1546
    unfolding * by auto
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1547
qed
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1548
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1549
lemma ennreal_suminf_minus:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1550
  fixes f g :: "nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1551
  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"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1552
  by transfer
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1553
     (auto simp add: ereal_diff_positive suminf_le_pos top_ereal_def intro!: suminf_ereal_minus)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1554
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1555
lemma ennreal_Sup_countable_SUP:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1556
  "A \<noteq> {} \<Longrightarrow> \<exists>f::nat \<Rightarrow> ennreal. incseq f \<and> range f \<subseteq> A \<and> Sup A = (SUP i. f i)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1557
  unfolding incseq_def
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1558
  apply transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1559
  subgoal for A
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1560
    using Sup_countable_SUP[of A]
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1561
    by (force simp add: incseq_def[symmetric] SUP_upper2 image_subset_iff Sup_upper2 cong: conj_cong)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1562
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1563
63940
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1564
lemma ennreal_Inf_countable_INF:
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1565
  "A \<noteq> {} \<Longrightarrow> \<exists>f::nat \<Rightarrow> ennreal. decseq f \<and> range f \<subseteq> A \<and> Inf A = (INF i. f i)"
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1566
  unfolding decseq_def
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1567
  apply transfer
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1568
  subgoal for A
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1569
    using Inf_countable_INF[of A] by (simp flip: decseq_def) blast
63940
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1570
  done
0d82c4c94014 prove HK-integrable implies Lebesgue measurable; prove HK-integral equals Lebesgue integral for nonneg functions
hoelzl
parents: 63882
diff changeset
  1571
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1572
lemma ennreal_SUP_countable_SUP:
69313
b021008c5397 removed legacy input syntax
haftmann
parents: 69260
diff changeset
  1573
  "A \<noteq> {} \<Longrightarrow> \<exists>f::nat \<Rightarrow> ennreal. range f \<subseteq> g`A \<and> Sup (g ` A) = Sup (f ` UNIV)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1574
  using ennreal_Sup_countable_SUP [of "g`A"] by auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1575
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1576
lemma of_nat_tendsto_top_ennreal: "(\<lambda>n::nat. of_nat n :: ennreal) \<longlonglongrightarrow> top"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1577
  using LIMSEQ_SUP[of "of_nat :: nat \<Rightarrow> ennreal"]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1578
  by (simp add: ennreal_SUP_of_nat_eq_top incseq_def)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1579
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1580
lemma SUP_sup_continuous_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1581
  fixes f :: "ennreal \<Rightarrow> 'a::complete_lattice"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1582
  assumes f: "sup_continuous f" and "I \<noteq> {}"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1583
  shows "(SUP i\<in>I. f (g i)) = f (SUP i\<in>I. g i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1584
proof (rule antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1585
  show "(SUP i\<in>I. f (g i)) \<le> f (SUP i\<in>I. g i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1586
    by (rule mono_SUP[OF sup_continuous_mono[OF f]])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1587
  from ennreal_Sup_countable_SUP[of "g`I"] \<open>I \<noteq> {}\<close>
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1588
  obtain M :: "nat \<Rightarrow> ennreal" where "incseq M" and M: "range M \<subseteq> g ` I" and eq: "(SUP i \<in> I. g i) = (SUP i. M i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1589
    by auto
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1590
  have "f (SUP i \<in> I. g i) = (SUP i \<in> range M. f i)"
69861
62e47f06d22c avoid context-sensitive simp rules whose context-free form (image_comp) is not simp by default
haftmann
parents: 69661
diff changeset
  1591
    unfolding eq sup_continuousD[OF f \<open>mono M\<close>] by (simp add: image_comp)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1592
  also have "\<dots> \<le> (SUP i \<in> I. f (g i))"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1593
    by (smt (verit) M SUP_le_iff dual_order.refl image_iff subsetD)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1594
  finally show "f (SUP i \<in> I. g i) \<le> (SUP i \<in> I. f (g i))" .
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1595
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1596
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1597
lemma ennreal_suminf_SUP_eq:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1598
  fixes f :: "nat \<Rightarrow> nat \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1599
  shows "(\<And>i. incseq (\<lambda>n. f n i)) \<Longrightarrow> (\<Sum>i. SUP n. f n i) = (SUP n. \<Sum>i. f n i)"
80777
623d46973cbe More tidying of old proofs
paulson <lp15@cam.ac.uk>
parents: 79566
diff changeset
  1600
  by (metis ennreal_suminf_SUP_eq_directed incseqD nat_le_linear)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1601
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1602
lemma ennreal_SUP_add_left:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1603
  fixes c :: ennreal
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1604
  shows "I \<noteq> {} \<Longrightarrow> (SUP i\<in>I. f i + c) = (SUP i\<in>I. f i) + c"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1605
  apply transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1606
  apply (simp add: SUP_ereal_add_left)
81763
2cf8f8e4c1fd Simplified a lot of messy proofs
paulson <lp15@cam.ac.uk>
parents: 81332
diff changeset
  1607
  by (metis SUP_upper all_not_in_conv add_increasing2 max.absorb2 max.bounded_iff)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1608
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1609
lemma ennreal_SUP_const_minus:
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1610
  fixes f :: "'a \<Rightarrow> ennreal"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1611
  shows "I \<noteq> {} \<Longrightarrow> c < top \<Longrightarrow> (INF x\<in>I. c - f x) = c - (SUP x\<in>I. f x)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1612
  apply (transfer fixing: I)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1613
  unfolding ex_in_conv[symmetric]
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1614
  apply (auto simp add: SUP_upper2 sup_absorb2 simp flip: sup_ereal_def)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1615
  apply (subst INF_ereal_minus_right[symmetric])
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1616
  apply (auto simp del: sup_ereal_def simp add: sup_INF)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1617
  done
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1618
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1619
(* Contributed by Dominique Unruh *)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1620
lemma isCont_ennreal[simp]: \<open>isCont ennreal x\<close>
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1621
  unfolding continuous_within tendsto_def
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1622
  using tendsto_ennrealI topological_tendstoD  
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1623
  by (blast intro: sequentially_imp_eventually_within)
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1624
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1625
(* Contributed by Dominique Unruh *)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1626
lemma isCont_ennreal_of_enat[simp]: \<open>isCont ennreal_of_enat x\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1627
proof -
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1628
  have continuous_at_open:
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1629
    \<comment> \<open>Copied lemma from \<^session>\<open>HOL-Analysis\<close> to avoid dependency.\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1630
      "continuous (at x) f \<longleftrightarrow> (\<forall>t. open t \<and> f x \<in> t --> (\<exists>s. open s \<and> x \<in> s \<and> (\<forall>x' \<in> s. (f x') \<in> t)))" for f :: \<open>enat \<Rightarrow> 'z::topological_space\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1631
    unfolding continuous_within_topological [of x UNIV f]
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1632
    unfolding imp_conjL
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1633
    by (intro all_cong imp_cong ex_cong conj_cong refl) auto
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1634
  show ?thesis
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1635
  proof (subst continuous_at_open, intro allI impI, cases \<open>x = \<infinity>\<close>)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1636
    case True
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1637
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1638
    fix t assume \<open>open t \<and> ennreal_of_enat x \<in> t\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1639
    then have \<open>\<exists>y<\<infinity>. {y <.. \<infinity>} \<subseteq> t\<close>
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1640
      by (rule_tac open_left[where y=0]) (auto simp: True)
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1641
    then obtain y where \<open>{y<..} \<subseteq> t\<close> and \<open>y \<noteq> \<infinity>\<close>
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1642
      by fastforce
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1643
    from \<open>y \<noteq> \<infinity>\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1644
    obtain x' where x'y: \<open>ennreal_of_enat x' > y\<close> and \<open>x' \<noteq> \<infinity>\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1645
      by (metis enat.simps(3) ennreal_Ex_less_of_nat ennreal_of_enat_enat infinity_ennreal_def top.not_eq_extremum)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1646
    define s where \<open>s = {x'<..}\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1647
    have \<open>open s\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1648
      by (simp add: s_def)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1649
    moreover have \<open>x \<in> s\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1650
      by (simp add: \<open>x' \<noteq> \<infinity>\<close> s_def True)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1651
    moreover have \<open>ennreal_of_enat z \<in> t\<close> if \<open>z \<in> s\<close> for z
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1652
      by (metis x'y \<open>{y<..} \<subseteq> t\<close> ennreal_of_enat_le_iff greaterThan_iff le_less_trans less_imp_le not_less s_def subsetD that)
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1653
    ultimately show \<open>\<exists>s. open s \<and> x \<in> s \<and> (\<forall>z\<in>s. ennreal_of_enat z \<in> t)\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1654
      by auto
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1655
  next
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1656
    case False
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1657
    fix t assume asm: \<open>open t \<and> ennreal_of_enat x \<in> t\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1658
    define s where \<open>s = {x}\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1659
    have \<open>open s\<close>
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1660
      using False open_enat_iff s_def by blast
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1661
    then show \<open>\<exists>s. open s \<and> x \<in> s \<and> (\<forall>z\<in>s. ennreal_of_enat z \<in> t)\<close>
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1662
      using asm s_def by blast
74475
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1663
  qed
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1664
qed
409ca22dee4c new notion of infinite sums in HOL-Analysis, ordering on complex numbers
eberlm <eberlm@in.tum.de>
parents: 74325
diff changeset
  1665
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1666
subsection \<open>Approximation lemmas\<close>
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1667
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1668
lemma INF_approx_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1669
  fixes x::ennreal and e::real
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1670
  assumes "e > 0"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1671
  assumes "x = (INF i \<in> A. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1672
  assumes "x \<noteq> \<infinity>"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1673
  shows "\<exists>i \<in> A. f i < x + e"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1674
  using INF_less_iff assms by fastforce
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1675
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1676
lemma SUP_approx_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1677
  fixes x::ennreal and e::real
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1678
  assumes "e > 0" "A \<noteq> {}"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1679
  assumes SUP: "x = (SUP i \<in> A. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1680
  assumes "x \<noteq> \<infinity>"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1681
  shows "\<exists>i \<in> A. x < f i + e"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1682
proof -
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1683
  have "x < x + e"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1684
    using \<open>0<e\<close> \<open>x \<noteq> \<infinity>\<close> by (cases x) auto
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1685
  also have "x + e = (SUP i \<in> A. f i + e)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1686
    unfolding SUP ennreal_SUP_add_left[OF \<open>A \<noteq> {}\<close>] ..
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1687
  finally show ?thesis
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1688
    unfolding less_SUP_iff .
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1689
qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1690
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1691
lemma ennreal_approx_SUP:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1692
  fixes x::ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1693
  assumes f_bound: "\<And>i. i \<in> A \<Longrightarrow> f i \<le> x"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1694
  assumes approx: "\<And>e. (e::real) > 0 \<Longrightarrow> \<exists>i \<in> A. x \<le> f i + e"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1695
  shows "x = (SUP i \<in> A. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1696
proof (rule antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1697
  show "x \<le> (SUP i\<in>A. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1698
  proof (rule ennreal_le_epsilon)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1699
    fix e :: real assume "0 < e"
74325
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1700
    from approx[OF this] obtain i where "i \<in> A" and *: "x \<le> f i + ennreal e"
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1701
      by blast
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1702
    from * have "x \<le> f i + e"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1703
      by simp
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1704
    also have "\<dots> \<le> (SUP i\<in>A. f i) + e"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1705
      by (intro add_mono \<open>i \<in> A\<close> SUP_upper order_refl)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1706
    finally show "x \<le> (SUP i\<in>A. f i) + e" .
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1707
  qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1708
qed (intro SUP_least f_bound)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1709
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1710
lemma ennreal_approx_INF:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1711
  fixes x::ennreal
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1712
  assumes f_bound: "\<And>i. i \<in> A \<Longrightarrow> x \<le> f i"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1713
  assumes approx: "\<And>e. (e::real) > 0 \<Longrightarrow> \<exists>i \<in> A. f i \<le> x + e"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1714
  shows "x = (INF i \<in> A. f i)"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1715
proof (rule antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1716
  show "(INF i\<in>A. f i) \<le> x"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1717
  proof (rule ennreal_le_epsilon)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1718
    fix e :: real assume "0 < e"
74325
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1719
    from approx[OF this] obtain i where "i\<in>A" "f i \<le> x + ennreal e"
8d0c2d74ad63 tuned proofs --- eliminated 'guess';
wenzelm
parents: 73933
diff changeset
  1720
      by blast
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1721
    then have "(INF i\<in>A. f i) \<le> f i"
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1722
      by (intro INF_lower)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1723
    also have "\<dots> \<le> x + e"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1724
      by fact
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1725
    finally show "(INF i\<in>A. f i) \<le> x + e" .
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1726
  qed
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1727
qed (intro INF_greatest f_bound)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1728
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1729
lemma ennreal_approx_unit:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1730
  "(\<And>a::ennreal. 0 < a \<Longrightarrow> a < 1 \<Longrightarrow> a * z \<le> y) \<Longrightarrow> z \<le> y"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1731
  using SUP_mult_right_ennreal[of "\<lambda>x. x" "{0 <..< 1}" z]
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1732
  by (smt (verit) SUP_least Sup_greaterThanLessThan greaterThanLessThan_iff
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1733
      image_ident mult_1 zero_less_one)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1734
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1735
lemma suminf_ennreal2:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1736
  "(\<And>i. 0 \<le> f i) \<Longrightarrow> summable f \<Longrightarrow> (\<Sum>i. ennreal (f i)) = ennreal (\<Sum>i. f i)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1737
  using suminf_ennreal_eq by blast
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1738
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1739
lemma less_top_ennreal: "x < top \<longleftrightarrow> (\<exists>r\<ge>0. x = ennreal r)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1740
  by (cases x) auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1741
70381
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1742
lemma enn2real_less_iff[simp]: "x < top \<Longrightarrow> enn2real x < c \<longleftrightarrow> x < c"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1743
  using ennreal_less_iff less_top_ennreal by auto
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1744
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1745
lemma enn2real_le_iff[simp]: "\<lbrakk>x < top; c > 0\<rbrakk> \<Longrightarrow> enn2real x \<le> c \<longleftrightarrow> x \<le> c"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1746
  by (cases x) auto
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1747
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1748
lemma enn2real_less:
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1749
  assumes "enn2real e < r" "e \<noteq> top" shows "e < ennreal r"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1750
  using enn2real_less_iff assms top.not_eq_extremum by blast
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1751
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1752
lemma enn2real_le:
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1753
  assumes "enn2real e \<le> r" "e \<noteq> top" shows "e \<le> ennreal r"
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1754
  by (metis assms enn2real_less ennreal_enn2real_if eq_iff less_le)
b151d1f00204 More results about measure and integration theory
paulson <lp15@cam.ac.uk>
parents: 70380
diff changeset
  1755
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1756
lemma tendsto_top_iff_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1757
  fixes f :: "'a \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1758
  shows "(f \<longlongrightarrow> top) F \<longleftrightarrow> (\<forall>l\<ge>0. eventually (\<lambda>x. ennreal l < f x) F)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1759
  by (auto simp: less_top_ennreal order_tendsto_iff )
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1760
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1761
lemma ennreal_tendsto_top_eq_at_top:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1762
  "((\<lambda>z. ennreal (f z)) \<longlongrightarrow> top) F \<longleftrightarrow> (LIM z F. f z :> at_top)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1763
  unfolding filterlim_at_top_dense tendsto_top_iff_ennreal
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1764
  using ennreal_less_iff eventually_mono allE[of _ "max 0 _"]
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1765
  by (smt (verit) linorder_not_less order_refl order_trans)
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1766
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1767
lemma tendsto_0_if_Limsup_eq_0_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1768
  fixes f :: "_ \<Rightarrow> ennreal"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1769
  shows "Limsup F f = 0 \<Longrightarrow> (f \<longlongrightarrow> 0) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1770
  using Liminf_le_Limsup[of F f] tendsto_iff_Liminf_eq_Limsup[of F f 0]
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1771
  by (cases "F = bot") auto
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1772
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1773
lemma diff_le_self_ennreal[simp]: "a - b \<le> (a::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1774
  by (cases a b rule: ennreal2_cases) (auto simp: ennreal_minus)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1775
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1776
lemma ennreal_ineq_diff_add: "b \<le> a \<Longrightarrow> a = b + (a - b::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1777
  by transfer (auto simp: ereal_diff_positive max.absorb2 ereal_ineq_diff_add)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1778
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1779
lemma ennreal_mult_strict_left_mono: "(a::ennreal) < c \<Longrightarrow> 0 < b \<Longrightarrow> b < top \<Longrightarrow> b * a < b * c"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1780
  by transfer (auto intro!: ereal_mult_strict_left_mono)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1781
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1782
lemma ennreal_between: "0 < e \<Longrightarrow> 0 < x \<Longrightarrow> x < top \<Longrightarrow> x - e < (x::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1783
  by transfer (auto intro!: ereal_between)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1784
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1785
lemma minus_less_iff_ennreal: "b < top \<Longrightarrow> b \<le> a \<Longrightarrow> a - b < c \<longleftrightarrow> a < c + (b::ennreal)"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1786
  by transfer
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1787
     (auto simp: top_ereal_def ereal_minus_less le_less)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1788
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1789
lemma tendsto_zero_ennreal:
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1790
  assumes ev: "\<And>r. 0 < r \<Longrightarrow> \<forall>\<^sub>F x in F. f x < ennreal r"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1791
  shows "(f \<longlongrightarrow> 0) F"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1792
proof (rule order_tendstoI)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1793
  fix e::ennreal assume "e > 0"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1794
  obtain e'::real where "e' > 0" "ennreal e' < e"
63145
703edebd1d92 isabelle update_cartouches -c -t;
wenzelm
parents: 63099
diff changeset
  1795
    using \<open>0 < e\<close> dense[of 0 "if e = top then 1 else (enn2real e)"]
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1796
    by (cases e) (auto simp: ennreal_less_iff)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1797
  from ev[OF \<open>e' > 0\<close>] show "\<forall>\<^sub>F x in F. f x < e"
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1798
    by eventually_elim (insert \<open>ennreal e' < e\<close>, auto)
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1799
qed simp
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1800
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1801
lifting_update ennreal.lifting
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1802
lifting_forget ennreal.lifting
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  1803
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1804
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 69313
diff changeset
  1805
subsection \<open>\<^typ>\<open>ennreal\<close> theorems\<close>
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1806
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1807
lemma neq_top_trans: fixes x y :: ennreal shows "\<lbrakk> y \<noteq> top; x \<le> y \<rbrakk> \<Longrightarrow> x \<noteq> top"
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  1808
  by (auto simp: top_unique)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1809
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1810
lemma diff_diff_ennreal: fixes a b :: ennreal shows "a \<le> b \<Longrightarrow> b \<noteq> \<infinity> \<Longrightarrow> b - (b - a) = a"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1811
  by (cases a b rule: ennreal2_cases) (auto simp: ennreal_minus top_unique)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1812
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1813
lemma ennreal_less_one_iff[simp]: "ennreal x < 1 \<longleftrightarrow> x < 1"
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1814
  by (cases "0 \<le> x") (auto simp: ennreal_neg ennreal_less_iff simp flip: ennreal_1)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1815
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1816
lemma SUP_const_minus_ennreal:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1817
  fixes f :: "'a \<Rightarrow> ennreal" shows "I \<noteq> {} \<Longrightarrow> (SUP x\<in>I. c - f x) = c - (INF x\<in>I. f x)"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1818
  including ennreal.lifting
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1819
  by (transfer fixing: I)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1820
     (simp add: SUP_sup_distrib[symmetric] SUP_ereal_minus_right
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1821
           flip: sup_ereal_def)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1822
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1823
lemma zero_minus_ennreal[simp]: "0 - (a::ennreal) = 0"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1824
  including ennreal.lifting
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1825
  by transfer (simp split: split_max)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1826
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1827
lemma diff_diff_commute_ennreal:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1828
  fixes a b c :: ennreal shows "a - b - c = a - c - b"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1829
  by (cases a b c rule: ennreal3_cases) (simp_all add: ennreal_minus field_simps)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1830
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1831
lemma diff_gr0_ennreal: "b < (a::ennreal) \<Longrightarrow> 0 < a - b"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1832
  including ennreal.lifting by transfer (auto simp: ereal_diff_gr0 ereal_diff_positive split: split_max)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1833
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1834
lemma divide_le_posI_ennreal:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1835
  fixes x y z :: ennreal
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1836
  shows "x > 0 \<Longrightarrow> z \<le> x * y \<Longrightarrow> z / x \<le> y"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1837
  by (cases x y z rule: ennreal3_cases)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1838
     (auto simp: divide_ennreal ennreal_mult[symmetric] field_simps top_unique)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1839
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1840
lemma add_diff_eq_ennreal:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1841
  fixes x y z :: ennreal
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1842
  shows "z \<le> y \<Longrightarrow> x + (y - z) = x + y - z"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1843
  using ennreal_diff_add_assoc by auto
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1844
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1845
lemma add_diff_inverse_ennreal:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1846
  fixes x y :: ennreal shows "x \<le> y \<Longrightarrow> x + (y - x) = y"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1847
  by (cases x) (simp_all add: top_unique add_diff_eq_ennreal)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1848
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1849
lemma add_diff_eq_iff_ennreal[simp]:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1850
  fixes x y :: ennreal shows "x + (y - x) = y \<longleftrightarrow> x \<le> y"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1851
  by (metis ennreal_ineq_diff_add le_iff_add)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1852
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1853
lemma add_diff_le_ennreal: "a + b - c \<le> a + (b - c::ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1854
  apply (cases a b c rule: ennreal3_cases)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1855
  subgoal for a' b' c'
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1856
    by (cases "0 \<le> b' - c'") (simp_all add: ennreal_minus top_add ennreal_neg flip: ennreal_plus)
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1857
  apply (simp_all add: top_add flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1858
  done
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1859
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1860
lemma diff_eq_0_ennreal: "a < top \<Longrightarrow> a \<le> b \<Longrightarrow> a - b = (0::ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1861
  using ennreal_minus_pos_iff gr_zeroI not_less by blast
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1862
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1863
lemma diff_diff_ennreal': fixes x y z :: ennreal shows "z \<le> y \<Longrightarrow> y - z \<le> x \<Longrightarrow> x - (y - z) = x + z - y"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1864
  by (cases x; cases y; cases z)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1865
     (auto simp add: top_add add_top minus_top_ennreal ennreal_minus top_unique
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1866
           simp flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1867
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1868
lemma diff_diff_ennreal'': fixes x y z :: ennreal
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1869
  shows "z \<le> y \<Longrightarrow> x - (y - z) = (if y - z \<le> x then x + z - y else 0)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1870
  by (cases x; cases y; cases z)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1871
     (auto simp add: top_add add_top minus_top_ennreal ennreal_minus top_unique ennreal_neg
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1872
           simp flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1873
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1874
lemma power_less_top_ennreal: fixes x :: ennreal shows "x ^ n < top \<longleftrightarrow> x < top \<or> n = 0"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1875
  using power_eq_top_ennreal top.not_eq_extremum
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1876
  by blast
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1877
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1878
lemma ennreal_divide_times: "(a / b) * c = a * (c / b :: ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1879
  by (simp add: mult.commute ennreal_times_divide)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1880
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1881
lemma diff_less_top_ennreal: "a - b < top \<longleftrightarrow>  a < (top :: ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1882
  by (cases a; cases b) (auto simp: ennreal_minus)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1883
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1884
lemma divide_less_ennreal: "b \<noteq> 0 \<Longrightarrow> b < top \<Longrightarrow> a / b < c \<longleftrightarrow> a < (c * b :: ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1885
  by (cases a; cases b; cases c)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1886
     (auto simp: divide_ennreal ennreal_mult[symmetric] ennreal_less_iff field_simps ennreal_top_mult ennreal_top_divide)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1887
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1888
lemma one_less_numeral[simp]: "1 < (numeral n::ennreal) \<longleftrightarrow> (num.One < n)"
81804
5a2e05eb7001 polished messy proofs
paulson <lp15@cam.ac.uk>
parents: 81763
diff changeset
  1889
  by simp
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1890
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1891
lemma divide_eq_1_ennreal: "a / b = (1::ennreal) \<longleftrightarrow> (b \<noteq> top \<and> b \<noteq> 0 \<and> b = a)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1892
  by (cases a ; cases b; cases "b = 0") (auto simp: ennreal_top_divide divide_ennreal split: if_split_asm)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1893
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1894
lemma ennreal_mult_cancel_left: "(a * b = a * c) = (a = top \<and> b \<noteq> 0 \<and> c \<noteq> 0 \<or> a = 0 \<or> b = (c::ennreal))"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1895
  by (cases a; cases b; cases c) (auto simp: ennreal_mult[symmetric] ennreal_mult_top ennreal_top_mult)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1896
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1897
lemma ennreal_minus_if: "ennreal a - ennreal b = ennreal (if 0 \<le> b then (if b \<le> a then a - b else 0) else a)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1898
  by (auto simp: ennreal_minus ennreal_neg)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1899
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1900
lemma ennreal_plus_if: "ennreal a + ennreal b = ennreal (if 0 \<le> a then (if 0 \<le> b then a + b else a) else b)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1901
  by (auto simp: ennreal_neg)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1902
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1903
lemma ennreal_diff_le_mono_left: "a \<le> b \<Longrightarrow> a - c \<le> (b::ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1904
  using ennreal_mono_minus[of 0 c a, THEN order_trans, of b] by simp
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1905
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1906
lemma ennreal_minus_le_iff: "a - b \<le> c \<longleftrightarrow> (a \<le> b + (c::ennreal) \<and> (a = top \<and> b = top \<longrightarrow> c = top))"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1907
  by (cases a; cases b; cases c)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1908
     (auto simp: top_unique top_add add_top ennreal_minus simp flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1909
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1910
lemma ennreal_le_minus_iff: "a \<le> b - c \<longleftrightarrow> (a + c \<le> (b::ennreal) \<or> (a = 0 \<and> b \<le> c))"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1911
  by (cases a; cases b; cases c)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1912
     (auto simp: top_unique top_add add_top ennreal_minus ennreal_le_iff2
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1913
           simp flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1914
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1915
lemma diff_add_eq_diff_diff_swap_ennreal: "x - (y + z :: ennreal) = x - y - z"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1916
  by (cases x; cases y; cases z)
68406
6beb45f6cf67 utilize 'flip'
nipkow
parents: 67727
diff changeset
  1917
     (auto simp: ennreal_minus_if add_top top_add simp flip: ennreal_plus)
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1918
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1919
lemma diff_add_assoc2_ennreal: "b \<le> a \<Longrightarrow> (a - b + c::ennreal) = a + c - b"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1920
  by (cases a; cases b; cases c)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1921
     (auto simp add: ennreal_minus_if ennreal_plus_if add_top top_add top_unique simp del: ennreal_plus)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1922
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1923
lemma diff_gt_0_iff_gt_ennreal: "0 < a - b \<longleftrightarrow> (a = top \<and> b = top \<or> b < (a::ennreal))"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1924
  by (cases a; cases b) (auto simp: ennreal_minus_if ennreal_less_iff)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1925
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1926
lemma diff_eq_0_iff_ennreal: "(a - b::ennreal) = 0 \<longleftrightarrow> (a < top \<and> a \<le> b)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1927
  by (cases a) (auto simp: ennreal_minus_eq_0 diff_eq_0_ennreal)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1928
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1929
lemma add_diff_self_ennreal: "a + (b - a::ennreal) = (if a \<le> b then b else a)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1930
  by (auto simp: diff_eq_0_iff_ennreal less_top)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1931
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1932
lemma diff_add_self_ennreal: "(b - a + a::ennreal) = (if a \<le> b then b else a)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1933
  by (auto simp: diff_add_cancel_ennreal diff_eq_0_iff_ennreal less_top)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1934
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1935
lemma ennreal_minus_cancel_iff:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1936
  fixes a b c :: ennreal
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1937
  shows "a - b = a - c \<longleftrightarrow> (b = c \<or> (a \<le> b \<and> a \<le> c) \<or> a = top)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1938
  by (cases a; cases b; cases c) (auto simp: ennreal_minus_if)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1939
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1940
text \<open>The next lemma is wrong for $a = top$, for $b = c = 1$ for instance.\<close>
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1941
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1942
lemma ennreal_right_diff_distrib:
70346
408e15cbd2a6 tuned proofs
haftmann
parents: 70271
diff changeset
  1943
  fixes a b c :: ennreal
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1944
  assumes "a \<noteq> top"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1945
  shows "a * (b - c) = a * b - a * c"
70346
408e15cbd2a6 tuned proofs
haftmann
parents: 70271
diff changeset
  1946
  apply (cases a; cases b; cases c)
408e15cbd2a6 tuned proofs
haftmann
parents: 70271
diff changeset
  1947
         apply (use assms in \<open>auto simp add: ennreal_mult_top ennreal_minus ennreal_mult' [symmetric]\<close>)
408e15cbd2a6 tuned proofs
haftmann
parents: 70271
diff changeset
  1948
  apply (simp add: algebra_simps)
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1949
  done
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1950
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1951
lemma SUP_diff_ennreal:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1952
  "c < top \<Longrightarrow> (SUP i\<in>I. f i - c :: ennreal) = (SUP i\<in>I. f i) - c"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1953
  by (auto intro!: SUP_eqI ennreal_minus_mono SUP_least intro: SUP_upper
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1954
           simp: ennreal_minus_cancel_iff ennreal_minus_le_iff less_top[symmetric])
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1955
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1956
lemma ennreal_SUP_add_right:
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1957
  fixes c :: ennreal shows "I \<noteq> {} \<Longrightarrow> c + (SUP i\<in>I. f i) = (SUP i\<in>I. c + f i)"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1958
  using ennreal_SUP_add_left[of I f c] by (simp add: add.commute)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1959
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1960
lemma SUP_add_directed_ennreal:
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1961
  fixes f g :: "_ \<Rightarrow> ennreal"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1962
  assumes directed: "\<And>i j. i \<in> I \<Longrightarrow> j \<in> I \<Longrightarrow> \<exists>k\<in>I. f i + g j \<le> f k + g k"
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1963
  shows "(SUP i\<in>I. f i + g i) = (SUP i\<in>I. f i) + (SUP i\<in>I. g i)"
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1964
proof (cases "I = {}")
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1965
  case False
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1966
  show ?thesis
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1967
  proof (rule antisym)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1968
    show "(SUP i\<in>I. f i + g i) \<le> (SUP i\<in>I. f i) + (SUP i\<in>I. g i)"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1969
      by (rule SUP_least; intro add_mono SUP_upper)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1970
  next
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1971
    have "(SUP i\<in>I. f i) + (SUP i\<in>I. g i) = (SUP i\<in>I. f i + (SUP i\<in>I. g i))"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1972
      by (intro ennreal_SUP_add_left[symmetric] \<open>I \<noteq> {}\<close>)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1973
    also have "\<dots> = (SUP i\<in>I. (SUP j\<in>I. f i + g j))"
69661
a03a63b81f44 tuned proofs
haftmann
parents: 69593
diff changeset
  1974
      using \<open>I \<noteq> {}\<close> by (simp add: ennreal_SUP_add_right)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1975
    also have "\<dots> \<le> (SUP i\<in>I. f i + g i)"
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1976
      using directed by (intro SUP_least) (blast intro: SUP_upper2)
69260
0a9688695a1b removed relics of ASCII syntax for indexed big operators
haftmann
parents: 69064
diff changeset
  1977
    finally show "(SUP i\<in>I. f i) + (SUP i\<in>I. g i) \<le> (SUP i\<in>I. f i + g i)" .
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1978
  qed
76137
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1979
qed (simp add: bot_ereal_def)
175e6d47e3af tidied a few ugly proofs
paulson <lp15@cam.ac.uk>
parents: 74639
diff changeset
  1980
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1981
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1982
lemma enn2real_eq_0_iff: "enn2real x = 0 \<longleftrightarrow> x = 0 \<or> x = top"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1983
  by (cases x) auto
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1984
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1985
lemma continuous_on_diff_ennreal:
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1986
  "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> (\<And>x. x \<in> A \<Longrightarrow> f x \<noteq> top) \<Longrightarrow> (\<And>x. x \<in> A \<Longrightarrow> g x \<noteq> top) \<Longrightarrow> continuous_on A (\<lambda>z. f z - g z::ennreal)"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1987
  including ennreal.lifting
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1988
proof (transfer fixing: A, simp add: top_ereal_def)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1989
  fix f g :: "'a \<Rightarrow> ereal" assume "\<forall>x. 0 \<le> f x" "\<forall>x. 0 \<le> g x" "continuous_on A f" "continuous_on A g"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1990
  moreover assume "f x \<noteq> \<infinity>" "g x \<noteq> \<infinity>" if "x \<in> A" for x
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1991
  ultimately show "continuous_on A (\<lambda>z. max 0 (f z - g z))"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1992
    by (intro continuous_on_max continuous_on_const continuous_on_diff_ereal) auto
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1993
qed
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1994
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  1995
lemma tendsto_diff_ennreal:
63225
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1996
  "(f \<longlongrightarrow> x) F \<Longrightarrow> (g \<longlongrightarrow> y) F \<Longrightarrow> x \<noteq> top \<Longrightarrow> y \<noteq> top \<Longrightarrow> ((\<lambda>z. f z - g z::ennreal) \<longlongrightarrow> x - y) F"
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1997
  using continuous_on_tendsto_compose[where f="\<lambda>x. fst x - snd x::ennreal" and s="{(x, y). x \<noteq> top \<and> y \<noteq> top}" and g="\<lambda>x. (f x, g x)" and l="(x, y)" and F="F",
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1998
    OF continuous_on_diff_ennreal]
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  1999
  by (auto simp: tendsto_Pair eventually_conj_iff less_top order_tendstoD continuous_on_fst continuous_on_snd continuous_on_id)
19d2be0e5e9f move ennreal and ereal theorems from MFMC_Countable
hoelzl
parents: 63145
diff changeset
  2000
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2001
declare lim_real_of_ereal [tendsto_intros]
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2002
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2003
lemma tendsto_enn2real [tendsto_intros]:
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2004
  assumes "(u \<longlongrightarrow> ennreal l) F" "l \<ge> 0"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2005
  shows "((\<lambda>n. enn2real (u n)) \<longlongrightarrow> l) F"
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2006
  unfolding enn2real_def
72236
11b81cd70633 de-applying
paulson <lp15@cam.ac.uk>
parents: 71834
diff changeset
  2007
  by (metis assms enn2ereal_ennreal lim_real_of_ereal tendsto_enn2erealI)
67727
ce3e87a51488 moved Lipschitz continuity from AFP/Ordinary_Differential_Equations and AFP/Gromov_Hyperbolicity; moved lemmas from AFP/Gromov_Hyperbolicity/Library_Complements
immler
parents: 67719
diff changeset
  2008
62975
1d066f6ab25d Probability: move emeasure and nn_integral from ereal to ennreal
hoelzl
parents: 62648
diff changeset
  2009
end