Skip to content

Commit aa0cf46

Browse files
committed
tidy up module topology file
1 parent 93f9ac0 commit aa0cf46

File tree

1 file changed

+97
-67
lines changed

1 file changed

+97
-67
lines changed

FLT/ForMathlib/module_topology.lean

+97-67
Original file line numberDiff line numberDiff line change
@@ -61,39 +61,36 @@ lemma isOpenMap_of_coinduced (φ : A →+ B) (hφc : Continuous φ)
6161
use x + k, hx
6262
rw [AddMonoidHom.map_add, hk, add_zero]
6363

64+
def LinearMap.neg (R : Type*) [Ring R] (A : Type*) [AddCommGroup A] [Module R A] : A →ₗ[R] A where
65+
toFun := (-·)
66+
map_add' := neg_add
67+
map_smul' r a := (smul_neg r a).symm
68+
6469
end elsewhere
6570

6671
section basics
6772

6873
variable (R : Type*) [TopologicalSpace R] [Ring R] [TopologicalRing R]
6974
variable (A : Type*) [AddCommMonoid A] [Module R A]
7075

71-
-- "smallest" (i.e. most open sets) topology on `A` such
72-
-- that all R-linear maps R^n → A are continuous
76+
/- The module topology on an `R`-module `M` is the finest topology
77+
which makes all `R`-linear maps `Rⁿ →ₗ[R] M` continuous.
78+
-/
7379
abbrev moduleTopology : TopologicalSpace A :=
7480
⨆ (n : ℕ), ⨆ (φ : (Fin n → R) →ₗ[R] A), .coinduced φ inferInstance
7581

82+
/-
83+
`IsModuleTopology R A` is a propositional typclass carrying around a proof that the topology
84+
on `A` is the `R`-module topology.-/
7685
class IsModuleTopology [τA : TopologicalSpace A] : Prop where
7786
isModuleTopology' : τA = moduleTopology R A
7887

7988
-- because default binders for isModuleTopology' are wrong and currently
80-
-- there is no way to change this. See lean4#...**TODO**
89+
-- there is no way to change this. There's a Lean 4 issue for this IIRC **TODO** where?
8190
lemma isModuleTopology [τA : TopologicalSpace A] [IsModuleTopology R A] :
8291
τA = moduleTopology R A :=
8392
IsModuleTopology.isModuleTopology' (R := R) (A := A)
8493

85-
-- **TODO** is this true?
86-
-- lemma ModuleTopology.continuousSMul : @ContinuousSMul R A _ _ (moduleTopology R A) :=
87-
-- continuousSMul_sInf <| fun _ _ ↦ by simp_all only [Set.mem_setOf_eq]
88-
89-
-- **TODO** follows from the above
90-
-- instance isModuleTopology_continuousSMul (R A : Type*) [SMul R A]
91-
-- [TopologicalSpace R] [τA : TopologicalSpace A] [h : IsModuleTopology R A] :
92-
-- ContinuousSMul R A where
93-
-- continuous_smul := by
94-
-- obtain ⟨h⟩ := ModuleTopology.continuousSMul R A
95-
-- simpa [isModuleTopology R A] using h
96-
9794
end basics
9895

9996
namespace ModuleTopology
@@ -102,34 +99,23 @@ section one
10299

103100
variable (R : Type*) [Ring R] [τ : TopologicalSpace R] [TopologicalRing R]
104101

105-
protected lemma id : IsModuleTopology R R := by
106-
constructor
107-
apply le_antisymm
108-
· refine le_iSup_of_le 1 ?_
109-
refine le_iSup_of_le (LinearMap.proj 0) (fun U hU ↦ ?_)
110-
rw [isOpen_coinduced] at hU
111-
exact Continuous.isOpen_preimage (f := fun r ↦ (fun _ ↦ r)) (by fun_prop) _ hU
112-
· apply iSup_le
113-
intro n
114-
apply iSup_le
115-
intro φ
116-
rw [← continuous_iff_coinduced_le]
117-
exact LinearMap.continuous_on_pi φ
102+
instance instId : IsModuleTopology R R where
103+
isModuleTopology' := le_antisymm (le_iSup_of_le 1 <| le_iSup_of_le (LinearMap.proj 0)
104+
(fun U hU ↦ Continuous.isOpen_preimage (f := fun r ↦ fun _ ↦ r) (by fun_prop) _
105+
(isOpen_coinduced.1 hU))) <|
106+
iSup_le fun _ ↦ iSup_le fun φ ↦ continuous_iff_coinduced_le.1 <| LinearMap.continuous_on_pi φ
118107

