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

Commit f12b3d9

Browse files
eric-wieserurkud
andcommitted
feat(topology/algebra): weaken typeclasses to only require has_continuous_const_smul (#11995)
This changes all the continuity-based `const_smul` lemmas to only require `has_continuous_const_smul` rather than `has_continuous_smul`. It does not attempt to propagate the changes out of this file. Four new instances are added in `const_mul_action.lean` for `has_continuous_const_smul`: `mul_opposite`, `prod`, `pi`, and `units`; all copied from the corresponding `has_continuous_smul` instance in `mul_action.lean`. Presumably these lemmas existed before this typeclass did. At any rate, the connection was less obvious until the rename a few days ago in #11940. Co-authored-by: Yury G. Kudryashov <urkud@urkud.name>
1 parent f1334b9 commit f12b3d9

File tree

2 files changed

+229
-204
lines changed

2 files changed

+229
-204
lines changed

src/topology/algebra/const_mul_action.lean

Lines changed: 227 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Hausdorff, discrete group, properly discontinuous, quotient space
3333
3434
-/
3535

36-
open_locale topological_space
36+
open_locale topological_space pointwise
3737

3838
open filter set
3939

@@ -61,6 +61,232 @@ export has_continuous_const_smul (continuous_const_smul)
6161

6262
export has_continuous_const_vadd (continuous_const_vadd)
6363

64+
variables {M α β : Type*}
65+
66+
section has_scalar
67+
variables [topological_space α] [has_scalar M α] [has_continuous_const_smul M α]
68+
69+
@[to_additive]
70+
lemma filter.tendsto.const_smul {f : β → α} {l : filter β} {a : α} (hf : tendsto f l (𝓝 a))
71+
(c : M) :
72+
tendsto (λ x, c • f x) l (𝓝 (c • a)) :=
73+
((continuous_const_smul _).tendsto _).comp hf
74+
75+
variables [topological_space β] {f : β → M} {g : β → α} {b : β} {s : set β}
76+
77+
@[to_additive]
78+
lemma continuous_within_at.const_smul (hg : continuous_within_at g s b) (c : M) :
79+
continuous_within_at (λ x, c • g x) s b :=
80+
hg.const_smul c
81+
82+
@[to_additive]
83+
lemma continuous_at.const_smul (hg : continuous_at g b) (c : M) :
84+
continuous_at (λ x, c • g x) b :=
85+
hg.const_smul c
86+
87+
@[to_additive]
88+
lemma continuous_on.const_smul (hg : continuous_on g s) (c : M) :
89+
continuous_on (λ x, c • g x) s :=
90+
λ x hx, (hg x hx).const_smul c
91+
92+
@[to_additive]
93+
lemma continuous.const_smul (hg : continuous g) (c : M) :
94+
continuous (λ x, c • g x) :=
95+
(continuous_const_smul _).comp hg
96+
97+
/-- If a scalar is central, then its right action is continuous when its left action is. -/
98+
instance has_continuous_const_smul.op [has_scalar Mᵐᵒᵖ α] [is_central_scalar M α] :
99+
has_continuous_const_smul Mᵐᵒᵖ α :=
100+
⟨ mul_opposite.rec $ λ c, by simpa only [op_smul_eq_smul] using continuous_const_smul c ⟩
101+
102+
@[to_additive]
103+
instance [has_scalar M β] [has_continuous_const_smul M β] :
104+
has_continuous_const_smul M (α × β) :=
105+
⟨λ _, (continuous_fst.const_smul _).prod_mk (continuous_snd.const_smul _)⟩
106+
107+
@[to_additive]
108+
instance {ι : Type*} {γ : ι → Type*} [∀ i, topological_space (γ i)] [Π i, has_scalar M (γ i)]
109+
[∀ i, has_continuous_const_smul M (γ i)] : has_continuous_const_smul M (Π i, γ i) :=
110+
⟨λ _, continuous_pi $ λ i, (continuous_apply i).const_smul _⟩
111+
112+
end has_scalar
113+
114+
section monoid
115+
116+
variables [topological_space α]
117+
variables [monoid M] [mul_action M α] [has_continuous_const_smul M α]
118+
119+
@[to_additive] instance units.has_continuous_const_smul : has_continuous_const_smul Mˣ α :=
120+
{ continuous_const_smul := λ m, (continuous_const_smul (m : M) : _) }
121+
122+
@[to_additive]
123+
lemma smul_closure_subset (c : M) (s : set α) : c • closure s ⊆ closure (c • s) :=
124+
((set.maps_to_image _ _).closure $ continuous_id.const_smul c).image_subset
125+
126+
@[to_additive]
127+
lemma smul_closure_orbit_subset (c : M) (x : α) :
128+
c • closure (mul_action.orbit M x) ⊆ closure (mul_action.orbit M x) :=
129+
(smul_closure_subset c _).trans $ closure_mono $ mul_action.smul_orbit_subset _ _
130+
131+
end monoid
132+
133+
section group
134+
135+
variables {G : Type*} [topological_space α] [group G] [mul_action G α]
136+
[has_continuous_const_smul G α]
137+
138+
@[to_additive]
139+
lemma tendsto_const_smul_iff {f : β → α} {l : filter β} {a : α} (c : G) :
140+
tendsto (λ x, c • f x) l (𝓝 $ c • a) ↔ tendsto f l (𝓝 a) :=
141+
⟨λ h, by simpa only [inv_smul_smul] using h.const_smul c⁻¹,
142+
λ h, h.const_smul _⟩
143+
144+
variables [topological_space β] {f : β → α} {b : β} {s : set β}
145+
146+
@[to_additive]
147+
lemma continuous_within_at_const_smul_iff (c : G) :
148+
continuous_within_at (λ x, c • f x) s b ↔ continuous_within_at f s b :=
149+
tendsto_const_smul_iff c
150+
151+
@[to_additive]
152+
lemma continuous_on_const_smul_iff (c : G) : continuous_on (λ x, c • f x) s ↔ continuous_on f s :=
153+
forall₂_congr $ λ b hb, continuous_within_at_const_smul_iff c
154+
155+
@[to_additive]
156+
lemma continuous_at_const_smul_iff (c : G) :
157+
continuous_at (λ x, c • f x) b ↔ continuous_at f b :=
158+
tendsto_const_smul_iff c
159+
160+
@[to_additive]
161+
lemma continuous_const_smul_iff (c : G) :
162+
continuous (λ x, c • f x) ↔ continuous f :=
163+
by simp only [continuous_iff_continuous_at, continuous_at_const_smul_iff]
164+
165+
/-- The homeomorphism given by scalar multiplication by a given element of a group `Γ` acting on
166+
`T` is a homeomorphism from `T` to itself. -/
167+
@[to_additive] def homeomorph.smul {G : Type*} [group G]
168+
[mul_action G α] [has_continuous_const_smul G α] (γ : G) : α ≃ₜ α :=
169+
{ to_equiv := mul_action.to_perm γ,
170+
continuous_to_fun := continuous_const_smul γ,
171+
continuous_inv_fun := continuous_const_smul γ⁻¹ }
172+
173+
/-- The homeomorphism given by affine-addition by an element of an additive group `Γ` acting on
174+
`T` is a homeomorphism from `T` to itself. -/
175+
add_decl_doc homeomorph.vadd
176+
177+
@[to_additive]
178+
lemma is_open_map_smul (c : G) : is_open_map (λ x : α, c • x) :=
179+
(homeomorph.smul c).is_open_map
180+
181+
@[to_additive] lemma is_open.smul {s : set α} (hs : is_open s) (c : G) : is_open (c • s) :=
182+
is_open_map_smul c s hs
183+
184+
@[to_additive]
185+
lemma is_closed_map_smul (c : G) : is_closed_map (λ x : α, c • x) :=
186+
(homeomorph.smul c).is_closed_map
187+
188+
@[to_additive] lemma is_closed.smul {s : set α} (hs : is_closed s) (c : G) : is_closed (c • s) :=
189+
is_closed_map_smul c s hs
190+
191+
end group
192+
193+
section group_with_zero
194+
195+
variables {G₀ : Type*} [topological_space α] [group_with_zero G₀] [mul_action G₀ α]
196+
[has_continuous_const_smul G₀ α]
197+
198+
lemma tendsto_const_smul_iff₀ {f : β → α} {l : filter β} {a : α} {c : G₀} (hc : c ≠ 0) :
199+
tendsto (λ x, c • f x) l (𝓝 $ c • a) ↔ tendsto f l (𝓝 a) :=
200+
tendsto_const_smul_iff (units.mk0 c hc)
201+
202+
variables [topological_space β] {f : β → α} {b : β} {c : G₀} {s : set β}
203+
204+
lemma continuous_within_at_const_smul_iff₀ (hc : c ≠ 0) :
205+
continuous_within_at (λ x, c • f x) s b ↔ continuous_within_at f s b :=
206+
tendsto_const_smul_iff (units.mk0 c hc)
207+
208+
lemma continuous_on_const_smul_iff₀ (hc : c ≠ 0) :
209+
continuous_on (λ x, c • f x) s ↔ continuous_on f s :=
210+
continuous_on_const_smul_iff (units.mk0 c hc)
211+
212+
lemma continuous_at_const_smul_iff₀ (hc : c ≠ 0) :
213+
continuous_at (λ x, c • f x) b ↔ continuous_at f b :=
214+
continuous_at_const_smul_iff (units.mk0 c hc)
215+
216+
lemma continuous_const_smul_iff₀ (hc : c ≠ 0) :
217+
continuous (λ x, c • f x) ↔ continuous f :=
218+
continuous_const_smul_iff (units.mk0 c hc)
219+
220+
/-- Scalar multiplication by a non-zero element of a group with zero acting on `α` is a
221+
homeomorphism from `α` onto itself. -/
222+
protected def homeomorph.smul_of_ne_zero (c : G₀) (hc : c ≠ 0) : α ≃ₜ α :=
223+
homeomorph.smul (units.mk0 c hc)
224+
225+
lemma is_open_map_smul₀ {c : G₀} (hc : c ≠ 0) : is_open_map (λ x : α, c • x) :=
226+
(homeomorph.smul_of_ne_zero c hc).is_open_map
227+
228+
lemma is_open.smul₀ {c : G₀} {s : set α} (hs : is_open s) (hc : c ≠ 0) : is_open (c • s) :=
229+
is_open_map_smul₀ hc s hs
230+
231+
lemma interior_smul₀ {c : G₀} (hc : c ≠ 0) (s : set α) : interior (c • s) = c • interior s :=
232+
((homeomorph.smul_of_ne_zero c hc).image_interior s).symm
233+
234+
/-- `smul` is a closed map in the second argument.
235+
236+
The lemma that `smul` is a closed map in the first argument (for a normed space over a complete
237+
normed field) is `is_closed_map_smul_left` in `analysis.normed_space.finite_dimension`. -/
238+
lemma is_closed_map_smul_of_ne_zero {c : G₀} (hc : c ≠ 0) : is_closed_map (λ x : α, c • x) :=
239+
(homeomorph.smul_of_ne_zero c hc).is_closed_map
240+
241+
/-- `smul` is a closed map in the second argument.
242+
243+
The lemma that `smul` is a closed map in the first argument (for a normed space over a complete
244+
normed field) is `is_closed_map_smul_left` in `analysis.normed_space.finite_dimension`. -/
245+
lemma is_closed_map_smul₀ {𝕜 M : Type*} [division_ring 𝕜] [add_comm_monoid M] [topological_space M]
246+
[t1_space M] [module 𝕜 M] [has_continuous_const_smul 𝕜 M] (c : 𝕜) :
247+
is_closed_map (λ x : M, c • x) :=
248+
begin
249+
rcases eq_or_ne c 0 with (rfl|hne),
250+
{ simp only [zero_smul], exact is_closed_map_const },
251+
{ exact (homeomorph.smul_of_ne_zero c hne).is_closed_map },
252+
end
253+
254+
end group_with_zero
255+
256+
namespace is_unit
257+
258+
variables [monoid M] [topological_space α] [mul_action M α] [has_continuous_const_smul M α]
259+
260+
lemma tendsto_const_smul_iff {f : β → α} {l : filter β} {a : α} {c : M} (hc : is_unit c) :
261+
tendsto (λ x, c • f x) l (𝓝 $ c • a) ↔ tendsto f l (𝓝 a) :=
262+
let ⟨u, hu⟩ := hc in hu ▸ tendsto_const_smul_iff u
263+
264+
variables [topological_space β] {f : β → α} {b : β} {c : M} {s : set β}
265+
266+
lemma continuous_within_at_const_smul_iff (hc : is_unit c) :
267+
continuous_within_at (λ x, c • f x) s b ↔ continuous_within_at f s b :=
268+
let ⟨u, hu⟩ := hc in hu ▸ continuous_within_at_const_smul_iff u
269+
270+
lemma continuous_on_const_smul_iff (hc : is_unit c) :
271+
continuous_on (λ x, c • f x) s ↔ continuous_on f s :=
272+
let ⟨u, hu⟩ := hc in hu ▸ continuous_on_const_smul_iff u
273+
274+
lemma continuous_at_const_smul_iff (hc : is_unit c) :
275+
continuous_at (λ x, c • f x) b ↔ continuous_at f b :=
276+
let ⟨u, hu⟩ := hc in hu ▸ continuous_at_const_smul_iff u
277+
278+
lemma continuous_const_smul_iff (hc : is_unit c) :
279+
continuous (λ x, c • f x) ↔ continuous f :=
280+
let ⟨u, hu⟩ := hc in hu ▸ continuous_const_smul_iff u
281+
282+
lemma is_open_map_smul (hc : is_unit c) : is_open_map (λ x : α, c • x) :=
283+
let ⟨u, hu⟩ := hc in hu ▸ is_open_map_smul u
284+
285+
lemma is_closed_map_smul (hc : is_unit c) : is_closed_map (λ x : α, c • x) :=
286+
let ⟨u, hu⟩ := hc in hu ▸ is_closed_map_smul u
287+
288+
end is_unit
289+
64290
/-- Class `properly_discontinuous_smul Γ T` says that the scalar multiplication `(•) : Γ → T → T`
65291
is properly discontinuous, that is, for any pair of compact sets `K, L` in `T`, only finitely many
66292
`γ:Γ` move `K` to have nontrivial intersection with `L`.
@@ -93,26 +319,6 @@ export properly_discontinuous_smul (finite_disjoint_inter_image)
93319

94320
export properly_discontinuous_vadd (finite_disjoint_inter_image)
95321

96-
/-- The homeomorphism given by scalar multiplication by a given element of a group `Γ` acting on
97-
`T` is a homeomorphism from `T` to itself. -/
98-
def homeomorph.smul {T : Type*} [topological_space T] {Γ : Type*} [group Γ]
99-
[mul_action Γ T] [has_continuous_const_smul Γ T] (γ : Γ) :
100-
T ≃ₜ T :=
101-
{ to_equiv := mul_action.to_perm_hom Γ T γ,
102-
continuous_to_fun := continuous_const_smul γ,
103-
continuous_inv_fun := continuous_const_smul γ⁻¹ }
104-
105-
/-- The homeomorphism given by affine-addition by an element of an additive group `Γ` acting on
106-
`T` is a homeomorphism from `T` to itself. -/
107-
def homeomorph.vadd {T : Type*} [topological_space T] {Γ : Type*} [add_group Γ]
108-
[add_action Γ T] [has_continuous_const_vadd Γ T] (γ : Γ) :
109-
T ≃ₜ T :=
110-
{ to_equiv := add_action.to_perm_hom T Γ γ,
111-
continuous_to_fun := continuous_const_vadd γ,
112-
continuous_inv_fun := continuous_const_vadd (-γ) }
113-
114-
attribute [to_additive homeomorph.vadd] homeomorph.smul
115-
116322
/-- The quotient map by a group action is open. -/
117323
@[to_additive]
118324
lemma is_open_map_quotient_mk_mul [has_continuous_const_smul Γ T] :

0 commit comments

Comments
 (0)