|
| 1 | +/- |
| 2 | +Copyright (c) 2017 Johannes Hölzl. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Author: Johannes Hölzl |
| 5 | +
|
| 6 | +Extended non-negative reals |
| 7 | +-/ |
| 8 | +import order.bounds topology.real |
| 9 | +noncomputable theory |
| 10 | +open classical set lattice |
| 11 | +local attribute [instance] decidable_inhabited prop_decidable |
| 12 | + |
| 13 | +universe u |
| 14 | +-- TODO: this is necessary additionally to mul_nonneg otherwise the simplifier can not match |
| 15 | +lemma zero_le_mul {α : Type u} [ordered_semiring α] {a b : α} : 0 ≤ a → 0 ≤ b → 0 ≤ a * b := |
| 16 | +mul_nonneg |
| 17 | + |
| 18 | +inductive ennreal : Type |
| 19 | +| of_nonneg_real : Πr:real, 0 ≤ r → ennreal |
| 20 | +| infinity : ennreal |
| 21 | + |
| 22 | +local notation `∞` := ennreal.infinity |
| 23 | + |
| 24 | +namespace ennreal |
| 25 | +variables {a b c d : ennreal} {r p q : ℝ} |
| 26 | + |
| 27 | +section projections |
| 28 | + |
| 29 | +def of_real (r : ℝ) : ennreal := of_nonneg_real (max 0 r) (le_max_left 0 r) |
| 30 | + |
| 31 | +def of_ennreal : ennreal → ℝ |
| 32 | +| (of_nonneg_real r _) := r |
| 33 | +| ∞ := 0 |
| 34 | + |
| 35 | +@[simp] lemma of_ennreal_of_real (h : 0 ≤ r) : of_ennreal (of_real r) = r := max_eq_right h |
| 36 | + |
| 37 | +lemma zero_le_of_ennreal : ∀{a}, 0 ≤ of_ennreal a |
| 38 | +| (of_nonneg_real r hr) := hr |
| 39 | +| ∞ := le_refl 0 |
| 40 | + |
| 41 | +@[simp] lemma of_real_of_ennreal : ∀{a}, a ≠ ∞ → of_real (of_ennreal a) = a |
| 42 | +| (of_nonneg_real r hr) h := by simp [of_real, of_ennreal, max, hr] |
| 43 | +| ∞ h := false.elim $ h rfl |
| 44 | + |
| 45 | +lemma forall_ennreal {p : ennreal → Prop} : (∀a, p a) ↔ (∀r (h : 0 ≤ r), p (of_real r)) ∧ p ∞ := |
| 46 | +⟨assume h, ⟨assume r hr, h _, h _⟩, |
| 47 | + assume ⟨h₁, h₂⟩, ennreal.rec |
| 48 | + begin |
| 49 | + intros r hr, |
| 50 | + let h₁ := h₁ r hr, |
| 51 | + simp [of_real, max, hr] at h₁, |
| 52 | + exact h₁ |
| 53 | + end |
| 54 | + h₂⟩ |
| 55 | + |
| 56 | +end projections |
| 57 | + |
| 58 | +section semiring |
| 59 | + |
| 60 | +instance : has_zero ennreal := ⟨of_real 0⟩ |
| 61 | +instance : has_one ennreal := ⟨of_real 1⟩ |
| 62 | +instance : inhabited ennreal := ⟨0⟩ |
| 63 | + |
| 64 | +@[simp] lemma of_real_zero : of_real 0 = 0 := rfl |
| 65 | +@[simp] lemma of_real_one : of_real 1 = 1 := rfl |
| 66 | + |
| 67 | +@[simp] lemma zero_ne_infty : 0 ≠ ∞ := assume h, ennreal.no_confusion h |
| 68 | +@[simp] lemma infty_ne_zero : ∞ ≠ 0 := assume h, ennreal.no_confusion h |
| 69 | + |
| 70 | +@[simp] lemma of_real_ne_infty : of_real r ≠ ∞ := assume h, ennreal.no_confusion h |
| 71 | +@[simp] lemma infty_ne_of_real : ∞ ≠ of_real r := assume h, ennreal.no_confusion h |
| 72 | + |
| 73 | +@[simp] lemma of_real_eq_of_real_of (hr : 0 ≤ r) (hq : 0 ≤ q) : of_real r = of_real q ↔ r = q := |
| 74 | +by simp [of_real, max, hr, hq]; exact ⟨ennreal.of_nonneg_real.inj, by simp {contextual := tt}⟩ |
| 75 | + |
| 76 | +lemma of_real_ne_of_real_of (hr : 0 ≤ r) (hq : 0 ≤ q) : of_real r ≠ of_real q ↔ r ≠ q := |
| 77 | +by simp [hr, hq] |
| 78 | + |
| 79 | +instance : zero_ne_one_class ennreal := |
| 80 | +{ zero := 0, one := 1, zero_ne_one := (of_real_ne_of_real_of (le_refl 0) zero_le_one).mpr zero_ne_one } |
| 81 | + |
| 82 | +@[simp] lemma of_real_eq_zero_iff (hr : 0 ≤ r) : of_real r = 0 ↔ r = 0 := |
| 83 | +of_real_eq_of_real_of hr (le_refl 0) |
| 84 | + |
| 85 | +@[simp] lemma zero_eq_of_real_iff (hr : 0 ≤ r) : 0 = of_real r ↔ 0 = r := |
| 86 | +of_real_eq_of_real_of (le_refl 0) hr |
| 87 | + |
| 88 | +@[simp] lemma of_real_eq_one_iff : of_real r = 1 ↔ r = 1 := |
| 89 | +by_cases (assume : 0 ≤ r, of_real_eq_of_real_of this zero_le_one) $ |
| 90 | + assume : ¬ 0 ≤ r, |
| 91 | + have r < 0, from lt_of_not_ge this, |
| 92 | + have of_real r = of_real 0, by simp [of_real, max_eq_left_of_lt ‹r<0›], |
| 93 | + have r ≠ 1, from assume h, ‹¬ 0 ≤ r› $ h.symm ▸ zero_le_one, |
| 94 | + by rw [‹of_real r = of_real 0›]; simp [this] |
| 95 | + |
| 96 | +@[simp] lemma one_eq_of_real_iff : 1 = of_real r ↔ 1 = r := |
| 97 | +by rw [eq_comm, of_real_eq_one_iff, eq_comm] |
| 98 | + |
| 99 | +lemma of_nonneg_real_eq_of_real (hr : 0 ≤ r) : of_nonneg_real r hr = of_real r := |
| 100 | +by simp [of_real, hr, max] |
| 101 | + |
| 102 | +protected def add : ennreal → ennreal → ennreal |
| 103 | +| (of_nonneg_real a ha) (of_nonneg_real b hb) := of_real (a + b) |
| 104 | +| _ _ := ∞ |
| 105 | + |
| 106 | +protected def mul : ennreal → ennreal → ennreal |
| 107 | +| (of_nonneg_real a ha) (of_nonneg_real b hb) := of_real (a * b) |
| 108 | +| ∞ (of_nonneg_real b hb) := if b = 0 then 0 else ∞ |
| 109 | +| (of_nonneg_real a ha) ∞ := if a = 0 then 0 else ∞ |
| 110 | +| _ _ := ∞ |
| 111 | + |
| 112 | +instance : has_add ennreal := ⟨ennreal.add⟩ |
| 113 | +instance : has_mul ennreal := ⟨ennreal.mul⟩ |
| 114 | + |
| 115 | +@[simp] lemma of_real_add_of_real (hr : 0 ≤ r) (hq : 0 ≤ p) : |
| 116 | + of_real r + of_real p = of_real (r + p) := |
| 117 | +by simp [of_real, max, hr, hq]; refl |
| 118 | + |
| 119 | +@[simp] lemma add_infty : a + ∞ = ∞ := |
| 120 | +by cases a; refl |
| 121 | + |
| 122 | +@[simp] lemma infty_add : ∞ + a = ∞ := |
| 123 | +by cases a; refl |
| 124 | + |
| 125 | +@[simp] lemma of_real_mul_of_real (hr : 0 ≤ r) (hq : 0 ≤ p) : |
| 126 | + of_real r * of_real p = of_real (r * p) := |
| 127 | +by simp [of_real, max, hr, hq]; refl |
| 128 | + |
| 129 | +@[simp] lemma of_real_mul_infty (hr : 0 ≤ r) : of_real r * ∞ = (if r = 0 then 0 else ∞) := |
| 130 | +by simp [of_real, max, hr]; refl |
| 131 | + |
| 132 | +@[simp] lemma infty_mul_of_real (hr : 0 ≤ r) : ∞ * of_real r = (if r = 0 then 0 else ∞) := |
| 133 | +by simp [of_real, max, hr]; refl |
| 134 | + |
| 135 | +@[simp] lemma mul_infty : ∀{a}, a * ∞ = (if a = 0 then 0 else ∞) := |
| 136 | +forall_ennreal.mpr ⟨assume r hr, by simp [hr]; by_cases r = 0; simp [h], by simp; refl⟩ |
| 137 | + |
| 138 | +@[simp] lemma infty_mul : ∀{a}, ∞ * a = (if a = 0 then 0 else ∞) := |
| 139 | +forall_ennreal.mpr ⟨assume r hr, by simp [hr]; by_cases r = 0; simp [h], by simp; refl⟩ |
| 140 | + |
| 141 | +instance : add_comm_monoid ennreal := |
| 142 | +{ add_comm_monoid . |
| 143 | + zero := 0, |
| 144 | + add := (+), |
| 145 | + add_zero := by simp [forall_ennreal, -of_real_zero, of_real_zero.symm] {contextual:=tt}, |
| 146 | + zero_add := by simp [forall_ennreal, -of_real_zero, of_real_zero.symm] {contextual:=tt}, |
| 147 | + add_comm := by simp [forall_ennreal, le_add_of_le_of_nonneg] {contextual:=tt}, |
| 148 | + add_assoc := by simp [forall_ennreal, le_add_of_le_of_nonneg] {contextual:=tt} } |
| 149 | + |
| 150 | +protected lemma mul_zero : ∀a:ennreal, a * 0 = 0 := |
| 151 | +by simp [forall_ennreal, -of_real_zero, of_real_zero.symm] {contextual := tt} |
| 152 | + |
| 153 | +protected lemma mul_comm : ∀a b:ennreal, a * b = b * a := |
| 154 | +by simp [forall_ennreal] {contextual := tt} |
| 155 | + |
| 156 | +protected lemma zero_mul : ∀a:ennreal, 0 * a = 0 := |
| 157 | +by simp [forall_ennreal, -of_real_zero, of_real_zero.symm] {contextual := tt} |
| 158 | + |
| 159 | +protected lemma mul_assoc : ∀a b c:ennreal, a * b * c = a * (b * c) := |
| 160 | +begin |
| 161 | + rw [forall_ennreal], constructor, |
| 162 | + { intros ra ha, |
| 163 | + by_cases ra = 0 with ha', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 164 | + rw [forall_ennreal], constructor, |
| 165 | + { intros rb hrb, |
| 166 | + by_cases rb = 0 with hb', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 167 | + rw [forall_ennreal], constructor, |
| 168 | + { intros rc hrc, simp [*, zero_le_mul] }, |
| 169 | + simp [*, zero_le_mul, mul_eq_zero_iff_eq_zero_or_eq_zero] }, |
| 170 | + rw [forall_ennreal], constructor, |
| 171 | + { intros rc hrc, |
| 172 | + by_cases rc = 0 with hc', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 173 | + simp [*, zero_le_mul] }, |
| 174 | + simp [*] }, |
| 175 | + rw [forall_ennreal], constructor, |
| 176 | + { intros rb hrb, |
| 177 | + by_cases rb = 0 with hb', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 178 | + rw [forall_ennreal], constructor, |
| 179 | + { intros rc hrc, |
| 180 | + by_cases rc = 0 with hb'; |
| 181 | + simp [*, zero_le_mul, ennreal.mul_zero, mul_eq_zero_iff_eq_zero_or_eq_zero] }, |
| 182 | + simp [*, zero_le_mul, mul_eq_zero_iff_eq_zero_or_eq_zero] }, |
| 183 | + intro c, by_cases c = 0; simp [*] |
| 184 | +end |
| 185 | + |
| 186 | +protected lemma left_distrib : ∀a b c:ennreal, a * (b + c) = a * b + a * c := |
| 187 | +begin |
| 188 | + rw [forall_ennreal], constructor, |
| 189 | + { intros ra ha, |
| 190 | + by_cases ra = 0 with ha', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 191 | + rw [forall_ennreal], constructor, |
| 192 | + { intros rb hrb, |
| 193 | + by_cases rb = 0 with hb', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 194 | + rw [forall_ennreal], constructor, |
| 195 | + { intros rc hrc, simp [*, zero_le_mul, add_nonneg, left_distrib] }, |
| 196 | + simp [*, zero_le_mul, mul_eq_zero_iff_eq_zero_or_eq_zero] }, |
| 197 | + rw [forall_ennreal], constructor, |
| 198 | + { intros rc hrc, |
| 199 | + by_cases rc = 0 with hc', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 200 | + simp [*, zero_le_mul] }, |
| 201 | + simp [*] }, |
| 202 | + rw [forall_ennreal], constructor, |
| 203 | + { intros rb hrb, |
| 204 | + by_cases rb = 0 with hb', simp [*, ennreal.mul_zero, ennreal.zero_mul], |
| 205 | + rw [forall_ennreal], constructor, |
| 206 | + { intros rc hrc, |
| 207 | + by_cases rc = 0 with hb'; |
| 208 | + simp [*, zero_le_mul, ennreal.mul_zero, mul_eq_zero_iff_eq_zero_or_eq_zero, add_nonneg, |
| 209 | + add_eq_zero_iff_eq_zero_and_eq_zero_of_nonneg_of_nonneg] }, |
| 210 | + simp [*, zero_le_mul, mul_eq_zero_iff_eq_zero_or_eq_zero] }, |
| 211 | + intro c, by_cases c = 0; simp [*] |
| 212 | +end |
| 213 | + |
| 214 | +instance : comm_semiring ennreal := |
| 215 | +{ ennreal.add_comm_monoid with |
| 216 | + one := 1, |
| 217 | + mul := (*), |
| 218 | + mul_zero := ennreal.mul_zero, |
| 219 | + zero_mul := ennreal.zero_mul, |
| 220 | + one_mul := by simp [forall_ennreal, -of_real_one, of_real_one.symm, zero_le_one] {contextual := tt}, |
| 221 | + mul_one := by simp [forall_ennreal, -of_real_one, of_real_one.symm, zero_le_one] {contextual := tt}, |
| 222 | + mul_comm := ennreal.mul_comm, |
| 223 | + mul_assoc := ennreal.mul_assoc, |
| 224 | + left_distrib := ennreal.left_distrib, |
| 225 | + right_distrib := assume a b c, by rw [ennreal.mul_comm, ennreal.left_distrib, |
| 226 | + ennreal.mul_comm, ennreal.mul_comm b c]; refl } |
| 227 | + |
| 228 | +end semiring |
| 229 | + |
| 230 | +section order |
| 231 | + |
| 232 | +instance : has_le ennreal := |
| 233 | +⟨λ a b, b = ∞ ∨ (∃r p, 0 ≤ r ∧ r ≤ p ∧ a = of_real r ∧ b = of_real p)⟩ |
| 234 | + |
| 235 | +@[simp] lemma infty_le_iff : ∞ ≤ a ↔ a = ∞ := |
| 236 | +by unfold has_le.le; simp |
| 237 | + |
| 238 | +@[simp] lemma le_infty : a ≤ ∞ := |
| 239 | +by unfold has_le.le; simp |
| 240 | + |
| 241 | +@[simp] lemma of_real_le_of_real_iff (hr : 0 ≤ r) (hp : 0 ≤ p) : |
| 242 | + of_real r ≤ of_real p ↔ r ≤ p := |
| 243 | +show (of_real p = ∞ ∨ _) ↔ _, |
| 244 | +begin |
| 245 | + simp, constructor, |
| 246 | + exact assume ⟨r', q', hrq', h₁, h₂, hr'⟩, |
| 247 | + by simp [hr, hr', le_trans hr' hrq', hp] at h₁ h₂; simp [*], |
| 248 | + exact assume h, ⟨r, p, h, rfl, rfl, hr⟩ |
| 249 | +end |
| 250 | + |
| 251 | +lemma le_of_real_iff (hr : 0 ≤ r) : ∀{a}, a ≤ of_real r ↔ (∃p, 0 ≤ p ∧ p ≤ r ∧ a = of_real p) := |
| 252 | +have ∀p, 0 ≤ p → (of_real p ≤ of_real r ↔ ∃ (q : ℝ), 0 ≤ q ∧ q ≤ r ∧ of_real p = of_real q), |
| 253 | + from assume p hp, ⟨assume h, ⟨p, hp, (of_real_le_of_real_iff hp hr).mp h, rfl⟩, |
| 254 | + assume ⟨q, hq, hqr, heq⟩, calc of_real p = of_real q : heq |
| 255 | + ... ≤ _ : (of_real_le_of_real_iff hq hr).mpr hqr⟩, |
| 256 | +forall_ennreal.mpr $ ⟨this, by simp⟩ |
| 257 | + |
| 258 | +@[simp] protected lemma zero_le : ∀{a:ennreal}, 0 ≤ a := |
| 259 | +by simp [forall_ennreal, -of_real_zero, of_real_zero.symm] {contextual:=tt} |
| 260 | + |
| 261 | +instance : decidable_linear_order ennreal := |
| 262 | +{ decidable_linear_order . |
| 263 | + le := (≤), |
| 264 | + le_refl := by simp [forall_ennreal, le_refl] {contextual := tt}, |
| 265 | + le_trans := by simp [forall_ennreal] {contextual := tt}; exact assume a ha b hb c hc, le_trans, |
| 266 | + le_antisymm := by simp [forall_ennreal] {contextual := tt}; exact assume a ha b hb, le_antisymm, |
| 267 | + le_total := by simp [forall_ennreal] {contextual := tt}; exact assume a ha b hb, le_total _ _, |
| 268 | + decidable_le := by apply_instance } |
| 269 | + |
| 270 | +@[simp] lemma le_zero_iff_eq : a ≤ 0 ↔ a = 0 := |
| 271 | +⟨assume h, le_antisymm h ennreal.zero_le, assume h, h ▸ le_refl a⟩ |
| 272 | + |
| 273 | +lemma of_real_lt_of_real_iff : |
| 274 | + 0 ≤ r → 0 ≤ p → (of_real r < of_real p ↔ r < p) := |
| 275 | +by simp [lt_iff_le_not_le] {contextual:=tt} |
| 276 | + |
| 277 | +lemma add_le_add : ∀{b d}, a ≤ b → c ≤ d → a + c ≤ b + d := |
| 278 | +forall_ennreal.mpr ⟨assume r hr, forall_ennreal.mpr ⟨assume p hp, |
| 279 | + by simp [le_of_real_iff, *, exists_implies_distrib, and_imp_iff] {contextual:=tt}; |
| 280 | + simp [*, add_nonneg, add_le_add] {contextual := tt}, by simp⟩, by simp⟩ |
| 281 | + |
| 282 | +lemma mul_le_mul : ∀{b d}, a ≤ b → c ≤ d → a * c ≤ b * d := |
| 283 | +forall_ennreal.mpr ⟨assume r hr, forall_ennreal.mpr ⟨assume p hp, |
| 284 | + by simp [le_of_real_iff, *, exists_implies_distrib, and_imp_iff] {contextual:=tt}; |
| 285 | + simp [*, zero_le_mul, mul_le_mul] {contextual := tt}, |
| 286 | + by by_cases r = 0; simp [*] {contextual:=tt}⟩, |
| 287 | + assume d, by by_cases d = 0; simp [*] {contextual:=tt}⟩ |
| 288 | + |
| 289 | +protected lemma zero_lt_one : 0 < (1 : ennreal) := |
| 290 | +(of_real_lt_of_real_iff (le_refl 0) zero_le_one).mpr zero_lt_one |
| 291 | + |
| 292 | +end order |
| 293 | + |
| 294 | +section complete_lattice |
| 295 | + |
| 296 | +@[simp] lemma infty_mem_upper_bounds {s : set ennreal} : ∞ ∈ upper_bounds s := |
| 297 | +assume x hx, le_infty |
| 298 | + |
| 299 | +lemma of_real_mem_upper_bounds {s : set real} (hs : ∀x∈s, (0:real) ≤ x) (hr : 0 ≤ r) : |
| 300 | + of_real r ∈ upper_bounds (of_real '' s) ↔ r ∈ upper_bounds s := |
| 301 | +by simp [upper_bounds, bounded_forall_image_iff, *] {contextual := tt} |
| 302 | + |
| 303 | +lemma is_lub_of_real {s : set real} (hs : ∀x∈s, (0:real) ≤ x) (hr : 0 ≤ r) (h : s ≠ ∅) : |
| 304 | + is_lub (of_real '' s) (of_real r) ↔ is_lub s r := |
| 305 | +let ⟨x, hx₁⟩ := exists_mem_of_ne_empty h in |
| 306 | +have hx₂ : 0 ≤ x, from hs _ hx₁, |
| 307 | +begin |
| 308 | + simp [is_lub, is_least, lower_bounds, of_real_mem_upper_bounds, hs, hr, forall_ennreal] |
| 309 | + {contextual := tt}, |
| 310 | + exact (and_congr_right $ assume hrb, |
| 311 | + ⟨assume h p hp, h _ (le_trans hx₂ $ hp _ hx₁) hp, assume h p _ hp, h _ hp⟩) |
| 312 | +end |
| 313 | + |
| 314 | +protected lemma exists_is_lub (s : set ennreal) : ∃x, is_lub s x := |
| 315 | +by_cases (assume h : s = ∅, ⟨0, by simp [h, is_lub, is_least, lower_bounds, upper_bounds]⟩) $ |
| 316 | + assume h : s ≠ ∅, |
| 317 | + let ⟨x, hx⟩ := exists_mem_of_ne_empty h in |
| 318 | + by_cases |
| 319 | + (assume : ∃r, 0 ≤ r ∧ of_real r ∈ upper_bounds s, |
| 320 | + let ⟨r, hr, hb⟩ := this in |
| 321 | + let s' := of_real ⁻¹' s ∩ {x | 0 ≤ x} in |
| 322 | + have s'_nn : ∀x∈s', (0:real) ≤ x, from assume x h, h.right, |
| 323 | + have s_eq : s = of_real '' s', |
| 324 | + from set.ext $ assume a, ⟨assume ha, |
| 325 | + let ⟨q, hq₁, hq₂, hq₃⟩ := (le_of_real_iff hr).mp (hb _ ha) in |
| 326 | + ⟨q, ⟨show of_real q ∈ s, from hq₃ ▸ ha, hq₁⟩, hq₃ ▸ rfl⟩, |
| 327 | + assume ⟨r, ⟨hr₁, hr₂⟩, hr₃⟩, hr₃ ▸ hr₁⟩, |
| 328 | + have x ∈ of_real '' s', from s_eq ▸ hx, |
| 329 | + let ⟨x', hx', hx'_eq⟩ := this in |
| 330 | + have ∃x, is_lub s' x, from exists_supremum_real ‹x' ∈ s'› $ |
| 331 | + (of_real_mem_upper_bounds s'_nn hr).mp $ s_eq ▸ hb, |
| 332 | + let ⟨x, hx⟩ := this in |
| 333 | + have 0 ≤ x, from le_trans hx'.right $ hx.left _ hx', |
| 334 | + ⟨of_real x, by rwa [s_eq, is_lub_of_real s'_nn this]; exact ne_empty_of_mem hx'⟩) |
| 335 | + begin |
| 336 | + intro h, |
| 337 | + existsi ∞, |
| 338 | + simp [is_lub, is_least, lower_bounds, forall_ennreal, not_exists_iff, not_and_iff_imp_not] |
| 339 | + at h ⊢, |
| 340 | + assumption |
| 341 | + end |
| 342 | + |
| 343 | +instance : has_Sup ennreal := ⟨λs, some (ennreal.exists_is_lub s)⟩ |
| 344 | + |
| 345 | +protected lemma is_lub_Sup {s : set ennreal} : is_lub s (Sup s) := |
| 346 | +some_spec _ |
| 347 | + |
| 348 | +protected lemma le_Sup {s : set ennreal} : a ∈ s → a ≤ Sup s := |
| 349 | +ennreal.is_lub_Sup.left a |
| 350 | + |
| 351 | +protected lemma Sup_le {s : set ennreal} : (∀b∈s, b ≤ a) → Sup s ≤ a := |
| 352 | +ennreal.is_lub_Sup.right _ |
| 353 | + |
| 354 | +instance : complete_lattice ennreal := |
| 355 | +{ ennreal.decidable_linear_order with |
| 356 | + top := ∞, |
| 357 | + bot := 0, |
| 358 | + inf := min, |
| 359 | + sup := max, |
| 360 | + Sup := Sup, |
| 361 | + Inf := λs, Sup {a | ∀b∈s, a ≤ b}, |
| 362 | + le_top := assume a, le_infty, |
| 363 | + bot_le := assume a, ennreal.zero_le, |
| 364 | + le_sup_left := le_max_left, |
| 365 | + le_sup_right := le_max_right, |
| 366 | + sup_le := assume a b c, max_le, |
| 367 | + inf_le_left := min_le_left, |
| 368 | + inf_le_right := min_le_right, |
| 369 | + le_inf := assume a b c, le_min, |
| 370 | + le_Sup := assume s a, ennreal.le_Sup, |
| 371 | + Sup_le := assume s a, ennreal.Sup_le, |
| 372 | + le_Inf := assume s a h, ennreal.le_Sup h, |
| 373 | + Inf_le := assume s a ha, ennreal.Sup_le $ assume b hb, hb _ ha } |
| 374 | + |
| 375 | +end complete_lattice |
| 376 | + |
| 377 | +end ennreal |
0 commit comments