119-
instance pow (n : ℕ) : IsModuleTopology R (Fin n → R) := by
120-
constructor
121-
apply le_antisymm
122-
· refine le_iSup_of_le n ?_
123-
refine le_iSup_of_le (LinearMap.id) ?_
124-
intro U hU
125-
rw [isOpen_coinduced] at hU
126-
apply hU
127-
· apply iSup_le
128-
intro m
129-
apply iSup_le
130-
intro φ
131-
rw [← continuous_iff_coinduced_le]
132-
exact LinearMap.continuous_on_pi φ
108+
instance instPiNat (n : ℕ) : IsModuleTopology R (Fin n → R) where
109+
isModuleTopology' :=
110+
le_antisymm (le_iSup_of_le n <| le_iSup_of_le (LinearMap.id) <| by rfl) <|
111+
iSup_le fun _ ↦ iSup_le fun φ ↦ (LinearMap.continuous_on_pi φ).coinduced_le
112+
113+
instance instPiFinite (ι : Type*) [Finite ι] : IsModuleTopology R (ι → R) where
114+
isModuleTopology' :=
115+
le_antisymm (le_iSup_of_le (Nat.card ι) <| le_iSup_of_le
116+
(LinearMap.funLeft _ _ ((Finite.equivFin ι))) <| ge_of_eq <| Homeomorph.coinduced_eq
117+
(Homeomorph.piCongrLeft (Y := fun _ ↦ R) (Finite.equivFin ι)).symm) <|
118+
iSup_le fun _ ↦ iSup_le fun φ ↦ (LinearMap.continuous_on_pi φ).coinduced_le
133119

134120
end one
135121

@@ -139,19 +125,15 @@ variable {R : Type*} [τR : TopologicalSpace R] [Ring R]
139125
variable {A : Type*} [AddCommMonoid A] [Module R A] [aA : TopologicalSpace A] [IsModuleTopology R A]
140126
variable {B : Type*} [AddCommMonoid B] [Module R B] [aB : TopologicalSpace B] [IsModuleTopology R B]
141127

142-
variable {C : Type*} [AddCommGroup C] [Module R C]
143-
144128
/-- Every `A`-linear map between two `A`-modules with the canonical topology is continuous. -/
145129
@[continuity, fun_prop]
146130
lemma continuous_of_linearMap (f : A →ₗ[R] B) : Continuous f := by
147-
rw [isModuleTopology R A, continuous_iff_le_induced]
148-
apply iSup_le <| fun n ↦ ?_
149-
apply iSup_le <| fun φ ↦ ?_
150-
rw [isModuleTopology R B, ← coinduced_le_iff_le_induced, coinduced_compose]
151-
apply le_iSup_of_le n
152-
apply le_iSup_of_le (f.comp φ)
153-
rfl
131+
rw [isModuleTopology R A, isModuleTopology R B, continuous_iff_le_induced]
132+
apply iSup_le <| fun n ↦ iSup_le <| fun φ ↦ ?_
133+
rw [← coinduced_le_iff_le_induced, coinduced_compose]
134+
exact le_iSup_of_le n <| le_iSup_of_le (f.comp φ) le_rfl
154135

136+
-- should this be in the API?
155137
lemma continuous_of_linearMap' {A : Type*} [AddCommMonoid A] [Module R A]
156138
{B : Type*} [AddCommMonoid B] [Module R B] (f : A →ₗ[R] B) :
157139
@Continuous _ _ (moduleTopology R A) (moduleTopology R B) f := by
@@ -161,11 +143,15 @@ lemma continuous_of_linearMap' {A : Type*} [AddCommMonoid A] [Module R A]
161143
haveI : IsModuleTopology R B := ⟨rfl⟩
162144
fun_prop
163145

