Skip to content

Commit b2c3a0e

Browse files
authored
Merge branch 'main' into bump
2 parents 42e570b + 01cae52 commit b2c3a0e

File tree

1 file changed

+121
-80
lines changed

1 file changed

+121
-80
lines changed

FLT/ForMathlib/ActionTopology.lean

+121-80
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,67 @@ lemma continuous_neg (C : Type*) [AddCommGroup C] [Module R C] [TopologicalSpace
252252

253253
end function
254254

255+
section surjection
256+
257+
variable {R : Type*} [τR : TopologicalSpace R] [Ring R] [TopologicalRing R]
258+
variable {A : Type*} [AddCommGroup A] [Module R A] [aA : TopologicalSpace A] [IsActionTopology R A]
259+
variable {B : Type*} [AddCommGroup B] [Module R B] [aB : TopologicalSpace B] [IsActionTopology R B]
260+
261+
-- Here I need the lemma about how quotients are open so I do need groups
262+
-- because this relies on translates of an open being open
263+
lemma coinduced_of_surjective {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
264+
TopologicalSpace.coinduced φ (actionTopology R A) = actionTopology R B := by
265+
have : Continuous φ := continuous_of_linearMap φ
266+
rw [continuous_iff_coinduced_le, isActionTopology R A, isActionTopology R B] at this
267+
apply le_antisymm this
268+
have : ContinuousAdd A := isActionTopology_continuousAdd R A
269+
refine sInf_le ⟨?_, ?_⟩
270+
· apply @ContinuousSMul.mk R B _ _ (_)
271+
obtain ⟨foo⟩ : ContinuousSMul R A := inferInstance
272+
rw [continuous_def] at foo ⊢
273+
intro U hU
274+
rw [isOpen_coinduced, ← isActionTopology R A] at hU
275+
specialize foo _ hU; clear hU
276+
rw [← Set.preimage_comp, show φ ∘ (fun p ↦ p.1 • p.2 : R × A → A) =
277+
(fun p ↦ p.1 • p.2 : R × B → B) ∘
278+
(Prod.map id ⇑φ.toAddMonoidHom) by ext; simp, Set.preimage_comp] at foo
279+
clear! aB -- easiest to just remove topology on B completely now so typeclass inference
280+
-- never sees it
281+
convert isOpenMap_of_coinduced (AddMonoidHom.prodMap (AddMonoidHom.id R) φ.toAddMonoidHom)
282+
(_) (_) (_) foo
283+
· -- aesop would do this if `Function.surjective_id : Surjective ⇑(AddMonoidHom.id R)`
284+
-- was known by it
285+
apply (Set.image_preimage_eq _ _).symm
286+
rw [AddMonoidHom.coe_prodMap, Prod.map_surjective]
287+
exact ⟨Function.surjective_id, by simp_all⟩
288+
· -- should `apply continuousprodmap ctrl-space` find `Continuous.prod_map`?
289+
apply @Continuous.prod_map _ _ _ _ (_) (_) (_) (_) id φ continuous_id
290+
rw [continuous_iff_coinduced_le, isActionTopology R A]
291+
· rw [← isActionTopology R A]
292+
exact coinduced_prod_eq_prod_coinduced (AddMonoidHom.id R) φ.toAddMonoidHom
293+
(Function.surjective_id) hφ
294+
· apply @ContinuousAdd.mk _ (_)
295+
obtain ⟨bar⟩ := isActionTopology_continuousAdd R A
296+
rw [continuous_def] at bar ⊢
297+
intro U hU
298+
rw [isOpen_coinduced, ← isActionTopology R A] at hU
299+
specialize bar _ hU; clear hU
300+
rw [← Set.preimage_comp, show φ ∘ (fun p ↦ p.1 + p.2 : A × A → A) =
301+
(fun p ↦ p.1 + p.2 : B × B → B) ∘
302+
(Prod.map ⇑φ.toAddMonoidHom ⇑φ.toAddMonoidHom) by ext; simp, Set.preimage_comp] at bar
303+
clear! aB -- easiest to just remove topology on B completely now
304+
convert isOpenMap_of_coinduced (AddMonoidHom.prodMap φ.toAddMonoidHom φ.toAddMonoidHom)
305+
(_) (_) (_) bar
306+
· aesop
307+
· apply @Continuous.prod_map _ _ _ _ (_) (_) (_) (_) <;>
308+
· rw [continuous_iff_coinduced_le, isActionTopology R A]; rfl
309+
· rw [← isActionTopology R A]
310+
exact coinduced_prod_eq_prod_coinduced φ φ hφ hφ
311+
312+
313+
end surjection
314+
315+
255316
section prod
256317

257318
variable {R : Type*} [TopologicalSpace R] [Semiring R] [TopologicalSemiring R]
@@ -291,16 +352,6 @@ section Pi
291352

292353
variable {R : Type*} [τR : TopologicalSpace R] [Semiring R] [TopologicalSemiring R]
293354

294-
-- not sure I'm going to do it this way -- see `pi` below.
295-
-- instance piNat (n : ℕ) {A : Fin n → Type*} [∀ i, AddCommGroup (A i)]
296-
-- [∀ i, Module R (A i)] [∀ i, TopologicalSpace (A i)]
297-
-- [∀ i, IsActionTopology R (A i)]: IsActionTopology R (Π i, A i) := by
298-
-- induction n
299-
-- · infer_instance
300-
-- · case succ n IH _ _ _ _ =>
301-
-- specialize IH (A := fun i => A (Fin.castSucc i))
302-
-- sorry
303-
304355
variable {ι : Type*} [Finite ι] {A : ι → Type*} [∀ i, AddCommGroup (A i)]
305356
[∀ i, Module R (A i)] [∀ i, TopologicalSpace (A i)]
306357
[∀ i, IsActionTopology R (A i)]
@@ -324,10 +375,10 @@ instance pi : IsActionTopology R (∀ i, A i) := by
324375

325376
end Pi
326377

327-
section bilinear
378+
section semiring_bilinear
328379

329380
-- I need rings not semirings here, because ` ChooseBasisIndex.fintype` incorrectly(?) needs
330-
-- a ring instead of a semiring
381+
-- a ring instead of a semiring. This should be fixed.
331382
variable {R : Type*} [τR : TopologicalSpace R] [CommRing R] [TopologicalRing R]
332383

333384
-- similarly these don't need to be groups
@@ -364,12 +415,7 @@ lemma Module.continuous_bilinear_of_pi_finite (ι : Type*) [Finite ι]
364415
use Set.univ
365416
simp [Set.toFinite _]
366417

367-
-- Probably this can be beefed up in two distinct ways:
368-
-- Firstly, as it stands the lemma should be provable for semirings.
369-
-- Secind, we should be able to drop Module.Free in the ring case, change elinear.symm
370-
-- into a
371-
-- surjection not a bijection, and then use that quotients coinduce the action
372-
-- topology for groups (proved later, but not using this)
418+
-- Probably this can be beefed up to semirings.
373419
lemma Module.continuous_bilinear_of_finite_free [Module.Finite R A] [Module.Free R A]
374420
(bil : A →ₗ[R] B →ₗ[R] C) : Continuous (fun ab ↦ bil ab.1 ab.2 : (A × B → C)) := by
375421
let ι := Module.Free.ChooseBasisIndex R A
@@ -387,9 +433,42 @@ lemma Module.continuous_bilinear_of_finite_free [Module.Finite R A] [Module.Free
387433
· exact continuous_of_linearMap (elinear.toLinearMap ∘ₗ (LinearMap.fst R A B))
388434
· fun_prop
389435

390-
end bilinear
436+
end semiring_bilinear
437+
438+
section ring_bilinear
439+
440+
variable {R : Type*} [τR : TopologicalSpace R] [CommRing R] [TopologicalRing R]
441+
442+
variable {A : Type*} [AddCommGroup A] [Module R A] [aA : TopologicalSpace A] [IsActionTopology R A]
443+
variable {B : Type*} [AddCommGroup B] [Module R B] [aB : TopologicalSpace B] [IsActionTopology R B]
444+
variable {C : Type*} [AddCommGroup C] [Module R C] [aC : TopologicalSpace C] [IsActionTopology R C]
445+
446+
-- This needs rings though
447+
lemma Module.continuous_bilinear_of_finite [Module.Finite R A]
448+
(bil : A →ₗ[R] B →ₗ[R] C) : Continuous (fun ab ↦ bil ab.1 ab.2 : (A × B → C)) := by
449+
obtain ⟨m, f, hf⟩ := Module.Finite.exists_fin' R A
450+
let bil' : (Fin m → R) →ₗ[R] B →ₗ[R] C := bil.comp f
451+
have := Module.continuous_bilinear_of_pi_finite (Fin m) bil'
452+
let φ := f.prodMap (LinearMap.id : B →ₗ[R] B)
453+
have foo : Function.Surjective (LinearMap.id : B →ₗ[R] B) :=
454+
Function.RightInverse.surjective (congrFun rfl)
455+
have hφ : Function.Surjective φ := Function.Surjective.prodMap hf foo
456+
have := coinduced_of_surjective hφ
457+
rw [isActionTopology R (A × B), ← this, continuous_def]
458+
intro U hU
459+
rw [isOpen_coinduced, ← Set.preimage_comp]
460+
suffices Continuous ((fun ab ↦ (bil ab.1) ab.2) ∘ φ : (Fin m → R) × B → C) by
461+
rw [continuous_def] at this
462+
convert this _ hU
463+
rw [← prod.isActionTopology']
464+
rw [show (fun ab ↦ (bil ab.1) ab.2 : A × B → C) ∘ φ = (fun fb ↦ bil' fb.1 fb.2) by
465+
ext ⟨a, b⟩
466+
simp [bil', φ]]
467+
apply Module.continuous_bilinear_of_finite_free
391468

392-
section algebra
469+
end ring_bilinear
470+
471+
section semiring_algebra
393472

394473
-- these shouldn't be rings, they should be semirings
395474
variable (R) [CommRing R] [TopologicalSpace R] [TopologicalRing R]
@@ -399,77 +478,39 @@ variable [TopologicalSpace D] [IsActionTopology R D]
399478
open scoped TensorProduct
400479

401480
@[continuity, fun_prop]
402-
lemma continuous_mul
481+
lemma continuous_mul'
403482
(R) [CommRing R] [TopologicalSpace R] [TopologicalRing R]
404483
(D : Type*) [Ring D] [Algebra R D] [Module.Finite R D] [Module.Free R D] [TopologicalSpace D]
405484
[IsActionTopology R D]: Continuous (fun ab ↦ ab.1 * ab.2 : D × D → D) := by
406485
letI : TopologicalSpace (D ⊗[R] D) := actionTopology R _
407486
haveI : IsActionTopology R (D ⊗[R] D) := { isActionTopology' := rfl }
408487
convert Module.continuous_bilinear_of_finite_free <| LinearMap.mul R D
409488

410-
def Module.topologicalRing : TopologicalRing D where
489+
-- this should be about top semirings
490+
def Module.topologicalSemiring : TopologicalSemiring D where
411491
continuous_add := (isActionTopology_continuousAdd R D).1
412-
continuous_mul := continuous_mul R D
413-
continuous_neg := continuous_neg R D
492+
continuous_mul := continuous_mul' R D
414493

415-
end algebra
494+
end semiring_algebra
416495

417-
section topology_problem
496+
section ring_algebra
418497

419-
variable {R : Type*} [τR : TopologicalSpace R] [Ring R] [TopologicalRing R]
420-
variable {A : Type*} [AddCommGroup A] [Module R A] [aA : TopologicalSpace A] [IsActionTopology R A]
421-
variable {B : Type*} [AddCommGroup B] [Module R B] [aB : TopologicalSpace B] [IsActionTopology R B]
498+
-- these shouldn't be rings, they should be semirings
499+
variable (R) [CommRing R] [TopologicalSpace R] [TopologicalRing R]
500+
variable (D : Type*) [Ring D] [Algebra R D] [Module.Finite R D]
501+
variable [TopologicalSpace D] [IsActionTopology R D]
422502

423-
-- Here I need the lemma about how quotients are open so I do need groups
424-
-- because this relies on translates of an open being open
425-
lemma coinduced_of_surjective {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
426-
TopologicalSpace.coinduced φ (actionTopology R A) = actionTopology R B := by
427-
have : Continuous φ := continuous_of_linearMap φ
428-
rw [continuous_iff_coinduced_le, isActionTopology R A, isActionTopology R B] at this
429-
apply le_antisymm this
430-
have : ContinuousAdd A := isActionTopology_continuousAdd R A
431-
refine sInf_le ⟨?_, ?_⟩
432-
· apply @ContinuousSMul.mk R B _ _ (_)
433-
obtain ⟨foo⟩ : ContinuousSMul R A := inferInstance
434-
rw [continuous_def] at foo ⊢
435-
intro U hU
436-
rw [isOpen_coinduced, ← isActionTopology R A] at hU
437-
specialize foo _ hU; clear hU
438-
rw [← Set.preimage_comp, show φ ∘ (fun p ↦ p.1 • p.2 : R × A → A) =
439-
(fun p ↦ p.1 • p.2 : R × B → B) ∘
440-
(Prod.map id ⇑φ.toAddMonoidHom) by ext; simp, Set.preimage_comp] at foo
441-
clear! aB -- easiest to just remove topology on B completely now so typeclass inference
442-
-- never sees it
443-
convert isOpenMap_of_coinduced (AddMonoidHom.prodMap (AddMonoidHom.id R) φ.toAddMonoidHom)
444-
(_) (_) (_) foo
445-
· -- aesop would do this if `Function.surjective_id : Surjective ⇑(AddMonoidHom.id R)`
446-
-- was known by it
447-
apply (Set.image_preimage_eq _ _).symm
448-
rw [AddMonoidHom.coe_prodMap, Prod.map_surjective]
449-
exact ⟨Function.surjective_id, by simp_all⟩
450-
· -- should `apply continuousprodmap ctrl-space` find `Continuous.prod_map`?
451-
apply @Continuous.prod_map _ _ _ _ (_) (_) (_) (_) id φ continuous_id
452-
rw [continuous_iff_coinduced_le, isActionTopology R A]
453-
· rw [← isActionTopology R A]
454-
exact coinduced_prod_eq_prod_coinduced (AddMonoidHom.id R) φ.toAddMonoidHom
455-
(Function.surjective_id) hφ
456-
· apply @ContinuousAdd.mk _ (_)
457-
obtain ⟨bar⟩ := isActionTopology_continuousAdd R A
458-
rw [continuous_def] at bar ⊢
459-
intro U hU
460-
rw [isOpen_coinduced, ← isActionTopology R A] at hU
461-
specialize bar _ hU; clear hU
462-
rw [← Set.preimage_comp, show φ ∘ (fun p ↦ p.1 + p.2 : A × A → A) =
463-
(fun p ↦ p.1 + p.2 : B × B → B) ∘
464-
(Prod.map ⇑φ.toAddMonoidHom ⇑φ.toAddMonoidHom) by ext; simp, Set.preimage_comp] at bar
465-
clear! aB -- easiest to just remove topology on B completely now
466-
convert isOpenMap_of_coinduced (AddMonoidHom.prodMap φ.toAddMonoidHom φ.toAddMonoidHom)
467-
(_) (_) (_) bar
468-
· aesop
469-
· apply @Continuous.prod_map _ _ _ _ (_) (_) (_) (_) <;>
470-
· rw [continuous_iff_coinduced_le, isActionTopology R A]; rfl
471-
· rw [← isActionTopology R A]
472-
exact coinduced_prod_eq_prod_coinduced φ φ hφ hφ
503+
open scoped TensorProduct
473504

505+
@[continuity, fun_prop]
506+
lemma continuous_mul : Continuous (fun ab ↦ ab.1 * ab.2 : D × D → D) := by
507+
letI : TopologicalSpace (D ⊗[R] D) := actionTopology R _
508+
haveI : IsActionTopology R (D ⊗[R] D) := { isActionTopology' := rfl }
509+
convert Module.continuous_bilinear_of_finite <| LinearMap.mul R D
510+
511+
def Module.topologicalRing : TopologicalRing D where
512+
continuous_add := (isActionTopology_continuousAdd R D).1
513+
continuous_mul := continuous_mul R D
514+
continuous_neg := continuous_neg R D
474515

475-
end topology_problem
516+
end ring_algebra

0 commit comments

Comments
 (0)