src/HOL/Library/Extended_Nonnegative_Real.thy
author hoelzl
Wed, 10 Feb 2016 18:43:19 +0100
changeset 62376 85f38d5f8807
parent 62375 670063003ad3
child 62378 85ed00c1fe7c
permissions -rw-r--r--
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.
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
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     5
subsection \<open>The type of non-negative extended real numbers\<close>
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
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     8
  imports Extended_Real
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
     9
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    10
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    11
typedef ennreal = "{x :: ereal. 0 \<le> x}"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    12
  morphisms enn2ereal e2ennreal
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    13
  by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    14
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    15
setup_lifting type_definition_ennreal
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    16
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    17
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    18
lift_definition ennreal :: "real \<Rightarrow> ennreal" is "max 0 \<circ> ereal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    19
  by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    20
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    21
declare [[coercion ennreal]]
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    22
declare [[coercion e2ennreal]]
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    23
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    24
instantiation ennreal :: semiring_1_no_zero_divisors
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    25
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    26
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    27
lift_definition one_ennreal :: ennreal is 1 by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    28
lift_definition zero_ennreal :: ennreal is 0 by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    29
lift_definition plus_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is "op +" by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    30
lift_definition times_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is "op *" by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    31
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    32
instance
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    33
  by standard (transfer; auto simp: field_simps ereal_right_distrib)+
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    34
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    35
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    36
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    37
instance ennreal :: numeral ..
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    38
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    39
instantiation ennreal :: inverse
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    40
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    41
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    42
lift_definition inverse_ennreal :: "ennreal \<Rightarrow> ennreal" is inverse
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    43
  by (rule inverse_ereal_ge0I)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    44
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    45
definition divide_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    46
  where "x div y = x * inverse (y :: ennreal)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    47
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    48
instance ..
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    49
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    50
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    51
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    52
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    53
instantiation ennreal :: complete_linorder
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    54
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    55
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    56
lift_definition top_ennreal :: ennreal is top by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    57
lift_definition bot_ennreal :: ennreal is 0 by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    58
lift_definition sup_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is sup by (simp add: max.coboundedI1)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    59
lift_definition inf_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> ennreal" is inf by (simp add: min.boundedI)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    60
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    61
lift_definition Inf_ennreal :: "ennreal set \<Rightarrow> ennreal" is "Inf"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    62
  by (auto intro: Inf_greatest)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    63
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    64
lift_definition Sup_ennreal :: "ennreal set \<Rightarrow> ennreal" is "sup 0 \<circ> Sup"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    65
  by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    66
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    67
lift_definition less_eq_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> bool" is "op \<le>" .
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    68
lift_definition less_ennreal :: "ennreal \<Rightarrow> ennreal \<Rightarrow> bool" is "op <" .
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    69
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    70
instance
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    71
  by standard
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    72
     (transfer ; auto simp: Inf_lower Inf_greatest Sup_upper Sup_least le_max_iff_disj max.absorb1)+
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    73
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    74
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    75
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    76
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    77
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    78
lemma ennreal_zero_less_one: "0 < (1::ennreal)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    79
  by transfer auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    80
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
    81
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
    82
proof (standard; transfer)
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
    83
  fix a b :: ereal assume "0 \<le> a" "0 \<le> b" then show "(a \<le> b) = (\<exists>c\<in>Collect (op \<le> 0). b = a + c)"
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
    84
    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
    85
    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
    86
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
    87
62375
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    88
instance ennreal :: ordered_comm_semiring
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    89
  by standard
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    90
     (transfer ; auto intro: add_mono mult_mono mult_ac ereal_left_distrib ereal_mult_left_mono)+
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    91
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    92
instantiation ennreal :: linear_continuum_topology
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    93
begin
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    94
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    95
definition open_ennreal :: "ennreal set \<Rightarrow> bool"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    96
  where "(open :: ennreal set \<Rightarrow> bool) = generate_topology (range lessThan \<union> range greaterThan)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    97
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    98
instance
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
    99
proof
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   100
  show "\<exists>a b::ennreal. a \<noteq> b"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   101
    using ennreal_zero_less_one by (auto dest: order.strict_implies_not_eq)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   102
  show "\<And>x y::ennreal. x < y \<Longrightarrow> \<exists>z>x. z < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   103
  proof transfer
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   104
    fix x y :: ereal assume "0 \<le> x" "x < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   105
    moreover from dense[OF this(2)] guess z ..
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   106
    ultimately show "\<exists>z\<in>Collect (op \<le> 0). x < z \<and> z < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   107
      by (intro bexI[of _ z]) auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   108
  qed
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   109
qed (rule open_ennreal_def)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   110
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   111
end
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   112
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   113
lemma ennreal_rat_dense:
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   114
  fixes x y :: ennreal
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   115
  shows "x < y \<Longrightarrow> \<exists>r::rat. x < real_of_rat r \<and> real_of_rat r < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   116
