Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 51042cd

Browse files
committed
feat(topology/ennreal): add extended non-negative real numbers
1 parent 76ae12c commit 51042cd

File tree

3 files changed

+383
-6
lines changed

3 files changed

+383
-6
lines changed

algebra/big_operators.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,10 @@ section semiring
255255
variables [semiring β]
256256

257257
lemma sum_mul : s.sum f * b = s.sum (λx, f x * b) :=
258-
(sum_hom (λx, x * b) (zero_mul b) (assume a b, add_mul _ _ _)).symm
258+
(sum_hom (λx, x * b) (zero_mul b) (assume a c, add_mul a c b)).symm
259259

260260
lemma mul_sum : b * s.sum f = s.sum (λx, b * f x) :=
261-
(sum_hom (λx, b * x) (mul_zero b) (assume a b, mul_add _ _ _)).symm
261+
(sum_hom (λx, b * x) (mul_zero b) (assume a c, mul_add b a c)).symm
262262

263263
end semiring
264264

topology/ennreal.lean

Lines changed: 377 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,377 @@
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

Comments
 (0)