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

Commit 29639b3

Browse files
committed
feat(analysis/measure_theory): optimize proofs; trim, is_complete
1 parent bd90a93 commit 29639b3

17 files changed

+1649
-1100
lines changed

algebra/ordered_field.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,12 @@ lemma div_lt_div' (hac : a ≤ c) (hbd : d < b) (c0 : 0 < c) (d0 : 0 < d) :
119119

120120
lemma half_pos {a : α} (h : 0 < a) : 0 < a / 2 := div_pos h two_pos
121121

122+
lemma one_half_pos : (0:α) < 1 / 2 := half_pos zero_lt_one
123+
122124
def half_lt_self := @div_two_lt_of_pos
123125

126+
lemma one_half_lt_one : (1 / 2 : α) < 1 := half_lt_self zero_lt_one
127+
124128
lemma ivl_translate : (λx, x + c) '' {r:α | a ≤ r ∧ r ≤ b } = {r:α | a + c ≤ r ∧ r ≤ b + c} :=
125129
calc (λx, x + c) '' {r | a ≤ r ∧ r ≤ b } = (λx, x - c) ⁻¹' {r | a ≤ r ∧ r ≤ b } :
126130
congr_fun (set.image_eq_preimage_of_inverse

analysis/ennreal.lean

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Extended non-negative reals
77
88
TODO: base ennreal on nnreal!
99
-/
10-
import order.bounds algebra.ordered_group analysis.nnreal analysis.topology.infinite_sum
10+
import order.bounds algebra.ordered_group analysis.nnreal analysis.limits
1111
noncomputable theory
1212
open classical set lattice filter
1313
local attribute [instance] prop_decidable
@@ -382,6 +382,13 @@ instance : canonically_ordered_monoid ennreal :=
382382
⟨∞, by simp⟩⟩,
383383
..ennreal.ordered_comm_monoid }
384384

385+
lemma of_real_add_le : of_real (r + p) ≤ of_real r + of_real p :=
386+
show of_nonneg_real _ _ ≤ of_real _,
387+
by rw of_nonneg_real_eq_of_real; exact
388+
of_real_le_of_real
389+
(max_le (add_nonneg (le_max_left _ _) (le_max_left _ _))
390+
(add_le_add (le_max_right _ _) (le_max_right _ _)))
391+
385392
lemma mul_le_mul : ∀{b d}, a ≤ b → c ≤ d → a * c ≤ b * d :=
386393
forall_ennreal.mpr ⟨assume r hr, forall_ennreal.mpr ⟨assume p hp,
387394
by simp [le_of_real_iff, *, exists_imp_distrib, -and_imp] {contextual:=tt};
@@ -744,6 +751,9 @@ calc supr s + a = Sup (range s) + a : by simp [Sup_range]
744751
... = (⨆b∈range s, b + a) : Sup_add $ ne_empty_iff_exists_mem.mpr ⟨s x, x, rfl⟩
745752
... = _ : by simp [supr_range, -mem_range]
746753