proof transfer
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   117
  fix x y :: ereal assume xy: "0 \<le> x" "0 \<le> y" "x < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   118
  moreover
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   119
  from ereal_dense3[OF \<open>x < y\<close>]
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   120
  obtain r where "x < ereal (real_of_rat r)" "ereal (real_of_rat r) < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   121
    by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   122
  moreover then have "0 \<le> r"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   123
    using le_less_trans[OF \<open>0 \<le> x\<close> \<open>x < ereal (real_of_rat r)\<close>] by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   124
  ultimately show "\<exists>r. x < (max 0 \<circ> ereal) (real_of_rat r) \<and> (max 0 \<circ> ereal) (real_of_rat r) < y"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   125
    by (intro exI[of _ r]) (auto simp: max_absorb2)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   126
qed
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   127
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   128
lemma enn2ereal_range: "e2ennreal ` {0..} = UNIV"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   129
proof -
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   130
  have "\<exists>y\<ge>0. x = e2ennreal y" for x
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   131
    by (cases x) auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   132
  then show ?thesis
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   133
    by (auto simp: image_iff Bex_def)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   134
qed
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   135
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   136
lemma enn2ereal_nonneg: "0 \<le> enn2ereal x"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   137
  using ennreal.enn2ereal[of x] by simp
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   138
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   139
lemma ereal_ennreal_cases:
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   140
  obtains b where "0 \<le> a" "a = enn2ereal b" | "a < 0"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   141
  using e2ennreal_inverse[of a, symmetric] by (cases "0 \<le> a") (auto intro: enn2ereal_nonneg)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   142
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   143
lemma enn2ereal_Iio: "enn2ereal -` {..<a} = (if 0 \<le> a then {..< e2ennreal a} else {})"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   144
  using enn2ereal_nonneg
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   145
  by (cases a rule: ereal_ennreal_cases)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   146
     (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   147
           intro: le_less_trans less_imp_le)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   148
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   149
lemma enn2ereal_Ioi: "enn2ereal -` {a <..} = (if 0 \<le> a then {e2ennreal a <..} else UNIV)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   150
  using enn2ereal_nonneg
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   151
  by (cases a rule: ereal_ennreal_cases)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   152
     (auto simp add: vimage_def set_eq_iff ennreal.enn2ereal_inverse less_ennreal.rep_eq
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   153
           intro: less_le_trans)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   154
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   155
lemma continuous_e2ennreal: "continuous_on {0 ..} e2ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   156
  by (rule continuous_onI_mono)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   157
     (auto simp add: less_eq_ennreal.abs_eq eq_onp_def enn2ereal_range)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   158
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   159
lemma continuous_enn2ereal: "continuous_on UNIV enn2ereal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   160
  by (rule continuous_on_generate_topology[OF open_generated_order])
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   161
     (auto simp add: enn2ereal_Iio enn2ereal_Ioi)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   162
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   163
lemma transfer_enn2ereal_continuous_on [transfer_rule]:
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   164
  "rel_fun (op =) (rel_fun (rel_fun op = pcr_ennreal) op =) continuous_on continuous_on"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   165
proof -
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   166
  have "continuous_on A f" if "continuous_on A (\<lambda>x. enn2ereal (f x))" for A and f :: "'a \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   167
    using continuous_on_compose2[OF continuous_e2ennreal that]
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   168
    by (auto simp: ennreal.enn2ereal_inverse subset_eq enn2ereal_nonneg)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   169
  moreover
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   170
  have "continuous_on A (\<lambda>x. enn2ereal (f x))" if "continuous_on A f" for A and f :: "'a \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   171
    using continuous_on_compose2[OF continuous_enn2ereal that] by auto
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   172
  ultimately
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   173
  show ?thesis
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   174
    by (auto simp add: rel_fun_def ennreal.pcr_cr_eq cr_ennreal_def)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   175
qed
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   176
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   177
lemma continuous_on_add_ennreal[continuous_intros]:
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   178
  fixes f g :: "'a::topological_space \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   179
  shows "continuous_on A f \<Longrightarrow> continuous_on A g \<Longrightarrow> continuous_on A (\<lambda>x. f x + g x)"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   180
  by (transfer fixing: A) (auto intro!: tendsto_add_ereal_nonneg simp: continuous_on_def)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   181
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   182
lemma continuous_on_inverse_ennreal[continuous_intros]:
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   183
  fixes f :: "_ \<Rightarrow> ennreal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   184
  shows "continuous_on A f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   185
proof (transfer fixing: A)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   186
  show "pred_fun (op \<le> 0) f \<Longrightarrow> continuous_on A (\<lambda>x. inverse (f x))" if "continuous_on A f"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   187
    for f :: "_ \<Rightarrow> ereal"
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   188
    using continuous_on_compose2[OF continuous_on_inverse_ereal that] by (auto simp: subset_eq)
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   189
qed
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   190
670063003ad3 add extended nonnegative real numbers
hoelzl
parents:
diff changeset
   191
end