Skip to content

Commit a6ee732

Browse files
committed
Add more module docstring; tidy up
1 parent d28b3ab commit a6ee732

File tree

1 file changed

+88
-45
lines changed

1 file changed

+88
-45
lines changed

FLT/ForMathlib/ActionTopology.lean

+88-45
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,51 @@ and `+ : A × A → A` continuous (with all the products having the product topo
1515
1616
This topology was suggested by Will Sawin [here](https://mathoverflow.net/a/477763/1384).
1717
18+
## Mathematical details
19+
20+
I (buzzard) don't know of any reference for this other than Sawin's mathoverflow answer,
21+
so I expand some of the details here.
22+
23+
First note that there is a finest topology with this property! Indeed, topologies on a fixed
24+
type form a complete lattice (infinite infs and sups exist). So if `τ` is the Inf of all
25+
the topologies on `A` which make `+` and `•` continuous, then the claim is that `+` and `•`
26+
are still continuous for `τ`. To show `+ : A × A → A` is continuous we need to show that the
27+
pushforward of the product topology `τ × τ` along `+` is `≤ τ`, and because `τ` is an Inf it
28+
suffices to show that it's `≤ σ` for any `σ` on `A` which makes `+` and `•` continuous.
29+
However pushforward and products are monotone, so `τ × τ ≤ σ × σ`, and the pushforward of
30+
`σ × σ` is `≤ σ` because that's precisely the statement that `+` is continuous for `σ`.
31+
The proof for `•` is similar.
32+
33+
A *topological module* for a topological ring `R` is an `R`-module `A` such that `+` and `•`
34+
are continuous. A crucial observation is that if `M` is a topological module, if `A` is a module,
35+
and if `φ : A → M` is linear, then the pullback of `M`'s topology to `A` is a topology making `A`
36+
into a topological module. Let's for example check that `•` is continuous. If `U ⊆ A` is open
37+
then by definition of the pullback topology, `U = φ⁻¹(V)` for some open `V ⊆ M`, and
38+
now the pullback of `U` under `•` is just the pullback along the continuous map
39+
`id × φ : R × A → R × M` of the preimage of `V` under the continuous map `• : R × M → M`,
40+
so it's open. The proof for `+` is similar.
41+
42+
As a consequence of this, we see that all linear maps are automatically continuous for
43+
the action topology. Indeed the argument above shows that if `A → M` is linear then the action
44+
topology on `A` is `≤` the pullback of the action topology on `M` (because it's the inf of a set
45+
containing this topology) which is the definition of continuity.
46+
47+
We deduce that the action topology is a functor from the category of `R`-modules (`R` a topological
48+
ring) to the category of topological `R`-modules, and it is perhaps unsurprising that this is
49+
an adjoint to the forgetful functor. Indeed, if `A` is an `R`-module and `M` is
50+
a topological `R`-module, then the linear maps `A → M` are precisely the continuous linear maps
51+
from `A` with its action topology, to `M`, so the action topology is a left adjoint to the
52+
forgetful functor.
53+
54+
This file develops the theory of the action topology. We prove that the action topology on
55+
`R` as a module over itself is `R`'s original topology, that the action topology on a product
56+
of modules is the product of the action topologies, and that the action topology on a quotient
57+
module is the quotient topology.
58+
59+
If the module is
60+
1861
## TODO
62+
1963
Drop freeness from continuity of bilinear map claim; presumably only finiteness is needed,
2064
becuse of Sawin's observation that the quotient topology for a surjection of R-mods
2165
is the action topology.
@@ -216,28 +260,26 @@ instance prod : IsActionTopology R (M × N) := by
216260
constructor
217261
haveI : ContinuousAdd M := isActionTopology_continuousAdd R M
218262
haveI : ContinuousAdd N := isActionTopology_continuousAdd R N
219-
apply le_antisymm
220-
· rw [← continuous_id_iff_le]
221-
have foo : (id : M × N → M × N) =
222-
(fun abcd ↦ abcd.1 + abcd.2 : (M × N) × (M × N) → M × N) ∘
223-
(fun ab ↦ ((ab.1, 0),(0, ab.2))) := by
224-
ext ⟨a, b⟩ <;> simp
225-
rw [foo]
226-
obtain ⟨bar⟩ : @ContinuousAdd (M × N) (actionTopology R (M × N)) _ := ActionTopology.continuousAdd _ _
227-
refine @Continuous.comp _ _ _ (_) ((_ : TopologicalSpace ((M × N) × (M × N)))) (_) _ _ bar ?_
228-
apply (@continuous_prod_mk _ _ _ (_) (_) (_) _ _).2
229-
constructor
230-
· -- bleurgh, fighting typeclass inference all the time, which wants one "canonical"
231-
-- topology on e.g. M × N.
232-
refine @Continuous.comp _ _ _ (_) (_) (_) _ ((LinearMap.inl R M N)) ?_
233-
(continuous_fst : Continuous (Prod.fst : M × N → M))
234-
apply @continuous_of_linearMap _ _ _ _ _ _ _ _ _ _ _ (actionTopology _ _) (?_)
235-
exact @IsActionTopology.mk _ _ _ _ _ (_) rfl
236-
· refine @Continuous.comp _ _ _ (_) (_) (_) _ ((LinearMap.inr R M N)) ?_
237-
(continuous_snd : Continuous (Prod.snd : M × N → N))
238-
apply @continuous_of_linearMap _ _ _ _ _ _ _ _ _ _ _ (actionTopology _ _) (?_)
239-
exact @IsActionTopology.mk _ _ _ _ _ (_) rfl
240-
· exact sInf_le ⟨Prod.continuousSMul, Prod.continuousAdd⟩
263+
refine le_antisymm ?_ <| sInf_le ⟨Prod.continuousSMul, Prod.continuousAdd⟩
264+
rw [← continuous_id_iff_le]
265+
rw [show (id : M × N → M × N) =
266+
(fun abcd ↦ abcd.1 + abcd.2 : (M × N) × (M × N) → M × N) ∘
267+
(fun ab ↦ ((ab.1, 0),(0, ab.2))) by
268+
ext ⟨a, b⟩ <;> simp]
269+
-- The rest of the proof is a massive fight against typeclass inference, which is desperate
270+
-- to always put the product topology on M × N, when we sometimes want the action topology
271+
-- (they are equal, but that's exactly what we're proving so we can't assume it yet).
272+
-- This issue stops the standard continuity tactics from working.
273+
obtain ⟨this⟩ : @ContinuousAdd (M × N) (actionTopology R (M × N)) _ :=
274+
ActionTopology.continuousAdd _ _
275+
refine @Continuous.comp _ ((M × N) × (M × N)) _ (_) (_) (_) _ _ this ?_
276+
refine (@continuous_prod_mk _ _ _ (_) (_) (_) _ _).2 ⟨?_, ?_⟩
277+
· refine @Continuous.comp _ _ _ (_) (_) (_) _ ((LinearMap.inl R M N)) ?_ continuous_fst
278+
apply @continuous_of_linearMap _ _ _ _ _ _ _ _ _ _ _ (actionTopology _ _) (?_)
279+
exact @IsActionTopology.mk _ _ _ _ _ (_) rfl
280+
· refine @Continuous.comp _ _ _ (_) (_) (_) _ ((LinearMap.inr R M N)) ?_ continuous_snd
281+
apply @continuous_of_linearMap _ _ _ _ _ _ _ _ _ _ _ (actionTopology _ _) (?_)
282+
exact @IsActionTopology.mk _ _ _ _ _ (_) rfl
241283

242284
end prod
243285

@@ -261,30 +303,26 @@ variable {ι : Type*} [Finite ι] {A : ι → Type*} [∀ i, AddCommGroup (A i)]
261303

262304
instance pi : IsActionTopology R (∀ i, A i) := by
263305
induction ι using Finite.induction_empty_option
264-
· case of_equiv X Y e hind _ _ _ _ =>
265-
specialize hind (A := fun x ↦ A (e x))
266-
apply iso (R := R) (A := ∀ j, A (e j)) (B := ∀ i, A i)
267-
(Homeomorph.piCongrLeft e) (by exact LinearEquiv.piCongrLeft R A e)
268-
aesop
306+
· case of_equiv X Y e _ _ _ _ _ =>
307+
exact iso (Homeomorph.piCongrLeft e) (LinearEquiv.piCongrLeft R A e) (fun _ ↦ rfl)
269308
· apply subsingleton
270309
· case h_option X _ hind _ _ _ _ =>
271-
specialize hind (A := fun x ↦ A (some x))
272310
let e : Option X ≃ X ⊕ Unit := Equiv.optionEquivSumPUnit X
273311
refine @iso (ehomeo := Homeomorph.piCongrLeft e.symm)
274312
(elinear := LinearEquiv.piCongrLeft R A e.symm) _ (fun f ↦ rfl) ?_
275313
apply @iso (ehomeo := (Homeomorph.sumPiEquivProdPi X Unit _).symm)
276314
(elinear := (LinearEquiv.sumPiEquivProdPi R X Unit _).symm) _ (fun f ↦ rfl) ?_
277315
refine @prod _ _ _ _ _ _ (_) (hind) _ _ _ (_) (?_)
278316
let φ : Unit → Option X := fun t ↦ e.symm (Sum.inr t)
279-
let f : (∀ t, A (φ t)) ≃ₜ A (φ ()) := Homeomorph.pUnitPiEquiv _
280-
let g : (∀ t, A (φ t)) ≃ₗ[R] A (φ ()) := LinearEquiv.pUnitPiEquiv R _
281-
exact iso f.symm g.symm (fun a ↦ rfl)
317+
exact iso (Homeomorph.pUnitPiEquiv (fun t ↦ A (φ t))).symm
318+
(LinearEquiv.pUnitPiEquiv R (fun t ↦ A (φ t))).symm (fun a ↦ rfl)
282319

283320
end Pi
284321

285322
section bilinear
286323

287-
-- I need these because ` ChooseBasisIndex.fintype` needs a ring instead of a semiring
324+
-- I need rings not semirings here, because ` ChooseBasisIndex.fintype` incorrectly(?) needs
325+
-- a ring instead of a semiring
288326
variable {R : Type*} [τR : TopologicalSpace R] [CommRing R] [TopologicalRing R]
289327

290328
-- similarly these don't need to be groups
@@ -295,32 +333,38 @@ variable {C : Type*} [AddCommGroup C] [Module R C] [aC : TopologicalSpace C] [Is
295333
lemma Module.continuous_bilinear_of_pi_finite (ι : Type*) [Finite ι]
296334
(bil : (ι → R) →ₗ[R] B →ₗ[R] C) : Continuous (fun ab ↦ bil ab.1 ab.2 : ((ι → R) × B → C)) := by
297335
classical
298-
have foo : (fun fb ↦ bil fb.1 fb.2 : ((ι → R) × B → C)) = (fun fb ↦ ∑ᶠ i, ((fb.1 i) • (bil (Pi.single i 1) fb.2) : C)) := by
336+
have foo : (fun fb ↦ bil fb.1 fb.2 : ((ι → R) × B → C)) =
337+
(fun fb ↦ ∑ᶠ i, ((fb.1 i) • (bil (Pi.single i 1) fb.2) : C)) := by
299338
ext ⟨f, b⟩
300339
simp_rw [← LinearMap.smul_apply]
301340
rw [← LinearMap.finsum_apply]
302341
congr
303-
simp_rw [LinearMap.smul_apply]
304-
simp_rw [← LinearMap.map_smul]
305-
--rw [LinearMap.finsum_apply]
342+
simp_rw [LinearMap.smul_apply, ← LinearMap.map_smul]
306343
convert AddMonoidHom.map_finsum bil.toAddMonoidHom _
307-
·
308-
ext j
344+
· ext j
309345
simp_rw [← Pi.single_smul, smul_eq_mul, mul_one]
310346
symm
347+
-- Is there a missing delaborator? No ∑ᶠ notation
311348
change (∑ᶠ (i : ι), Pi.single i (f i)) j = f j
349+
-- last tactic has no effect
312350
rw [finsum_apply]
313-
convert finsum_eq_single (fun i ↦ Pi.single i (f i) j) j _ using 1
314-
· simp
315-
· aesop
316-
· exact Set.toFinite _--(Function.support fun x ↦ f x • Pi.single x 1)
351+
convert finsum_eq_single (fun i ↦ Pi.single i (f i) j) j
352+
(by simp (config := {contextual := true})) using 1
353+
simp
354+
· apply Set.toFinite _--(Function.support fun x ↦ f x • Pi.single x 1)
317355
rw [foo]
318356
haveI : ContinuousAdd C := isActionTopology_continuousAdd R C
319357
apply continuous_finsum (fun i ↦ by fun_prop)
320358
intro x
321359
use Set.univ
322360
simp [Set.toFinite _]
323361

362+
-- Probably this can be beefed up in two distinct ways:
363+
-- Firstly, as it stands the lemma should be provable for semirings.
364+
-- Secind, we should be able to drop Module.Free in the ring case, change elinear.symm
365+
-- into a
366+
-- surjection not a bijection, and then use that quotients coinduce the action
367+
-- topology for groups (proved later, but not using this)
324368
lemma Module.continuous_bilinear_of_finite_free [Module.Finite R A] [Module.Free R A]
325369
(bil : A →ₗ[R] B →ₗ[R] C) : Continuous (fun ab ↦ bil ab.1 ab.2 : (A × B → C)) := by
326370
let ι := Module.Free.ChooseBasisIndex R A
@@ -362,14 +406,13 @@ def Module.topologicalRing : TopologicalRing D where
362406

363407
end algebra
364408

365-
-- everything from here on is dead code and ideas which use other topologies
366409
section topology_problem
367410

368411
variable {R : Type*} [τR : TopologicalSpace R] [Ring R] [TopologicalRing R]
369412
variable {A : Type*} [AddCommGroup A] [Module R A] [aA : TopologicalSpace A] [IsActionTopology R A]
370413
variable {B : Type*} [AddCommGroup B] [Module R B] [aB : TopologicalSpace B] [IsActionTopology R B]
371414

372-
-- Here I need the lemma about how quotients are open so I need groups
415+
-- Here I need the lemma about how quotients are open so I do need groups
373416
-- because this relies on translates of an open being open
374417
lemma coinduced_of_surjective {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
375418
TopologicalSpace.coinduced φ (actionTopology R A) = actionTopology R B := by
@@ -418,7 +461,7 @@ lemma coinduced_of_surjective {φ : A →ₗ[R] B} (hφ : Function.Surjective φ
418461
· apply @Continuous.prod_map _ _ _ _ (_) (_) (_) (_) <;>
419462
· rw [continuous_iff_coinduced_le, isActionTopology R A]; rfl
420463
· rw [← isActionTopology R A]
421-
exact coinduced_prod_eq_prod_coinduced (φ.toAddMonoidHom : A →+ B) φ.toAddMonoidHom hφ hφ
464+
exact coinduced_prod_eq_prod_coinduced φ φ hφ hφ
422465

423466

424467
end topology_problem

0 commit comments

Comments
 (0)