|
1 | 1 | import Mathlib.RingTheory.TensorProduct.Basic -- we need tensor products of rings at some point
|
2 | 2 | import Mathlib.Topology.Algebra.Module.Basic -- and we need topological rings and modules
|
3 |
| -import Mathlib.Tactic |
| 3 | +import Mathlib |
4 | 4 |
|
5 | 5 | /-
|
6 | 6 |
|
@@ -36,100 +36,123 @@ functions from `M` (now considered only as an index set, so with no topology) to
|
36 | 36 | -/
|
37 | 37 |
|
38 | 38 | section noncommutative
|
39 |
| --- Let A be a ring, with a compatible topology. |
40 |
| -variable (A : Type*) [Ring A] [TopologicalSpace A] [TopologicalRing A] |
41 | 39 |
|
| 40 | +class IsActionTopology (R M : Type*) [SMul R M] |
| 41 | + [τR : TopologicalSpace R] [τM : TopologicalSpace M] : Prop where |
| 42 | + isActionTopology' : τM = ⨆ m, .coinduced (· • m) τR |
42 | 43 |
|
43 |
| -/-- The "right topology" on a module `M` over a topological ring `A`. It's defined as |
44 |
| -the finest topology on `M` which makes every `A`-linear map `A → M` continuous. It's called |
45 |
| -the "right topology" because `M` goes on the right. -/ |
46 |
| -abbrev Module.rtopology (M : Type*) [AddCommGroup M] [Module A M]: TopologicalSpace M := |
47 |
| --- Topology defined as LUB of pushforward. |
48 |
| - ⨆ (f : A →ₗ[A] M), TopologicalSpace.coinduced f inferInstance |
| 44 | +-- just to make R and M explicit |
| 45 | +def isActionTopology (R M : Type*) [SMul R M] |
| 46 | + [TopologicalSpace R] [TopologicalSpace M] [IsActionTopology R M ]:= |
| 47 | + IsActionTopology.isActionTopology' (R := R) (M := M) |
| 48 | + |
| 49 | +def ActionTopology (R M : Type*) [SMul R M] [TopologicalSpace R] : |
| 50 | + TopologicalSpace M := ⨆ m, .coinduced (· • m) (inferInstance : TopologicalSpace R) |
| 51 | + |
| 52 | +namespace ActionTopology |
| 53 | +namespace type_stuff |
| 54 | + |
| 55 | +variable {R : Type} [τR : TopologicalSpace R] |
| 56 | + |
| 57 | +-- let `M` and `N` have an action of `R` |
| 58 | +variable {M : Type*} [SMul R M] [τM : TopologicalSpace M] [IsActionTopology R M] |
| 59 | +variable {N : Type*} [SMul R N] [τN : TopologicalSpace N] [IsActionTopology R N] |
| 60 | + |
| 61 | +example (L) [CompleteLattice L] (f : M → N) (g : N → L) : ⨆ m, g (f m) ≤ ⨆ n, g n := by |
| 62 | + exact iSup_comp_le g f |
| 63 | + |
| 64 | +theorem map_smul_pointfree (f : M →[R] N) (r : R) : (fun m ↦ f (r • m)) = fun m ↦ r • f m := |
| 65 | + by ext; apply map_smul |
49 | 66 |
|
50 |
| --- let `M` and `N` be `A`-modules |
51 |
| -variable (M : Type*) [AddCommGroup M] [Module A M] |
52 |
| -variable {N : Type*} [AddCommGroup N] [Module A N] |
53 | 67 |
|
54 | 68 | /-- Every `A`-linear map between two `A`-modules with the canonical topology is continuous. -/
|
55 |
| -lemma Module.continuous_linear (e : M →ₗ[A] N) : |
56 |
| - @Continuous M N (Module.rtopology A M) (Module.rtopology A N) e := by |
57 |
| - sorry -- maybe some appropriate analogue of Hannah/Lugwig's proof will work? |
| 69 | +lemma continuous_of_mulActionHom (e : M →[R] N) : Continuous e := by |
| 70 | + -- Let's turn this question into an inequality question about coinduced topologies |
| 71 | + rw [continuous_iff_coinduced_le] |
| 72 | + -- Now let's use the fact that τM and τN are action topologies (hence also coinduced) |
| 73 | + rw [isActionTopology R M, isActionTopology R N] |
| 74 | + -- There's an already-proven lemma in mathlib that says that coinducing an `iSup` is the |
| 75 | + -- same thing as taking the `iSup`s of the coinduced topologies |
| 76 | + -- composite of the coinduced topologies is just topology coinduced by the composite |
| 77 | + rw [coinduced_iSup] |
| 78 | + simp_rw [coinduced_compose] |
| 79 | + -- restate the current state of the question with better variables |
| 80 | + change ⨆ m, TopologicalSpace.coinduced (fun r ↦ e (r • m)) τR ≤ |
| 81 | + ⨆ n, TopologicalSpace.coinduced (fun x ↦ x • n) τR |
| 82 | + -- use the fact that `e (r • m) = r • (e m)` |
| 83 | + simp_rw [map_smul] |
| 84 | + -- and now the goal follows from the fact that the sup over a small set is ≤ the sup |
| 85 | + -- over a big set |
| 86 | + apply iSup_comp_le (_ : N → TopologicalSpace N) |
58 | 87 |
|
59 | 88 | -- A formal corollary should be that
|
60 |
| -def Module.homeomorphism_equiv (e : M ≃ₗ[A] N) : |
61 |
| - -- lean needs to be told the topologies explicitly in the statement |
62 |
| - let τM := Module.rtopology A M |
63 |
| - let τN := Module.rtopology A N |
64 |
| - M ≃ₜ N := |
65 |
| - -- And also at the point where lean puts the structure together, unfortunately |
66 |
| - let τM := Module.rtopology A M |
67 |
| - let τN := Module.rtopology A N |
68 |
| - -- all the sorries should be formal. |
69 |
| - { toFun := e |
70 |
| - invFun := e.symm |
71 |
| - left_inv := sorry |
72 |
| - right_inv := sorry |
| 89 | +def homeomorph_of_mulActionEquiv (φ : M →[R] N) (ψ : N →[R] M) (h1 : ∀ m, ψ (φ m) = m) |
| 90 | + (h2 : ∀ n, φ (ψ n) = n) : M ≃ₜ N := |
| 91 | + { toFun := φ |
| 92 | + invFun := ψ |
| 93 | + left_inv := h1 |
| 94 | + right_inv := h2 |
73 | 95 | continuous_toFun := sorry
|
74 | 96 | continuous_invFun := sorry
|
75 | 97 | }
|
76 | 98 |
|
| 99 | +-- this is definitely true |
| 100 | +lemma unit : (inferInstance : TopologicalSpace Unit) = ActionTopology R Unit := by |
| 101 | + sorry |
77 | 102 |
|
78 |
| --- claim: topology on the 1-point set is the canonical one |
79 |
| -example : (inferInstance : TopologicalSpace Unit) = Module.rtopology A Unit := by |
| 103 | +-- is this true? |
| 104 | +lemma prod : (inferInstance : TopologicalSpace (M × N)) = ActionTopology R (M × N) := by |
80 | 105 | sorry
|
81 | 106 |
|
82 |
| --- Anything from this point on *might* need commutative. |
83 |
| --- Just move it to the commutative section and prove it there. |
| 107 | +-- is this true? If not, is it true if ι is finite? |
| 108 | +lemma pi {ι : Type*} {M : ι → Type*} [∀ i, SMul R (M i)] [τM : ∀ i, TopologicalSpace (M i)] |
| 109 | + [∀ i, IsActionTopology R (M i)] : |
| 110 | + (inferInstance : TopologicalSpace (∀ i, M i)) = ActionTopology R (∀ i, M i) := by |
| 111 | + sorry |
84 | 112 |
|
85 |
| --- Claim: topology on A doesn't change |
86 |
| -example : (inferInstance : TopologicalSpace A) = Module.rtopology A A := by |
| 113 | +-- is this true? If not, is it true if ι is finite? |
| 114 | +lemma sigma {ι : Type*} {M : ι → Type*} [∀ i, SMul R (M i)] [τM : ∀ i, TopologicalSpace (M i)] |
| 115 | + [∀ i, IsActionTopology R (M i)] : |
| 116 | + (inferInstance : TopologicalSpace (Σ i, M i)) = ActionTopology R (Σ i, M i) := by |
87 | 117 | sorry
|
88 | 118 |
|
89 |
| -example : |
90 |
| - let _τM : TopologicalSpace M := Module.rtopology A M |
91 |
| - let _τN : TopologicalSpace N := Module.rtopology A N |
92 |
| - (inferInstance : TopologicalSpace (M × N)) = Module.rtopology A (M × N) := by sorry |
| 119 | +end type_stuff |
| 120 | + |
| 121 | +section R_is_M_stuff |
93 | 122 |
|
94 |
| -example : |
95 |
| - let _τM : TopologicalSpace M := Module.rtopology A M |
96 |
| - let _τN : TopologicalSpace N := Module.rtopology A N |
97 |
| - (inferInstance : TopologicalSpace (M × N)) = Module.rtopology A (M × N) := by sorry |
| 123 | +variable {R : Type} [τR : TopologicalSpace R] [Monoid R] |
98 | 124 |
|
99 |
| -example (ι : Type*) : |
100 |
| - let _τM : TopologicalSpace M := Module.rtopology A M |
101 |
| - (inferInstance : TopologicalSpace (ι → M)) = Module.rtopology A (ι → M) := by sorry |
| 125 | +-- is this true? Do we need that R is commutative? Does it work if R is a only semigroup? |
| 126 | +example : (inferInstance : TopologicalSpace R) = ActionTopology R R := by |
| 127 | + sorry |
102 | 128 |
|
103 |
| -end noncommutative |
| 129 | +end R_is_M_stuff |
104 | 130 |
|
105 |
| -section commutative |
| 131 | +section what_i_want |
106 | 132 |
|
107 | 133 | -- Let A be a commutative ring, with a compatible topology.
|
108 | 134 | variable (A : Type*) [CommRing A] [TopologicalSpace A] [TopologicalRing A]
|
109 | 135 | -- let `M` and `N` be `A`-modules
|
110 |
| -variable (M : Type*) [AddCommGroup M] [Module A M] |
111 |
| -variable {N : Type*} [AddCommGroup N] [Module A N] |
| 136 | +variable (M : Type*) [AddCommGroup M] [Module A M] [TopologicalSpace M] [TopologicalAddGroup M] [IsActionTopology A M] |
| 137 | +variable {N : Type*} [AddCommGroup N] [Module A N] [TopologicalSpace N] [TopologicalAddGroup N] [IsActionTopology A N] |
| 138 | +-- Remark: A needs to be commutative so that I get an A-action on M ⊗ N. |
112 | 139 |
|
| 140 | +-- What generality is this true in? I only need it when M and N are finite and free |
113 | 141 | open scoped TensorProduct
|
114 |
| -lemma Module.continuous_bilinear : |
115 |
| - let _τM : TopologicalSpace M := Module.rtopology A _ |
116 |
| - let _τN : TopologicalSpace N := Module.rtopology A _ |
117 |
| - let _τMN : TopologicalSpace (M ⊗[A] N) := Module.rtopology A _ |
| 142 | +lemma continuous_of_bilinear : |
| 143 | + letI : TopologicalSpace (M ⊗[A] N) := ActionTopology A (M ⊗[A] N) |
118 | 144 | Continuous (fun (mn : M × N) ↦ mn.1 ⊗ₜ mn.2 : M × N → M ⊗[A] N) := by sorry
|
119 | 145 |
|
120 | 146 | -- Now say we have a (not necessarily commutative) `A`-algebra `D` which is free of finite type.
|
121 |
| - |
122 | 147 | -- are all these assumptions needed?
|
123 |
| -variable (D : Type*) [Ring D] [Algebra A D] [Module.Finite A D] [Module.Free A D] |
124 |
| - |
125 |
| -instance Module.topologicalRing : @TopologicalRing D (Module.rtopology A D) _ := |
126 |
| - let _ : TopologicalSpace D := Module.rtopology A D |
127 |
| - { |
128 |
| - continuous_add := by |
129 |
| - sorry |
130 |
| - continuous_mul := by |
131 |
| - sorry |
132 |
| - continuous_neg := by |
133 |
| - sorry } |
134 |
| - |
135 |
| -end commutative |
| 148 | +variable (D : Type*) [Ring D] [Algebra A D] [Module.Finite A D] [Module.Free A D] [TopologicalSpace D] [IsActionTopology A D] |
| 149 | + |
| 150 | +theorem needed_for_FLT : TopologicalRing D where |
| 151 | + continuous_add := sorry |
| 152 | + continuous_mul := sorry |
| 153 | + continuous_neg := sorry |
| 154 | + |
| 155 | +end what_i_want |
| 156 | + |
| 157 | +-- possible hints at https://github.com/ImperialCollegeLondon/FLT/blob/main/FLT/HIMExperiments/module_topology.lean |
| 158 | +-- except there the topology is *different* so the work does not apply |
0 commit comments