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

Commit 812e17f

Browse files
committed
feat(analysis/normed_space/pointwise): Addition of balls (#13381)
Adding two balls yields another ball.
1 parent a54db9a commit 812e17f

File tree

5 files changed

+175
-51
lines changed

5 files changed

+175
-51
lines changed

src/analysis/normed/group/basic.lean

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,10 @@ by simp [dist_eq_norm]
143143
@[simp] lemma dist_add_right (g₁ g₂ h : E) : dist (g₁ + h) (g₂ + h) = dist g₁ g₂ :=
144144
by simp [dist_eq_norm]
145145

146-
@[simp] lemma dist_neg_neg (g h : E) : dist (-g) (-h) = dist g h :=
147-
by simp only [dist_eq_norm, neg_sub_neg, norm_sub_rev]
146+
lemma dist_neg (x y : E) : dist (-x) y = dist x (-y) :=
147+
by simp_rw [dist_eq_norm, ←norm_neg (-x - y), neg_sub, sub_neg_eq_add, add_comm]
148+
149+
@[simp] lemma dist_neg_neg (g h : E) : dist (-g) (-h) = dist g h := by rw [dist_neg, neg_neg]
148150

149151
@[simp] lemma dist_sub_left (g h₁ h₂ : E) : dist (g - h₁) (g - h₂) = dist h₁ h₂ :=
150152
by simp only [sub_eq_add_neg, dist_add_left, dist_neg_neg]
@@ -628,8 +630,8 @@ by simp [edist_dist]
628630
@[simp] lemma edist_add_right (g₁ g₂ h : E) : edist (g₁ + h) (g₂ + h) = edist g₁ g₂ :=
629631
by simp [edist_dist]
630632

631-
@[simp] lemma edist_neg_neg (x y : E) : edist (-x) (-y) = edist x y :=
632-
by rw [edist_dist, dist_neg_neg, edist_dist]
633+
lemma edist_neg (x y : E) : edist (-x) y = edist x (-y) := by simp_rw [edist_dist, dist_neg]
634+
@[simp] lemma edist_neg_neg (x y : E) : edist (-x) (-y) = edist x y := by rw [edist_neg, neg_neg]
633635

634636
@[simp] lemma edist_sub_left (g h₁ h₂ : E) : edist (g - h₁) (g - h₂) = edist h₁ h₂ :=
635637
by simp only [sub_eq_add_neg, edist_add_left, edist_neg_neg]

src/analysis/normed/group/pointwise.lean

Lines changed: 115 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ Copyright (c) 2021 Sébastien Gouëzel. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Sébastien Gouëzel
55
-/
6-
import analysis.normed.group.basic
6+
import analysis.normed.group.add_torsor
77
import topology.metric_space.hausdorff_distance
88

99
/-!
10-
# Properties of pointwise addition of sets in normed groups.
10+
# Properties of pointwise addition of sets in normed groups
1111
1212
We explore the relationships between pointwise addition of sets in normed groups, and the norm.
1313
Notably, we show that the sum of bounded sets remain bounded.
@@ -18,16 +18,14 @@ open_locale pointwise topological_space
1818

1919
section semi_normed_group
2020

21-
variables {E : Type*} [semi_normed_group E]
21+
variables {E : Type*} [semi_normed_group E] {ε δ : ℝ} {s t : set E} {x y : E}
2222

23-
lemma bounded_iff_exists_norm_le {s : set E} :
24-
bounded s ↔ ∃ R, ∀ x ∈ s, ∥x∥ ≤ R :=
23+
lemma bounded_iff_exists_norm_le : bounded s ↔ ∃ R, ∀ x ∈ s, ∥x∥ ≤ R :=
2524
by simp [subset_def, bounded_iff_subset_ball (0 : E)]
2625

2726
alias bounded_iff_exists_norm_le ↔ metric.bounded.exists_norm_le _
2827

29-
lemma metric.bounded.exists_pos_norm_le {s : set E} (hs : metric.bounded s) :
30-
∃ R > 0, ∀ x ∈ s, ∥x∥ ≤ R :=
28+
lemma metric.bounded.exists_pos_norm_le (hs : metric.bounded s) : ∃ R > 0, ∀ x ∈ s, ∥x∥ ≤ R :=
3129
begin
3230
obtain ⟨R₀, hR₀⟩ := hs.exists_norm_le,
3331
refine ⟨max R₀ 1, _, _⟩,
@@ -36,9 +34,7 @@ begin
3634
exact (hR₀ x hx).trans (le_max_left _ _),
3735
end
3836

39-
lemma metric.bounded.add
40-
{s t : set E} (hs : bounded s) (ht : bounded t) :
41-
bounded (s + t) :=
37+
lemma metric.bounded.add (hs : bounded s) (ht : bounded t) : bounded (s + t) :=
4238
begin
4339
obtain ⟨Rs, hRs⟩ : ∃ (R : ℝ), ∀ x ∈ s, ∥x∥ ≤ R := hs.exists_norm_le,
4440
obtain ⟨Rt, hRt⟩ : ∃ (R : ℝ), ∀ x ∈ t, ∥x∥ ≤ R := ht.exists_norm_le,
@@ -48,46 +44,130 @@ begin
4844
... ≤ Rs + Rt : add_le_add (hRs x hx) (hRt y hy)
4945
end
5046

51-
@[simp] lemma singleton_add_ball (x y : E) (r : ℝ) :
52-
{x} + ball y r = ball (x + y) r :=
47+
lemma metric.bounded.neg : bounded s → bounded (-s) :=
48+
by { simp_rw [bounded_iff_exists_norm_le, ←image_neg, ball_image_iff, norm_neg], exact id }
49+
50+
lemma metric.bounded.sub (hs : bounded s) (ht : bounded t) : bounded (s - t) :=
51+
(sub_eq_add_neg _ _).symm.subst $ hs.add ht.neg
52+
53+
section emetric
54+
open emetric
55+
56+
lemma inf_edist_neg (x : E) (s : set E) : inf_edist (-x) s = inf_edist x (-s) :=
57+
eq_of_forall_le_iff $ λ r, by simp_rw [le_inf_edist, ←image_neg, ball_image_iff, edist_neg]
58+
59+
@[simp] lemma inf_edist_neg_neg (x : E) (s : set E) : inf_edist (-x) (-s) = inf_edist x s :=
60+
by rw [inf_edist_neg, neg_neg]
61+
62+
end emetric
63+
64+
variables (ε δ s t x y)
65+
66+
@[simp] lemma neg_thickening : -thickening δ s = thickening δ (-s) :=
67+
by { unfold thickening, simp_rw ←inf_edist_neg, refl }
68+
69+
@[simp] lemma neg_cthickening : -cthickening δ s = cthickening δ (-s) :=
70+
by { unfold cthickening, simp_rw ←inf_edist_neg, refl }
71+
72+
@[simp] lemma neg_ball : -ball x δ = ball (-x) δ :=
73+
by { unfold metric.ball, simp_rw ←dist_neg, refl }
74+
75+
@[simp] lemma neg_closed_ball : -closed_ball x δ = closed_ball (-x) δ :=
76+
by { unfold metric.closed_ball, simp_rw ←dist_neg, refl }
77+
78+
lemma singleton_add_ball : {x} + ball y δ = ball (x + y) δ :=
5379
by simp only [preimage_add_ball, image_add_left, singleton_add, sub_neg_eq_add, add_comm y x]
5480

55-
@[simp] lemma ball_add_singleton (x y : E) (r : ℝ) :
56-
ball x r + {y} = ball (x + y) r :=
57-
by simp [add_comm _ {y}, add_comm y]
81+
lemma singleton_sub_ball : {x} - ball y δ = ball (x - y) δ :=
82+
by simp_rw [sub_eq_add_neg, neg_ball, singleton_add_ball]
83+
84+
lemma ball_add_singleton : ball x δ + {y} = ball (x + y) δ :=
85+
by rw [add_comm, singleton_add_ball, add_comm y]
5886

59-
lemma singleton_add_ball_zero (x : E) (r : ℝ) :
60-
{x} + ball 0 r = ball x r :=
61-
by simp
87+
lemma ball_sub_singleton : ball x δ - {y} = ball (x - y) δ :=
88+
by simp_rw [sub_eq_add_neg, neg_singleton, ball_add_singleton]
6289

63-
lemma ball_zero_add_singleton (x : E) (r : ℝ) :
64-
ball 0 r + {x} = ball x r :=
65-
by simp
90+
lemma singleton_add_ball_zero : {x} + ball 0 δ = ball x δ := by simp
91+
lemma singleton_sub_ball_zero : {x} - ball 0 δ = ball x δ := by simp [singleton_sub_ball]
92+
lemma ball_zero_add_singleton : ball 0 δ + {x} = ball x δ := by simp [ball_add_singleton]
93+
lemma ball_zero_sub_singleton : ball 0 δ - {x} = ball (-x) δ := by simp [ball_sub_singleton]
94+
lemma vadd_ball_zero : x +ᵥ ball 0 δ = ball x δ := by simp
6695

67-
@[simp] lemma singleton_add_closed_ball (x y : E) (r : ℝ) :
68-
{x} + closed_ball y r = closed_ball (x + y) r :=
96+
@[simp] lemma singleton_add_closed_ball : {x} + closed_ball y δ = closed_ball (x + y) δ :=
6997
by simp only [add_comm y x, preimage_add_closed_ball, image_add_left, singleton_add, sub_neg_eq_add]
7098

71-
@[simp] lemma closed_ball_add_singleton (x y : E) (r : ℝ) :
72-
closed_ball x r + {y} = closed_ball (x + y) r :=
99+
@[simp] lemma singleton_sub_closed_ball : {x} - closed_ball y δ = closed_ball (x - y) δ :=
100+
by simp_rw [sub_eq_add_neg, neg_closed_ball, singleton_add_closed_ball]
101+
102+
@[simp] lemma closed_ball_add_singleton : closed_ball x δ + {y} = closed_ball (x + y) δ :=
73103
by simp [add_comm _ {y}, add_comm y]
74104

75-
lemma singleton_add_closed_ball_zero (x : E) (r : ℝ) :
76-
{x} + closed_ball 0 r = closed_ball x r :=
77-
by simp
105+
@[simp] lemma closed_ball_sub_singleton : closed_ball x δ - {y} = closed_ball (x - y) δ :=
106+
by simp [sub_eq_add_neg]
78107

79-
lemma closed_ball_zero_add_singleton (x : E) (r : ℝ) :
80-
closed_ball 0 r + {x} = closed_ball x r :=
81-
by simp
108+
lemma singleton_add_closed_ball_zero : {x} + closed_ball 0 δ = closed_ball x δ := by simp
109+
lemma singleton_sub_closed_ball_zero : {x} - closed_ball 0 δ = closed_ball x δ := by simp
110+
lemma closed_ball_zero_add_singleton : closed_ball 0 δ + {x} = closed_ball x δ := by simp
111+
lemma closed_ball_zero_sub_singleton : closed_ball 0 δ - {x} = closed_ball (-x) δ := by simp
112+
@[simp] lemma vadd_closed_ball_zero : x +ᵥ closed_ball 0 δ = closed_ball x δ := by simp
82113

83-
lemma is_compact.cthickening_eq_add_closed_ball
84-
{s : set E} (hs : is_compact s) {r : ℝ} (hr : 0 ≤ r) :
85-
cthickening r s = s + closed_ball 0 r :=
114+
lemma add_ball_zero : s + ball 0 δ = thickening δ s :=
86115
begin
87-
rw hs.cthickening_eq_bUnion_closed_ball hr,
116+
rw thickening_eq_bUnion_ball,
117+
convert Union₂_add (λ x (_ : x ∈ s), {x}) (ball (0 : E) δ),
118+
exact s.bUnion_of_singleton.symm,
119+
ext x y,
120+
simp_rw [singleton_add_ball, add_zero],
121+
end
122+
123+
lemma sub_ball_zero : s - ball 0 δ = thickening δ s := by simp [sub_eq_add_neg, add_ball_zero]
124+
lemma ball_add_zero : ball 0 δ + s = thickening δ s := by rw [add_comm, add_ball_zero]
125+
lemma ball_sub_zero : ball 0 δ - s = thickening δ (-s) := by simp [sub_eq_add_neg, ball_add_zero]
126+
127+
@[simp] lemma add_ball : s + ball x δ = x +ᵥ thickening δ s :=
128+
by rw [←vadd_ball_zero, add_vadd_comm, add_ball_zero]
129+
130+
@[simp] lemma sub_ball : s - ball x δ = -x +ᵥ thickening δ s := by simp [sub_eq_add_neg]
131+
@[simp] lemma ball_add : ball x δ + s = x +ᵥ thickening δ s := by rw [add_comm, add_ball]
132+
@[simp] lemma ball_sub : ball x δ - s = x +ᵥ thickening δ (-s) := by simp [sub_eq_add_neg]
133+
134+
variables {ε δ s t x y}
135+
136+
lemma is_compact.add_closed_ball_zero (hs : is_compact s) (hδ : 0 ≤ δ) :
137+
s + closed_ball 0 δ = cthickening δ s :=
138+
begin
139+
rw hs.cthickening_eq_bUnion_closed_ball hδ,
88140
ext x,
89141
simp only [mem_add, dist_eq_norm, exists_prop, mem_Union, mem_closed_ball,
90142
exists_and_distrib_left, mem_closed_ball_zero_iff, ← eq_sub_iff_add_eq', exists_eq_right],
91143
end
92144

145+
lemma is_compact.sub_closed_ball_zero (hs : is_compact s) (hδ : 0 ≤ δ) :
146+
s - closed_ball 0 δ = cthickening δ s :=
147+
by simp [sub_eq_add_neg, hs.add_closed_ball_zero hδ]
148+
149+
lemma is_compact.closed_ball_zero_add (hs : is_compact s) (hδ : 0 ≤ δ) :
150+
closed_ball 0 δ + s = cthickening δ s :=
151+
by rw [add_comm, hs.add_closed_ball_zero hδ]
152+
153+
lemma is_compact.closed_ball_zero_sub (hs : is_compact s) (hδ : 0 ≤ δ) :
154+
closed_ball 0 δ - s = cthickening δ (-s) :=
155+
by simp [sub_eq_add_neg, add_comm, hs.neg.add_closed_ball_zero hδ]
156+
157+
lemma is_compact.add_closed_ball (hs : is_compact s) (hδ : 0 ≤ δ) (x : E) :
158+
s + closed_ball x δ = x +ᵥ cthickening δ s :=
159+
by rw [←vadd_closed_ball_zero, add_vadd_comm, hs.add_closed_ball_zero hδ]
160+
161+
lemma is_compact.sub_closed_ball (hs : is_compact s) (hδ : 0 ≤ δ) (x : E) :
162+
s - closed_ball x δ = -x +ᵥ cthickening δ s :=
163+
by simp [sub_eq_add_neg, add_comm, hs.add_closed_ball hδ]
164+
165+
lemma is_compact.closed_ball_add (hs : is_compact s) (hδ : 0 ≤ δ) (x : E) :
166+
closed_ball x δ + s = x +ᵥ cthickening δ s :=
167+
by rw [add_comm, hs.add_closed_ball hδ]
168+
169+
lemma is_compact.closed_ball_sub (hs : is_compact s) (hδ : 0 ≤ δ) (x : E) :
170+
closed_ball x δ + s = x +ᵥ cthickening δ s :=
171+
by simp [sub_eq_add_neg, add_comm, hs.closed_ball_add hδ]
172+
93173
end semi_normed_group

src/analysis/normed_space/pointwise.lean

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Sébastien Gouëzel, Yaël Dillies
55
-/
66
import analysis.normed.group.pointwise
7-
import analysis.normed.group.add_torsor
87
import analysis.normed_space.basic
9-
import topology.metric_space.hausdorff_distance
108

119
/-!
1210
# Properties of pointwise scalar multiplication of sets in normed spaces.
@@ -87,14 +85,6 @@ begin
8785
simpa only [this, dist_eq_norm, add_sub_cancel', mem_closed_ball] using I,
8886
end
8987

90-
/-- Any ball is the image of a ball centered at the origin under a shift. -/
91-
lemma vadd_ball_zero (x : E) (r : ℝ) : x +ᵥ ball 0 r = ball x r :=
92-
by rw [vadd_ball, vadd_eq_add, add_zero]
93-
94-
/-- Any closed ball is the image of a closed ball centered at the origin under a shift. -/
95-
lemma vadd_closed_ball_zero (x : E) (r : ℝ) : x +ᵥ closed_ball 0 r = closed_ball x r :=
96-
by rw [vadd_closed_ball, vadd_eq_add, add_zero]
97-
9888
variables [normed_space ℝ E] {x y z : E} {δ ε : ℝ}
9989

10090
/-- In a real normed space, the image of the unit ball under scalar multiplication by a positive
@@ -264,6 +254,58 @@ end
264254
exact tsub_le_iff_right.2,
265255
end
266256

257+
@[simp] lemma thickening_ball (hε : 0 < ε) (hδ : 0 < δ) (x : E) :
258+
thickening ε (ball x δ) = ball x (ε + δ) :=
259+
by rw [←thickening_singleton, thickening_thickening hε hδ, thickening_singleton]; apply_instance
260+
261+
@[simp] lemma thickening_closed_ball (hε : 0 < ε) (hδ : 0 ≤ δ) (x : E) :
262+
thickening ε (closed_ball x δ) = ball x (ε + δ) :=
263+
by rw [←cthickening_singleton _ hδ, thickening_cthickening hε hδ, thickening_singleton];
264+
apply_instance
265+
266+
@[simp] lemma cthickening_ball (hε : 0 ≤ ε) (hδ : 0 < δ) (x : E) :
267+
cthickening ε (ball x δ) = closed_ball x (ε + δ) :=
268+
by rw [←thickening_singleton, cthickening_thickening hε hδ,
269+
cthickening_singleton _ (add_nonneg hε hδ.le)]; apply_instance
270+
271+
@[simp] lemma cthickening_closed_ball (hε : 0 ≤ ε) (hδ : 0 ≤ δ) (x : E) :
272+
cthickening ε (closed_ball x δ) = closed_ball x (ε + δ) :=
273+
by rw [←cthickening_singleton _ hδ, cthickening_cthickening hε hδ,
274+
cthickening_singleton _ (add_nonneg hε hδ)]; apply_instance
275+
276+
lemma ball_add_ball (hε : 0 < ε) (hδ : 0 < δ) (a b : E) :
277+
ball a ε + ball b δ = ball (a + b) (ε + δ) :=
278+
by rw [ball_add, thickening_ball hε hδ, vadd_ball, vadd_eq_add]; apply_instance
279+
280+
lemma ball_sub_ball (hε : 0 < ε) (hδ : 0 < δ) (a b : E) :
281+
ball a ε - ball b δ = ball (a - b) (ε + δ) :=
282+
by simp_rw [sub_eq_add_neg, neg_ball, ball_add_ball hε hδ]
283+
284+
lemma ball_add_closed_ball (hε : 0 < ε) (hδ : 0 ≤ δ) (a b : E) :
285+
ball a ε + closed_ball b δ = ball (a + b) (ε + δ) :=
286+
by rw [ball_add, thickening_closed_ball hε hδ, vadd_ball, vadd_eq_add]; apply_instance
287+
288+
lemma ball_sub_closed_ball (hε : 0 < ε) (hδ : 0 ≤ δ) (a b : E) :
289+
ball a ε - closed_ball b δ = ball (a - b) (ε + δ) :=
290+
by simp_rw [sub_eq_add_neg, neg_closed_ball, ball_add_closed_ball hε hδ]
291+
292+
lemma closed_ball_add_ball (hε : 0 ≤ ε) (hδ : 0 < δ) (a b : E) :
293+
closed_ball a ε + ball b δ = ball (a + b) (ε + δ) :=
294+
by rw [add_comm, ball_add_closed_ball hδ hε, add_comm, add_comm δ]; apply_instance
295+
296+
lemma closed_ball_sub_ball (hε : 0 ≤ ε) (hδ : 0 < δ) (a b : E) :
297+
closed_ball a ε - ball b δ = ball (a - b) (ε + δ) :=
298+
by simp_rw [sub_eq_add_neg, neg_ball, closed_ball_add_ball hε hδ]
299+
300+
lemma closed_ball_add_closed_ball [proper_space E] (hε : 0 ≤ ε) (hδ : 0 ≤ δ) (a b : E) :
301+
closed_ball a ε + closed_ball b δ = closed_ball (a + b) (ε + δ) :=
302+
by rw [(is_compact_closed_ball _ _).add_closed_ball hδ, cthickening_closed_ball hδ hε,
303+
vadd_closed_ball, vadd_eq_add, add_comm, add_comm δ]; apply_instance
304+
305+
lemma closed_ball_sub_closed_ball [proper_space E] (hε : 0 ≤ ε) (hδ : 0 ≤ δ) (a b : E) :
306+
closed_ball a ε - closed_ball b δ = closed_ball (a - b) (ε + δ) :=
307+
by simp_rw [sub_eq_add_neg, neg_closed_ball, closed_ball_add_closed_ball hε hδ]
308+
267309
end semi_normed_group
268310

269311
section normed_group

src/data/set/pointwise.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ lemma inv_subset_inv : s⁻¹ ⊆ t⁻¹ ↔ s ⊆ t :=
503503

504504
@[to_additive] lemma inv_subset : s⁻¹ ⊆ t ↔ s ⊆ t⁻¹ := by { rw [← inv_subset_inv, inv_inv] }
505505

506-
@[to_additive] lemma inv_singleton (a : α) : ({a} : set α)⁻¹ = {a⁻¹} :=
506+
@[simp, to_additive] lemma inv_singleton (a : α) : ({a} : set α)⁻¹ = {a⁻¹} :=
507507
by rw [←image_inv, image_singleton]
508508

509509
open mul_opposite

src/measure_theory/function/jacobian.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ begin
297297
(𝓝[>] 0) (𝓝 (μ (A '' (closed_ball 0 1)))),
298298
{ apply L0.congr' _,
299299
filter_upwards [self_mem_nhds_within] with r hr,
300-
rw [HC.cthickening_eq_add_closed_ball (le_of_lt hr), add_comm] },
300+
rw [HC.add_closed_ball_zero (le_of_lt hr), add_comm] },
301301
have L2 : tendsto (λ ε, μ (closed_ball 0 ε + A '' (closed_ball 0 1)))
302302
(𝓝[>] 0) (𝓝 (d * μ (closed_ball 0 1))),
303303
{ convert L1,

0 commit comments

Comments
 (0)