@@ -61,39 +61,36 @@ lemma isOpenMap_of_coinduced (φ : A →+ B) (hφc : Continuous φ)
61
61
use x + k, hx
62
62
rw [AddMonoidHom.map_add, hk, add_zero]
63
63
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
+
64
69
end elsewhere
65
70
66
71
section basics
67
72
68
73
variable (R : Type *) [TopologicalSpace R] [Ring R] [TopologicalRing R]
69
74
variable (A : Type *) [AddCommMonoid A] [Module R A]
70
75
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
+ -/
73
79
abbrev moduleTopology : TopologicalSpace A :=
74
80
⨆ (n : ℕ), ⨆ (φ : (Fin n → R) →ₗ[R] A), .coinduced φ inferInstance
75
81
82
+ /-
83
+ `IsModuleTopology R A` is a propositional typclass carrying around a proof that the topology
84
+ on `A` is the `R`-module topology.-/
76
85
class IsModuleTopology [τA : TopologicalSpace A] : Prop where
77
86
isModuleTopology' : τA = moduleTopology R A
78
87
79
88
-- 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?
81
90
lemma isModuleTopology [τA : TopologicalSpace A] [IsModuleTopology R A] :
82
91
τA = moduleTopology R A :=
83
92
IsModuleTopology.isModuleTopology' (R := R) (A := A)
84
93
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
-
97
94
end basics
98
95
99
96
namespace ModuleTopology
@@ -102,34 +99,23 @@ section one
102
99
103
100
variable (R : Type *) [Ring R] [τ : TopologicalSpace R] [TopologicalRing R]
104
101
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 φ
118
107
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
133
119
134
120
end one
135
121
@@ -139,19 +125,15 @@ variable {R : Type*} [τR : TopologicalSpace R] [Ring R]
139
125
variable {A : Type *} [AddCommMonoid A] [Module R A] [aA : TopologicalSpace A] [IsModuleTopology R A]
140
126
variable {B : Type *} [AddCommMonoid B] [Module R B] [aB : TopologicalSpace B] [IsModuleTopology R B]
141
127
142
- variable {C : Type *} [AddCommGroup C] [Module R C]
143
-
144
128
/-- Every `A`-linear map between two `A`-modules with the canonical topology is continuous. -/
145
129
@[continuity, fun_prop]
146
130
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
154
135
136
+ -- should this be in the API?
155
137
lemma continuous_of_linearMap' {A : Type *} [AddCommMonoid A] [Module R A]
156
138
{B : Type *} [AddCommMonoid B] [Module R B] (f : A →ₗ[R] B) :
157
139
@Continuous _ _ (moduleTopology R A) (moduleTopology R B) f := by
@@ -161,11 +143,15 @@ lemma continuous_of_linearMap' {A : Type*} [AddCommMonoid A] [Module R A]
161
143
haveI : IsModuleTopology R B := ⟨rfl⟩
162
144
fun_prop
163
145
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
+
164
154
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
169
155
170
156
lemma continuous_neg (A : Type *) [AddCommGroup A] [Module R A] [TopologicalSpace A]
171
157
[IsModuleTopology R A] :
@@ -185,27 +171,27 @@ lemma surj {n : ℕ} {φ : ((Fin n) → R) →ₗ[R] A} (hφ : Function.Surjecti
185
171
· rw [← continuous_iff_coinduced_le]
186
172
rw [← isModuleTopology R A]
187
173
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 ψ ↦ ?_
192
175
obtain ⟨α, rfl⟩ : ∃ α : (Fin m → R) →ₗ[R] (Fin n → R), φ.comp α = ψ :=
193
176
Module.projective_lifting_property _ _ hφ
194
- change TopologicalSpace.coinduced (φ ∘ α) _ ≤ _
177
+ push_cast
195
178
rw [← coinduced_compose]
196
179
apply coinduced_mono
197
180
rw [← continuous_iff_coinduced_le]
198
181
fun_prop
199
182
183
+ /-- Any surjection between finite R-modules is coinducing for the R-module topology. -/
200
184
lemma supersurj {B : Type *} [AddCommMonoid B] [aB : TopologicalSpace B] [Module R B] [IsModuleTopology R B]
201
185
[Module.Finite R A] {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
202
186
TopologicalSpace.coinduced φ (moduleTopology R A) = moduleTopology R B := by
203
187
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.
208
193
194
+ -- do I need this? Prove with supersurj
209
195
-- **^TODO** why didn't have/let linter warn me
210
196
lemma surj' {ι : Type *} [Finite ι] {φ : (ι → R) →ₗ[R] A} (hφ : Function.Surjective φ) :
211
197
TopologicalSpace.coinduced φ Pi.topologicalSpace = moduleTopology R A := by
@@ -331,12 +317,12 @@ lemma prod [Module.Finite R A] [Module.Finite R B] :
331
317
constructor
332
318
apply le_antisymm
333
319
· 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
335
321
ext ⟨a, b⟩ <;> simp
336
322
rw [hid]
337
323
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))
340
326
· apply @continuous_add R _ _ _ (A × B) _ _ (moduleTopology R _) ?_
341
327
convert IsModuleTopology.mk rfl
342
328
· convert @Continuous.prod_map (A × B) (A × B) A B (moduleTopology R _) (moduleTopology R _)
@@ -426,6 +412,9 @@ lemma key : ((TensorProduct.map f g ∘ₗ
426
412
-- ext ⟨m, n⟩
427
413
-- simp
428
414
415
+
416
+ -- I don't know whether finiteness is needed on `B` here. Removing it here would enable
417
+ -- removal in `continuous_bilinear`.
429
418
@[continuity, fun_prop]
430
419
lemma Module.continuous_tprod [Module.Finite R A] [Module.Finite R B] :
431
420
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] :
494
483
· rw [continuous_iff_coinduced_le]
495
484
rfl
496
485
486
+ -- did I really use finiteness of B?
497
487
lemma Module.continuous_bilinear [Module.Finite R A] [Module.Finite R B]
498
488
{C : Type *} [AddCommGroup C] [Module R C] [TopologicalSpace C] [IsModuleTopology R C]
499
489
(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⟩
500
492
change Continuous (TensorProduct.uncurry R A B C bil ∘ (fun (ab : A × B) ↦ ab.1 ⊗ₜ ab.2 ))
501
493
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 _ _ _ _ _ _ _ _)
502
504
503
505
variable (R)
504
506
variable (D : Type *) [Ring D] [Algebra R D] [Module.Finite R D]
@@ -518,4 +520,32 @@ def Module.topologicalRing : TopologicalRing D :=
518
520
519
521
end commutative
520
522
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
+
521
531
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