Skip to content

Commit 35ed2f9

Browse files
gasparattilab-mehta
authored andcommitted
feat(Topology/Algebra/Module): call eta_expand in the default tactic of ContinuousLinearEquiv (leanprover-community#39766)
This PR adds a call to `eta_expand` in the default tactic for the fields of `ContinuousLinearEquiv`, so that `dsimp` can also use lemmas written in applied form. This is the same default tactic that is already used for `Homeomorph` and `ContinuousLinearMap`. Most of the proofs which are solved by this default tactic are also removed. A `skip` is also added to show the goal instead of "`dsimp` made no progress" when this default tactic fails.
1 parent bb1a852 commit 35ed2f9

6 files changed

Lines changed: 27 additions & 69 deletions

File tree

Mathlib/Analysis/Fourier/Notation.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,6 @@ variable (R E) in
264264
/-- The Fourier transform as a continuous linear equivalence. -/
265265
def fourierCLE : E ≃L[R] F where
266266
__ := fourierEquiv R E
267-
continuous_toFun := continuous_fourier
268-
continuous_invFun := continuous_fourierInv
269267

270268
@[simp]
271269
lemma fourierCLE_apply (f : E) : fourierCLE R E f = 𝓕 f := rfl

Mathlib/Analysis/LocallyConvex/SeparatingDual.lean

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,7 @@ theorem exists_continuousLinearEquiv_apply_eq
222222
smul_eq_mul, mul_sub, mul_one]
223223
rw [mul_comm _ (G y), ← mul_assoc, mul_inv_cancel₀ Gy]
224224
simp only [smul_sub, one_mul, add_sub_cancel]
225-
abel
226-
continuous_toFun := by fun_prop
227-
continuous_invFun := by fun_prop }
225+
abel }
228226
exact ⟨A, show x + G x • (y - x) = y by simp [Gx]⟩
229227

230228
end Field

