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

Commit 08a070b

Browse files
committed
chore(topology/instances/ennreal): golf a proof (#9767)
1 parent 4a837fb commit 08a070b

2 files changed

Lines changed: 29 additions & 51 deletions

File tree

src/topology/basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,14 @@ tendsto_const_nhds
12611261
lemma continuous_const {b : β} : continuous (λa:α, b) :=
12621262
continuous_iff_continuous_at.mpr $ assume a, continuous_at_const
12631263

1264+
lemma filter.eventually_eq.continuous_at {x : α} {f : α → β} {y : β} (h : f =ᶠ[𝓝 x] (λ _, y)) :
1265+
continuous_at f x :=
1266+
(continuous_at_congr h).2 tendsto_const_nhds
1267+
1268+
lemma continuous_of_const {f : α → β} (h : ∀ x y, f x = f y) : continuous f :=
1269+
continuous_iff_continuous_at.mpr $ λ x, filter.eventually_eq.continuous_at $
1270+
eventually_of_forall (λ y, h y x)
1271+
12641272
lemma continuous_at_id {x : α} : continuous_at id x :=
12651273
continuous_id.continuous_at
12661274

src/topology/instances/ennreal.lean

Lines changed: 21 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,57 +1053,27 @@ end⟩
10531053
lemma continuous_of_le_add_edist {f : α → ℝ≥0∞} (C : ℝ≥0∞)
10541054
(hC : C ≠ ⊤) (h : ∀x y, f x ≤ f y + C * edist x y) : continuous f :=
10551055
begin
1056-
refine continuous_iff_continuous_at.2 (λx, tendsto_order.2 ⟨_, _⟩),
1057-
show ∀e, e < f x → ∀ᶠ y in 𝓝 x, e < f y,
1058-
{ assume e he,
1059-
let ε := min (f x - e) 1,
1060-
have : ε ≠ ⊤ := ne_top_of_le_ne_top ennreal.coe_ne_top (min_le_right _ _),
1061-
have : 0 < ε := by simp [ε, hC, he, ennreal.zero_lt_one],
1062-
have : 0 < C⁻¹ * (ε/2) := bot_lt_iff_ne_bot.2 (by simp [hC, (ne_of_lt this).symm, mul_eq_zero]),
1063-
have I : C * (C⁻¹ * (ε/2)) < ε,
1064-
{ by_cases C_zero : C = 0,
1065-
{ simp [C_zero, ‹0 < ε›] },
1066-
{ calc C * (C⁻¹ * (ε/2)) = (C * C⁻¹) * (ε/2) : by simp [mul_assoc]
1067-
... = ε/2 : by simp [ennreal.mul_inv_cancel C_zero hC]
1068-
... < ε : ennreal.half_lt_self (‹0 < ε›.ne') (‹ε ≠ ⊤›) }},
1069-
have : ball x (C⁻¹ * (ε/2)) ⊆ {y : α | e < f y},
1070-
{ rintros y hy,
1071-
by_cases htop : f y = ⊤,
1072-
{ simp [htop, lt_top_iff_ne_top, ne_top_of_lt he] },
1073-
{ rw [emetric.mem_ball] at hy,
1074-
have : e + ε < f y + ε := calc
1075-
e + ε ≤ e + (f x - e) : add_le_add_left (min_le_left _ _) _
1076-
... = f x : ennreal.add_sub_cancel_of_le he.le
1077-
... ≤ f y + C * edist x y : h x y
1078-
... = f y + C * edist y x : by simp [edist_comm]
1079-
... ≤ f y + C * (C⁻¹ * (ε/2)) :
1080-
add_le_add_left (mul_le_mul_left' (le_of_lt hy) _) _
1081-
... < f y + ε : ennreal.add_lt_add_left htop I,
1082-
show e < f y, from lt_of_add_lt_add_right this } },
1083-
apply filter.mem_of_superset (ball_mem_nhds _ (‹0 < C⁻¹ * (ε/2)›)) this },
1084-
show ∀e, f x < e → ∀ᶠ y in 𝓝 x, f y < e,
1085-
{ assume e he,
1086-
let ε := min (e - f x) 1,
1087-
have : ε < ⊤ := lt_of_le_of_lt (min_le_right _ _) (by simp [lt_top_iff_ne_top]),
1088-
have : 0 < ε := by simp [ε, he, ennreal.zero_lt_one],
1089-
have : 0 < C⁻¹ * (ε/2) := bot_lt_iff_ne_bot.2 (by simp [hC, (ne_of_lt this).symm, mul_eq_zero]),
1090-
have I : C * (C⁻¹ * (ε/2)) < ε,
1091-
{ by_cases C_zero : C = 0,
1092-
simp [C_zero, ‹0 < ε›],
1093-
calc C * (C⁻¹ * (ε/2)) = (C * C⁻¹) * (ε/2) : by simp [mul_assoc]
1094-
... = ε/2 : by simp [ennreal.mul_inv_cancel C_zero hC]
1095-
... < ε : ennreal.half_lt_self (‹0 < ε›.ne') (‹ε < ⊤›.ne) },
1096-
have : ball x (C⁻¹ * (ε/2)) ⊆ {y : α | f y < e},
1097-
{ rintros y hy,
1098-
have htop : f x ≠ ⊤ := ne_top_of_lt he,
1099-
show f y < e, from calc
1100-
f y ≤ f x + C * edist y x : h y x
1101-
... ≤ f x + C * (C⁻¹ * (ε/2)) :
1102-
add_le_add_left (mul_le_mul_left' (le_of_lt hy) _) _
1103-
... < f x + ε : ennreal.add_lt_add_left htop I
1104-
... ≤ f x + (e - f x) : add_le_add_left (min_le_left _ _) _
1105-
... = e : by simp [le_of_lt he] },
1106-
apply filter.mem_of_superset (ball_mem_nhds _ (‹0 < C⁻¹ * (ε/2)›)) this },
1056+
rcases eq_or_ne C 0 with (rfl|C0),
1057+
{ simp only [zero_mul, add_zero] at h,
1058+
exact continuous_of_const (λ x y, le_antisymm (h _ _) (h _ _)) },
1059+
{ refine continuous_iff_continuous_at.2 (λ x, _),
1060+
by_cases hx : f x = ∞,
1061+
{ have : f =ᶠ[𝓝 x] (λ _, ∞),
1062+
{ filter_upwards [emetric.ball_mem_nhds x ennreal.coe_lt_top],
1063+
refine λ y (hy : edist y x < ⊤), _, rw edist_comm at hy,
1064+
simpa [hx, hC, hy.ne] using h x y },
1065+
exact this.continuous_at },
1066+
{ refine (ennreal.tendsto_nhds hx).2 (λ ε (ε0 : 0 < ε), _),
1067+
filter_upwards [emetric.closed_ball_mem_nhds x (ennreal.div_pos_iff.2 ⟨ε0.ne', hC⟩)],
1068+
have hεC : C * (ε / C) = ε := ennreal.mul_div_cancel' C0 hC,
1069+
refine λ y (hy : edist y x ≤ ε / C), ⟨sub_le_iff_right.2 _, _⟩,
1070+
{ rw edist_comm at hy,
1071+
calc f x ≤ f y + C * edist x y : h x y
1072+
... ≤ f y + C * (ε / C) : add_le_add_left (mul_le_mul_left' hy C) (f y)
1073+
... = f y + ε : by rw hεC },
1074+
{ calc f y ≤ f x + C * edist y x : h y x
1075+
... ≤ f x + C * (ε / C) : add_le_add_left (mul_le_mul_left' hy C) (f x)
1076+
... = f x + ε : by rw hεC } } }
11071077
end
11081078

11091079
theorem continuous_edist : continuous (λp:α×α, edist p.1 p.2) :=

0 commit comments

Comments
 (0)