754+
lemma add_supr {ι : Sort*} {s : ι → ennreal} [h : nonempty ι] : a + supr s = ⨆b, a + s b :=
755+
by rw [add_comm, supr_add]; simp
756+
747757
lemma infi_add {ι : Sort*} {s : ι → ennreal} {a : ennreal} : infi s + a = ⨅b, s b + a :=
748758
calc infi s + a = Inf (range s) + a : by simp [Inf_range]
749759
... = (⨅b∈range s, b + a) : Inf_add
@@ -756,10 +766,11 @@ lemma infi_add_infi {ι : Sort*} {f g : ι → ennreal} (h : ∀i j, ∃k, f k +
756766
infi f + infi g = (⨅a, f a + g a) :=
757767
suffices (⨅a, f a + g a) ≤ infi f + infi g,
758768
from le_antisymm (le_infi $ assume a, add_le_add' (infi_le _ _) (infi_le _ _)) this,
759-
calc (⨅a, f a + g a) ≤ (⨅a', ⨅a, f a + g a') :
760-
le_infi $ assume a', le_infi $ assume a, let ⟨k, h⟩ := h a a' in infi_le_of_le k h
769+
calc (⨅a, f a + g a) ≤ (⨅ a a', f a + g a') :
770+
le_infi $ assume a, le_infi $ assume a',
771+
let ⟨k, h⟩ := h a a' in infi_le_of_le k h
761772
... ≤ infi f + infi g :
762-
by simp [infi_add, add_infi, -add_comm, -le_infi_iff]
773+
by simp [add_infi, infi_add, -add_comm, -le_infi_iff]
763774

764775
lemma infi_sum {α : Type*} {ι : Sort*} {f : ι → α → ennreal} {s : finset α} [inhabited ι]
765776
(h : ∀(t : finset α) (i j : ι), ∃k, ∀a∈t, f k a ≤ f i a ∧ f k a ≤ f j a) :
@@ -772,6 +783,16 @@ finset.induction_on s (by simp) $ assume a s ha ih,
772783
assume a ha, (hk _ $ finset.mem_insert_of_mem ha).right⟩,
773784
by simp [ha, ih.symm, infi_add_infi this]
774785

786+
lemma supr_add_supr {ι : Sort*} [nonempty ι]
787+
{f g : ι → ennreal} (h : ∀i j, ∃k, f i + g j ≤ f k + g k) :
788+
supr f + supr g = (⨆ a, f a + g a) :=
789+
begin
790+
refine le_antisymm _ (supr_le $ λ a, add_le_add' (le_supr _ _) (le_supr _ _)),
791+
simpa [add_supr, supr_add] using
792+
λ i j, show f i + g j ≤ ⨆ a, f a + g a, from
793+
let ⟨k, hk⟩ := h i j in le_supr_of_le k hk,
794+
end
795+
775796
end topological_space
776797

777798
section sub
@@ -810,6 +831,9 @@ iff.intro
810831
calc a - b ≤ (c + b) - b : sub_le_sub h (le_refl _)
811832
... ≤ c : Inf_le (le_refl (c + b)))
812833

834+
lemma sub_le_self (a b : ennreal) : a - b ≤ a :=
835+
ennreal.sub_le_iff_le_add.2 $ le_add_of_nonneg_right' $ zero_le _
836+
813837
@[simp] lemma zero_sub : 0 - a = 0 :=
814838
le_antisymm (Inf_le ennreal.zero_le) ennreal.zero_le
815839

@@ -844,6 +868,19 @@ end
844868
@[simp] lemma add_sub_self : ∀{a b : ennreal}, b < ∞ → (a + b) - b = a :=
845869
by simp [forall_ennreal] {contextual:=tt}
846870

871+
@[simp] lemma add_sub_self' (h : a < ∞) : (a + b) - a = b :=
872+
by rw [add_comm, add_sub_self h]
873+
874+
lemma add_left_inj (h : a < ∞) : a + b = a + c ↔ b = c :=
875+
⟨λ e, by simpa [h] using congr_arg (λ x, x - a) e, congr_arg _⟩
876+
877+
lemma add_right_inj (h : a < ∞) : b + a = c + a ↔ b = c :=
878+
by rw [add_comm, add_comm c, add_left_inj h]
879+
880+
lemma sub_sub_cancel (h : a < ∞) (h2 : b ≤ a) : a - (a - b) = b :=
881+
by rw [← add_right_inj (lt_of_le_of_lt (sub_le_self _ _) h),
882+
sub_add_cancel_of_le (sub_le_self _ _), add_sub_cancel_of_le h2]
883+
847884
protected lemma tendsto_of_real_sub (hr : 0 ≤ r) :
848885
tendsto (λb, of_real r - b) (nhds b) (nhds (of_real r - b)) :=
849886
by_cases
@@ -864,7 +901,7 @@ by_cases
864901
by simp [(∘), -sub_eq_add_neg] {contextual:=tt},
865902
by simp at this; simp [eq, hr, hp, hpr, nhds_of_real_eq_map_of_real_nhds_nonneg, this])
866903

867-
lemma sub_supr {ι : Sort*} [hι : nonempty ι] {b : ι → ennreal} (hr : a < ) :
904+
lemma sub_supr {ι : Sort*} [hι : nonempty ι] {b : ι → ennreal} (hr : a < ) :
868905
a - (⨆i, b i) = (⨅i, a - b i) :=
869906
let ⟨i⟩ := hι in
870907
let ⟨r, hr, eq, _⟩ := lt_iff_exists_of_real.mp hr in
@@ -876,6 +913,12 @@ have Inf ((λb, of_real r - b) '' range b) = of_real r - (⨆i, b i),
876913
(tendsto.comp (tendsto_id' inf_le_left) (ennreal.tendsto_of_real_sub hr)),
877914
by rw [eq, ←this]; simp [Inf_image, infi_range, -mem_range]
878915

916+
lemma sub_infi {ι : Sort*} {b : ι → ennreal} : a - (⨅i, b i) = (⨆i, a - b i) :=
917+
eq_of_forall_ge_iff $ λ c, begin
918+
rw [ennreal.sub_le_iff_le_add, add_comm, infi_add],
919+
simp [ennreal.sub_le_iff_le_add]
920+
end
921+
879922
end sub
880923

881924
section inv
@@ -930,7 +973,7 @@ protected lemma tsum_eq_supr_sum : (∑a, f a) = (⨆s:finset α, s.sum f) :=
930973
tsum_eq_is_sum ennreal.is_sum
931974

932975
protected lemma tsum_sigma {β : α → Type*} (f : Πa, β a → ennreal) :
933-
(∑p:Σa, β a, f p.1 p.2) = (∑a, ∑b, f a b) :=
976+
(∑p:Σa, β a, f p.1 p.2) = (∑a b, f a b) :=
934977
tsum_sigma (assume b, ennreal.has_sum) ennreal.has_sum
935978

936979
protected lemma tsum_prod {f : α → β → ennreal} : (∑p:α×β, f p.1 p.2) = (∑a, ∑b, f a b) :=
@@ -956,6 +999,9 @@ calc (∑a, ∑b, f a b) = (∑p:α×β, f' p) : ennreal.tsum_prod.symm
956999
(tsum_eq_tsum_of_iso prod.swap (@prod.swap α β) (assume ⟨a, b⟩, rfl) (assume ⟨a, b⟩, rfl)).symm
9571000
... = (∑b, ∑a, f' (prod.swap (b, a))) : @ennreal.tsum_prod β α (λb a, f' (prod.swap (b, a)))
9581001

1002+
protected lemma tsum_add : (∑a, f a + g a) = (∑a, f a) + (∑a, g a) :=
1003+
tsum_add ennreal.has_sum ennreal.has_sum
1004+
9591005
protected lemma tsum_le_tsum (h : ∀a, f a ≤ g a) : (∑a, f a) ≤ (∑a, g a) :=
9601006
tsum_le_tsum h ennreal.has_sum ennreal.has_sum
9611007

@@ -968,7 +1014,7 @@ calc _ = (⨆s:finset ℕ, s.sum f) : ennreal.tsum_eq_supr_sum
9681014
⟨n, finset.sum_le_sum_of_subset hn⟩)
9691015
(supr_le_supr2 $ assume i, ⟨finset.range i, le_refl _⟩)
9701016

971-
protected lemma le_tsum {a : α} : f a ≤ (∑a, f a) :=
1017+
protected lemma le_tsum (a : α) : f a ≤ (∑a, f a) :=
9721018
calc f a = ({a} : finset α).sum f : by simp
9731019
... ≤ (⨆s:finset α, s.sum f) : le_supr (λs:finset α, s.sum f) _
9741020
... = (∑a, f a) : by rw [ennreal.tsum_eq_supr_sum]
@@ -978,7 +1024,7 @@ if h : ∀i, f i = 0 then by simp [h] else
9781024
let ⟨i, (hi : f i ≠ 0)⟩ := classical.not_forall.mp h in
9791025
have sum_ne_0 : (∑i, f i) ≠ 0, from ne_of_gt $
9801026
calc 0 < f i : lt_of_le_of_ne ennreal.zero_le hi.symm
981-
... ≤ (∑i, f i) : ennreal.le_tsum,
1027+
... ≤ (∑i, f i) : ennreal.le_tsum _,
9821028
have tendsto (λs:finset α, s.sum ((*) a ∘ f)) at_top (nhds (a * (∑i, f i))),
9831029
by rw [← show (*) a ∘ (λs:finset α, s.sum f) = λs, s.sum ((*) a ∘ f),
9841030
from funext $ λ s, finset.mul_sum];
@@ -999,7 +1045,15 @@ le_antisymm
9991045
by simpa [h] using hb
10001046
... = f a : by simp))
10011047
(calc f a ≤ (⨆ (h : a = a), f a) : le_supr (λh:a=a, f a) rfl
1002-
... ≤ (∑b:α, ⨆ (h : a = b), f b) : ennreal.le_tsum)
1048+
... ≤ (∑b:α, ⨆ (h : a = b), f b) : ennreal.le_tsum _)
1049+
1050+
theorem exists_pos_sum_of_encodable {ε : ennreal} (hε : 0 < ε)
1051+
(ι) [encodable ι] : ∃ ε' : ι → ℝ, (∀ i, 0 < ε' i) ∧ (∑ i, of_real (ε' i)) < ε :=
1052+
let ⟨a, a0, aε⟩ := dense hε,
1053+
⟨p, _, e, pε⟩ := lt_iff_exists_of_real.1 aε,
1054+
⟨ε', ε'0, c, hc, cp⟩ := pos_sum_of_encodable (zero_lt_of_real_iff.1 (e ▸ a0):0<p) ι in
1055+
⟨ε', ε'0, by rw ennreal.tsum_of_real hc (λ i, le_of_lt (ε'0 i));
1056+
exact lt_of_le_of_lt (of_real_le_of_real cp) pε⟩
10031057

10041058
end tsum
10051059

analysis/limits.lean

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Johannes Hölzl
55
66
A collection of limit properties.
77
-/
8-
import algebra.big_operators algebra.group_power
8+
import algebra.big_operators algebra.group_power tactic.norm_num
99
analysis.real analysis.topology.infinite_sum
1010
noncomputable theory
1111
open classical finset function filter
@@ -159,3 +159,43 @@ have tendsto (λn, (r ^ n - 1) * (r - 1)⁻¹) at_top (nhds ((0 - 1) * (r - 1)
159159
(tendsto_sub (tendsto_pow_at_top_nhds_0_of_lt_1 h₁ h₂) tendsto_const_nhds) tendsto_const_nhds,
160160
(is_sum_iff_tendsto_nat_of_nonneg $ pow_nonneg h₁).mpr $
161161
by simp [neg_inv, sum_geometric, div_eq_mul_inv, *] at *
162+
163+
lemma is_sum_geometric_two (a : ℝ) : is_sum (λn:ℕ, (a / 2) / 2 ^ n) a :=
164+
begin
165+
convert is_sum_mul_left (a / 2) (is_sum_geometric
166+
(le_of_lt one_half_pos) one_half_lt_one),
167+
{ funext n, simp,
168+
rw ← pow_inv; [refl, exact two_ne_zero] },
169+
{ norm_num, rw div_mul_cancel _ two_ne_zero }
170+
end
171+
172+
def pos_sum_of_encodable {ε : ℝ} (hε : 0 < ε)
173+
(ι) [encodable ι] : {ε' : ι → ℝ // (∀ i, 0 < ε' i) ∧ ∃ c, is_sum ε' c ∧ c ≤ ε} :=
174+
begin
175+
let f := λ n, (ε / 2) / 2 ^ n,
176+
have hf : is_sum f ε := is_sum_geometric_two _,
177+
have f0 : ∀ n, 0 < f n := λ n, div_pos (half_pos hε) (pow_pos two_pos _),
178+
refine ⟨f ∘ encodable.encode, λ i, f0 _, _⟩,
179+
let g : ℕ → ℝ := λ n, option.cases_on (encodable.decode2 ι n) 0 (f ∘ encodable.encode),
180+
have : ∀ n, g n = 0 ∨ g n = f n,
181+
{ intro n, dsimp [g], cases e : encodable.decode2 ι n with a,
182+
{ exact or.inl rfl },
183+
{ simp [encodable.mem_decode2.1 e] } },
184+
cases has_sum_of_has_sum_of_sub ⟨_, hf⟩ this with c hg,
185+
have cε : c ≤ ε,
186+
{ refine is_sum_le (λ n, _) hg hf,
187+
cases this n; rw h, exact le_of_lt (f0 _) },
188+
have hs : ∀ n, g n ≠ 0 → (encodable.decode2 ι n).is_some,
189+
{ intros n h, dsimp [g] at h,
190+
cases encodable.decode2 ι n,
191+
exact (h rfl).elim, exact rfl },
192+
refine ⟨c, _, cε⟩,
193+
refine is_sum_of_is_sum_ne_zero
194+
(λ n h, option.get (hs n h)) (λ n _, ne_of_gt (f0 _))
195+
(λ i _, encodable.encode i) (λ n h, ne_of_gt _)
196+
(λ n h, _) (λ i _, _) (λ i _, _) hg,
197+
{ dsimp [g], rw encodable.encodek2, exact f0 _ },
198+
{ exact encodable.mem_decode2.1 (option.get_mem _) },
199+
{ exact option.get_of_mem _ (encodable.encodek2 _) },
200+
{ dsimp [g], rw encodable.encodek2 }
201+
end

0 commit comments

Comments
 (0)