Mathlib/Analysis/Normed/Lp/PiLp.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,8 +1140,6 @@ variable [Semiring 𝕜] [∀ i, SeminormedAddCommGroup (β i)] [∀ i, Module
11401140
@[simps! apply symm_apply]
11411141
def continuousLinearEquiv : PiLp p β ≃L[𝕜] ∀ i, β i where
11421142
toLinearEquiv := WithLp.linearEquiv _ _ _
1143-
continuous_toFun := continuous_ofLp _ _
1144-
continuous_invFun := continuous_toLp p _
11451143

11461144
lemma coe_continuousLinearEquiv :
11471145
⇑(PiLp.continuousLinearEquiv p 𝕜 β) = ofLp := rfl

Mathlib/Analysis/Normed/Module/FiniteDimension.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,6 @@ where `ι` is a finite type. -/
266266
def ContinuousLinearEquiv.piRing (ι : Type*) [Fintype ι] [DecidableEq ι] :
267267
((ι → 𝕜) →L[𝕜] E) ≃L[𝕜] ι → E :=
268268
{ LinearMap.toContinuousLinearMap.symm.trans (LinearEquiv.piRing 𝕜 E ι 𝕜) with
269-
continuous_toFun := by
270-
refine continuous_pi fun i ↦ ?_
271-
exact (apply 𝕜 E (Pi.single i 1)).continuous
272269
continuous_invFun := by
273270
simp_rw [LinearEquiv.invFun_eq_symm, LinearEquiv.trans_symm, LinearEquiv.symm_symm]
274271
refine AddMonoidHomClass.continuous_of_bound

Mathlib/Topology/Algebra/Module/Equiv.lean

Lines changed: 16 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ structure ContinuousLinearEquiv {R : Type*} {S : Type*} [Semiring R] [Semiring S
3535
{σ' : S →+* R} [RingHomInvPair σ σ'] [RingHomInvPair σ' σ] (M : Type*) [TopologicalSpace M]
3636
[AddCommMonoid M] (M₂ : Type*) [TopologicalSpace M₂] [AddCommMonoid M₂] [Module R M]
3737
[Module S M₂] extends M ≃ₛₗ[σ] M₂ where
38-
continuous_toFun : Continuous toFun := by first | fun_prop | dsimp; fun_prop
39-
continuous_invFun : Continuous invFun := by first | fun_prop | dsimp; fun_prop
38+
continuous_toFun : Continuous toFun := by first | fun_prop | eta_expand; dsimp; fun_prop | skip
39+
continuous_invFun : Continuous invFun := by first | fun_prop | eta_expand; dsimp; fun_prop | skip
4040

4141
attribute [inherit_doc ContinuousLinearEquiv] ContinuousLinearEquiv.continuous_toFun
4242
ContinuousLinearEquiv.continuous_invFun
@@ -288,10 +288,8 @@ variable (R₁ M₁)
288288

289289
/-- The identity map as a continuous linear equivalence. -/
290290
@[refl]
291-
protected def refl : M₁ ≃L[R₁] M₁ :=
292-
{ LinearEquiv.refl R₁ M₁ with
293-
continuous_toFun := continuous_id
294-
continuous_invFun := continuous_id }
291+
protected def refl : M₁ ≃L[R₁] M₁ where
292+
__ := LinearEquiv.refl R₁ M₁
295293

296294
@[simp]
297295
theorem refl_apply (x : M₁) :
@@ -346,10 +344,8 @@ theorem symm_map_nhds_eq (e : M₁ ≃SL[σ₁₂] M₂) (x : M₁) : map e.symm
346344

347345
/-- The composition of two continuous linear equivalences as a continuous linear equivalence. -/
348346
@[trans]
349-
protected def trans (e₁ : M₁ ≃SL[σ₁₂] M₂) (e₂ : M₂ ≃SL[σ₂₃] M₃) : M₁ ≃SL[σ₁₃] M₃ :=
350-
{ e₁.toLinearEquiv.trans e₂.toLinearEquiv with
351-
continuous_toFun := e₂.continuous_toFun.comp e₁.continuous_toFun
352-
continuous_invFun := e₁.continuous_invFun.comp e₂.continuous_invFun }
347+
protected def trans (e₁ : M₁ ≃SL[σ₁₂] M₂) (e₂ : M₂ ≃SL[σ₂₃] M₃) : M₁ ≃SL[σ₁₃] M₃ where
348+
__ := e₁.toLinearEquiv.trans e₂.toLinearEquiv
353349

354350
@[simp]
355351
theorem trans_toLinearEquiv (e₁ : M₁ ≃SL[σ₁₂] M₂) (e₂ : M₂ ≃SL[σ₂₃] M₃) :
@@ -383,10 +379,8 @@ variable (R₁ M₁ M₂)
383379

384380
/-- Product of modules is commutative up to continuous linear isomorphism. -/
385381
@[simps! apply toLinearEquiv]
386-
def prodComm [Module R₁ M₂] : (M₁ × M₂) ≃L[R₁] M₂ × M₁ :=
387-
{ LinearEquiv.prodComm R₁ M₁ M₂ with
388-
continuous_toFun := continuous_swap
389-
continuous_invFun := continuous_swap }
382+
def prodComm [Module R₁ M₂] : (M₁ × M₂) ≃L[R₁] M₂ × M₁ where
383+
__ := LinearEquiv.prodComm R₁ M₁ M₂
390384

391385
@[simp] lemma prodComm_symm [Module R₁ M₂] : (prodComm R₁ M₁ M₂).symm = prodComm R₁ M₂ M₁ := rfl
392386

@@ -434,8 +428,6 @@ variable (R M₁ M₂ M₃ M₄ : Type*) [Semiring R]
434428
This is `LinearEquiv.prodProdProdComm` prodAssoc as a continuous linear equivalence. -/
435429
def prodProdProdComm : ((M₁ × M₂) × M₃ × M₄) ≃L[R] (M₁ × M₃) × M₂ × M₄ where
436430
toLinearEquiv := LinearEquiv.prodProdProdComm R M₁ M₂ M₃ M₄
437-
continuous_toFun := by fun_prop
438-
continuous_invFun := by fun_prop
439431

440432
@[simp]
441433
theorem prodProdProdComm_symm :
@@ -468,12 +460,6 @@ variable (R M N : Type*) [Semiring R]
468460
This is `Equiv.prodUnique` as a continuous linear equivalence. -/
469461
def prodUnique : (M × N) ≃L[R] M where
470462
toLinearEquiv := LinearEquiv.prodUnique
471-
continuous_toFun := by
472-
change Continuous (Equiv.prodUnique M N)
473-
dsimp; fun_prop
474-
continuous_invFun := by
475-
change Continuous fun x ↦ (x, default)
476-
fun_prop
477463

478464
@[simp]
479465
lemma coe_prodUnique : (prodUnique R M N).toEquiv = Equiv.prodUnique M N := rfl
@@ -488,12 +474,6 @@ lemma prodUnique_symm_apply (x : M) : (prodUnique R M N).symm x = (x, default) :
488474
This is `Equiv.uniqueProd` as a continuous linear equivalence. -/
489475
def uniqueProd : (N × M) ≃L[R] M where
490476
toLinearEquiv := LinearEquiv.uniqueProd
491-
continuous_toFun := by
492-
change Continuous (Equiv.uniqueProd M N)
493-
dsimp; fun_prop
494-
continuous_invFun := by
495-
change Continuous fun x ↦ (default, x)
496-
fun_prop
497477

498478
@[simp]
499479
lemma coe_uniqueProd : (uniqueProd R M N).toEquiv = Equiv.uniqueProd M N := rfl
@@ -632,9 +612,7 @@ inverse of each other. See also `equivOfInverse'`. -/
632612
def equivOfInverse (f₁ : M₁ →SL[σ₁₂] M₂) (f₂ : M₂ →SL[σ₂₁] M₁) (h₁ : Function.LeftInverse f₂ f₁)
633613
(h₂ : Function.RightInverse f₂ f₁) : M₁ ≃SL[σ₁₂] M₂ :=
634614
{ f₁ with
635-
continuous_toFun := f₁.continuous
636615
invFun := f₂
637-
continuous_invFun := f₂.continuous
638616
left_inv := h₁
639617
right_inv := h₂ }
640618

@@ -700,10 +678,8 @@ variable {M₁} {R₄ : Type*} [Semiring R₄] [Module R₄ M₄] {σ₃₄ : R
700678
/-- The continuous linear equivalence between `ULift M₁` and `M₁`.
701679
702680
This is a continuous version of `ULift.moduleEquiv`. -/
703-
def ulift : ULift M₁ ≃L[R₁] M₁ :=
704-
{ ULift.moduleEquiv with
705-
continuous_toFun := continuous_uliftDown
706-
continuous_invFun := continuous_uliftUp }
681+
def ulift : ULift M₁ ≃L[R₁] M₁ where
682+
__ := ULift.moduleEquiv
707683

708684
/-- A pair of continuous (semi)linear equivalences generates an equivalence between the spaces of
709685
continuous linear maps. See also `ContinuousLinearEquiv.arrowCongr`. -/
@@ -777,12 +753,8 @@ variable {ι : Type*} {M : ι → Type*} [∀ i, TopologicalSpace (M i)] [∀ i,
777753

778754
/-- Combine a family of continuous linear equivalences into a continuous linear equivalence of
779755
pi-types. -/
780-
def piCongrRight : ((i : ι) → M i) ≃L[R₁] (i : ι) → N i :=
781-
{ LinearEquiv.piCongrRight fun i ↦ f i with
782-
continuous_toFun := by
783-
exact continuous_pi fun i ↦ (f i).continuous_toFun.comp (continuous_apply i)
784-
continuous_invFun := by
785-
exact continuous_pi fun i => (f i).continuous_invFun.comp (continuous_apply i) }
756+
def piCongrRight : ((i : ι) → M i) ≃L[R₁] (i : ι) → N i where
757+
__ := LinearEquiv.piCongrRight fun i ↦ (f i).toLinearEquiv
786758

787759
@[simp]
788760
theorem piCongrRight_apply (m : (i : ι) → M i) (i : ι) :
@@ -837,8 +809,6 @@ def ofUnit (f : (M →L[R] M)ˣ) : M ≃L[R] M where
837809
show (f.val * f.inv) x = x by
838810
rw [f.val_inv]
839811
simp }
840-
continuous_toFun := f.val.continuous
841-
continuous_invFun := f.inv.continuous
842812

843813
/-- A continuous equivalence from `M` to itself determines an invertible continuous linear map. -/
844814
def toUnit (f : M ≃L[R] M) : (M →L[R] M)ˣ where
@@ -946,8 +916,6 @@ variable (R M) in
946916
@[simps!]
947917
def _root_.Fin.consEquivL : (M 0 × Π i, M (Fin.succ i)) ≃L[R] (Π i, M i) where
948918
__ := Fin.consLinearEquiv R M
949-
continuous_toFun := continuous_id.fst.finCons continuous_id.snd
950-
continuous_invFun := .prodMk (continuous_apply 0) (by fun_prop)
951919

952920
/-- `Fin.cons` in the codomain of continuous linear maps. -/
953921
abbrev _root_.ContinuousLinearMap.finCons
@@ -971,15 +939,8 @@ variable [IsTopologicalAddGroup M₄]
971939

972940
/-- Equivalence given by a block lower diagonal matrix. `e` and `e'` are diagonal square blocks,
973941
and `f` is a rectangular block below the diagonal. -/
974-
def skewProd (e : M ≃L[R] M₂) (e' : M₃ ≃L[R] M₄) (f : M →L[R] M₄) : (M × M₃) ≃L[R] M₂ × M₄ :=
975-
{ e.toLinearEquiv.skewProd e'.toLinearEquiv ↑f with
976-
continuous_toFun :=
977-
(e.continuous_toFun.comp continuous_fst).prodMk
978-
((e'.continuous_toFun.comp continuous_snd).add <| f.continuous.comp continuous_fst)
979-
continuous_invFun :=
980-
(e.continuous_invFun.comp continuous_fst).prodMk
981-
(e'.continuous_invFun.comp <|
982-
continuous_snd.sub <| f.continuous.comp <| e.continuous_invFun.comp continuous_fst) }
942+
def skewProd (e : M ≃L[R] M₂) (e' : M₃ ≃L[R] M₄) (f : M →L[R] M₄) : (M × M₃) ≃L[R] M₂ × M₄ where
943+
__ := e.toLinearEquiv.skewProd e'.toLinearEquiv ↑f
983944

984945
@[simp]
985946
theorem skewProd_apply (e : M ≃L[R] M₂) (e' : M₃ ≃L[R] M₄) (f : M →L[R] M₄) (x) :
@@ -994,10 +955,8 @@ theorem skewProd_symm_apply (e : M ≃L[R] M₂) (e' : M₃ ≃L[R] M₄) (f : M
994955
variable (R) in
995956
/-- The negation map as a continuous linear equivalence. -/
996957
def neg [ContinuousNeg M] :
997-
M ≃L[R] M :=
998-
{ LinearEquiv.neg R with
999-
continuous_toFun := continuous_neg
1000-
continuous_invFun := continuous_neg }
958+
M ≃L[R] M where
959+
__ := LinearEquiv.neg R
1001960

1002961
@[simp]
1003962
theorem coe_neg [ContinuousNeg M] :
@@ -1065,8 +1024,6 @@ def restrictScalars (R : Type*) {S : Type*} {M : Type*}
10651024
[Semiring R] [Semiring S] [AddCommMonoid M] [Module R M] [Module S M] [TopologicalSpace M]
10661025
[LinearMap.CompatibleSMul M M R S] (f : M ≃L[S] M) : M ≃L[R] M where
10671026
toLinearEquiv := f.toLinearEquiv.restrictScalars R
1068-
continuous_invFun := f.continuous_invFun
1069-
continuous_toFun := f.continuous_toFun
10701027

10711028
end RestrictScalars
10721029

Mathlib/Topology/Algebra/Module/Multilinear/Topology.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ def compContinuousLinearMapL (f : ∀ i, E i →L[𝕜] E₁ i) :
259259
set φ : (∀ i, E i) →L[𝕜] (∀ i, E₁ i) := .piMap f
260260
exact ⟨(φ '' U, V), ⟨hU.image φ, hV⟩, fun g hg ↦ hg.comp (mapsTo_image _ _)⟩ }
261261

262+
@[fun_prop]
263+
theorem continuous_precomp (f : ∀ i, E i →L[𝕜] E₁ i) :
264+
Continuous fun g : ContinuousMultilinearMap 𝕜 E₁ F ↦ g.compContinuousLinearMap f :=
265+
map_continuous (compContinuousLinearMapL f)
266+
262267
end CompContinuousLinearMap
263268

264269
variable [∀ i, ContinuousSMul 𝕜 (E i)]
@@ -386,6 +391,11 @@ theorem compContinuousMultilinearMapL_apply (g : F →L[𝕜] G) (f : Continuous
386391
compContinuousMultilinearMapL 𝕜 E F G g f = g.compContinuousMultilinearMap f :=
387392
rfl
388393

394+
@[fun_prop]
395+
theorem _root_.ContinuousLinearMap.continuous_postcomp_continuousMultilinearMap (g : F →L[𝕜] G) :
396+
Continuous (g.compContinuousMultilinearMap (M₁ := E)) :=
397+
map_continuous (compContinuousMultilinearMapL 𝕜 E F G g)
398+
389399
end ContinuousLinearMap
390400

391401
namespace ContinuousLinearEquiv

0 commit comments

Comments
 (0)