146+
def homeo_of_linearEquiv [IsModuleTopology R A] [IsModuleTopology R B] (f : A ≃ₗ[R] B) : A ≃ₜ B where
147+
toFun := f
148+
invFun := f.symm
149+
left_inv := LinearEquiv.symm_apply_apply f
150+
right_inv := LinearEquiv.apply_symm_apply f
151+
continuous_toFun := continuous_of_linearMap f.toLinearMap
152+
continuous_invFun := continuous_of_linearMap f.symm.toLinearMap
153+
164154
variable (R)
165-
def _root_.LinearMap.neg (A : Type*) [AddCommGroup A] [Module R A] : A →ₗ[R] A where
166-
toFun := (-·)
167-
map_add' := neg_add
168-
map_smul' r a := (smul_neg r a).symm
169155

170156
lemma continuous_neg (A : Type*) [AddCommGroup A] [Module R A] [TopologicalSpace A]
171157
[IsModuleTopology R A] :
@@ -185,27 +171,27 @@ lemma surj {n : ℕ} {φ : ((Fin n) → R) →ₗ[R] A} (hφ : Function.Surjecti
185171
· rw [← continuous_iff_coinduced_le]
186172
rw [← isModuleTopology R A]
187173
fun_prop
188-
· rw [iSup_le_iff]
189-
intro m
190-
rw [iSup_le_iff]
191-
intro ψ
174+
· apply iSup_le fun m ↦ iSup_le fun ψ ↦ ?_
192175
obtain ⟨α, rfl⟩ : ∃ α : (Fin m → R) →ₗ[R] (Fin n → R), φ.comp α = ψ :=
193176
Module.projective_lifting_property _ _ hφ
194-
change TopologicalSpace.coinduced (φ ∘ α) _ ≤ _
177+
push_cast
195178
rw [← coinduced_compose]
196179
apply coinduced_mono
197180
rw [← continuous_iff_coinduced_le]
198181
fun_prop
199182

183+
/-- Any surjection between finite R-modules is coinducing for the R-module topology. -/
200184
lemma supersurj {B : Type*} [AddCommMonoid B] [aB : TopologicalSpace B] [Module R B] [IsModuleTopology R B]
201185
[Module.Finite R A] {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
202186
TopologicalSpace.coinduced φ (moduleTopology R A) = moduleTopology R B := by
203187
obtain ⟨n, f, hf⟩ := Module.Finite.exists_fin' R A
204-
have hg : Function.Surjective (φ ∘ₗ f) := by aesop
205-
rw [← surj hg]
206-
convert coinduced_compose
207-
convert (surj hf).symm
188+
rw [← surj <| show Function.Surjective (φ ∘ₗ f) by aesop]
189+
push_cast
190+
rw [← coinduced_compose, surj hf]
191+
192+
-- nice spot to end a PR.
208193

194+
-- do I need this? Prove with supersurj
209195
-- **^TODO** why didn't have/let linter warn me
210196
lemma surj' {ι : Type*} [Finite ι] {φ : (ι → R) →ₗ[R] A} (hφ : Function.Surjective φ) :
211197
TopologicalSpace.coinduced φ Pi.topologicalSpace = moduleTopology R A := by
@@ -331,12 +317,12 @@ lemma prod [Module.Finite R A] [Module.Finite R B] :
331317
constructor
332318
apply le_antisymm
333319
· rw [← continuous_id_iff_le]
334-
have hid : @id (A × B) = (fun abcd ↦ abcd.1 + abcd.2) ∘ (fun ab ↦ ((ab.1, 0),(0, ab.2))) := by
320+
have hid : (id : A × B → A × B) = (fun abcd ↦ abcd.1 + abcd.2) ∘ (fun ab ↦ ((ab.1, 0),(0, ab.2))) := by
335321
ext ⟨a, b⟩ <;> simp
336322
rw [hid]
337323
apply @Continuous.comp (A × B) ((A × B) × (A × B)) (A × B) _
338-
(@instTopologicalSpaceProd _ _ (moduleTopology R _) (moduleTopology R _))
339-
(moduleTopology R _) _ _
324+
(@instTopologicalSpaceProd _ _ (moduleTopology R (A × B)) (moduleTopology R (A × B)))
325+
(moduleTopology R (A × B))
340326
· apply @continuous_add R _ _ _ (A × B) _ _ (moduleTopology R _) ?_
341327
convert IsModuleTopology.mk rfl
342328
· convert @Continuous.prod_map (A × B) (A × B) A B (moduleTopology R _) (moduleTopology R _)
@@ -426,6 +412,9 @@ lemma key : ((TensorProduct.map f g ∘ₗ
426412
-- ext ⟨m, n⟩
427413
-- simp
428414

415+
416+
-- I don't know whether finiteness is needed on `B` here. Removing it here would enable
417+
-- removal in `continuous_bilinear`.
429418
@[continuity, fun_prop]
430419
lemma Module.continuous_tprod [Module.Finite R A] [Module.Finite R B] :
431420
Continuous (fun (ab : A × B) ↦ ab.1 ⊗ₜ ab.2 : A × B → A ⊗[R] B) := by
@@ -494,11 +483,24 @@ lemma Module.continuous_tprod [Module.Finite R A] [Module.Finite R B] :
494483
· rw [continuous_iff_coinduced_le]
495484
rfl
496485

486+
-- did I really use finiteness of B?
497487
lemma Module.continuous_bilinear [Module.Finite R A] [Module.Finite R B]
498488
{C : Type*} [AddCommGroup C] [Module R C] [TopologicalSpace C] [IsModuleTopology R C]
499489
(bil : A →ₗ[R] B →ₗ[R] C) : Continuous (fun ab ↦ bil ab.1 ab.2 : (A × B → C)) := by
490+
letI : TopologicalSpace (A ⊗[R] B) := moduleTopology R _
491+
haveI : IsModuleTopology R (A ⊗[R] B) := ⟨rfl⟩
500492
change Continuous (TensorProduct.uncurry R A B C bil ∘ (fun (ab : A × B) ↦ ab.1 ⊗ₜ ab.2))
501493
fun_prop
494+
-- `fun_prop` unravels to
495+
-- -- set_option pp.explicit true in
496+
-- -- set_option pp.instances false in
497+
-- exact
498+
-- @Continuous.comp' (Prod A B) (@TensorProduct R _ A B _ _ _ _) C _ _ _
499+
-- (fun a ↦ (fun ab ↦ @TensorProduct.tmul R _ A B _ _ _ _ ab.1 ab.2) a)
500+
-- (fun a12 ↦ ((@TensorProduct.uncurry R _ A B C _ _ _ _ _ _) bil) a12)
501+
-- (@continuous_of_linearMap R _ _ (@TensorProduct R _ A B _ _ _ _) _ _ _ _ C _ _ _ _
502+
-- ((@TensorProduct.uncurry R _ A B C _ _ _ _ _ _) bil))
503+
-- (@continuous_tprod R _ _ _ A _ _ _ _ B _ _ _ _ _ _ _ _)
502504

503505
variable (R)
504506
variable (D : Type*) [Ring D] [Algebra R D] [Module.Finite R D]
@@ -518,4 +520,32 @@ def Module.topologicalRing : TopologicalRing D :=
518520

519521
end commutative
520522

523+
set_option linter.unusedTactic false
524+
525+
lemma continuousSMul (R : Type*) [CommRing R] [TopologicalSpace R] [TopologicalRing R]
526+
(A : Type*) [AddCommGroup A] [Module R A] [Module.Finite R A] [TopologicalSpace A]
527+
[IsModuleTopology R A] :
528+
ContinuousSMul R A := by
529+
exact ⟨Module.continuous_bilinear <| LinearMap.lsmul R A⟩
530+
521531
end ModuleTopology
532+
533+
/-
534+
535+
## Open problem
536+
537+
I can only prove that `SMul : R × A → A` is continuous for the module topology if `R` is
538+
commutative (because my proof uses tensor products) and if `A` is finite (because
539+
I reduce to a basis check ). Is it true in general
540+
541+
542+
lemma continuousSMul (R : Type*) [Ring R] [TopologicalSpace R] [TopologicalRing R]
543+
(A : Type*) [AddCommGroup A] [Module R A] : @ContinuousSMul R A _ _ (moduleTopology R A) := by
544+
refine @ContinuousSMul.mk ?_ ?_ ?_ ?_ ?_ ?_
545+
haveI : IsModuleTopology R R := inferInstance
546+
rw [isModuleTopology R R]
547+
refine Module.continuous_bilinear ?_
548+
sorry
549+
done
550+
end ModuleTopology
551+
-/

0 commit comments

Comments
 (0)