geometry.manifold.algebra.monoidMathlib.Geometry.Manifold.Algebra.Monoid

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -3,7 +3,7 @@ Copyright © 2020 Nicolò Cavalleri. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
 -/
-import Geometry.Manifold.ContMdiffMap
+import Geometry.Manifold.ContMDiffMap
 
 #align_import geometry.manifold.algebra.monoid from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
 
@@ -299,7 +299,7 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Topologica
 #print smooth_pow /-
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
   | 0 => by simp only [pow_zero]; exact smooth_const
-  | k + 1 => by simpa [pow_succ] using smooth_id.mul (smooth_pow _)
+  | k + 1 => by simpa [pow_succ'] using smooth_id.mul (smooth_pow _)
 #align smooth_pow smooth_pow
 -/
 
Diff
@@ -3,7 +3,7 @@ Copyright © 2020 Nicolò Cavalleri. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
 -/
-import Mathbin.Geometry.Manifold.ContMdiffMap
+import Geometry.Manifold.ContMdiffMap
 
 #align_import geometry.manifold.algebra.monoid from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
 
Diff
@@ -65,7 +65,7 @@ class SmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Top
     {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
     [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
-  smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2
+  smooth_hMul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2
 #align has_smooth_mul SmoothMul
 #align has_smooth_add SmoothAdd
 -/
@@ -85,7 +85,7 @@ variable (I)
 #print smooth_mul /-
 @[to_additive]
 theorem smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2 :=
-  SmoothMul.smooth_mul
+  SmoothMul.smooth_hMul
 #align smooth_mul smooth_mul
 #align smooth_add smooth_add
 -/
@@ -279,7 +279,7 @@ instance SmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type
     (I' : ModelWithCorners 𝕜 E' H') (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G']
     [Mul G'] [SmoothMul I' G'] : SmoothMul (I.Prod I') (G × G') :=
   { SmoothManifoldWithCorners.prod G G' with
-    smooth_mul :=
+    smooth_hMul :=
       ((smooth_fst.comp smooth_fst).Smooth.mul (smooth_fst.comp smooth_snd)).prod_mk
         ((smooth_snd.comp smooth_fst).Smooth.mul (smooth_snd.comp smooth_snd)) }
 #align has_smooth_mul.prod SmoothMul.prod
Diff
@@ -2,14 +2,11 @@
 Copyright © 2020 Nicolò Cavalleri. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
-
-! This file was ported from Lean 3 source module geometry.manifold.algebra.monoid
-! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Geometry.Manifold.ContMdiffMap
 
+#align_import geometry.manifold.algebra.monoid from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
+
 /-!
 # Smooth monoid
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
 
 ! This file was ported from Lean 3 source module geometry.manifold.algebra.monoid
-! leanprover-community/mathlib commit e354e865255654389cc46e6032160238df2e0f40
+! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -12,6 +12,9 @@ import Mathbin.Geometry.Manifold.ContMdiffMap
 
 /-!
 # Smooth monoid
+
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
 A smooth monoid is a monoid that is also a smooth manifold, in which multiplication is a smooth map
 of the product manifold `G` × `G` into `G`.
 
Diff
@@ -42,39 +42,39 @@ we formulate the definitions and lemmas for any model.
 `[has_continuous_mul G]` as an assumption (worse) or use `haveI` in the proof (better). -/
 
 
-#print HasSmoothAdd /-
+#print SmoothAdd /-
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) additive monoid or a smooth additive
 semigroup. A smooth additive monoid over `α`, for example, is obtained by requiring both the
 instances `add_monoid α` and `has_smooth_add α`. -/
-class HasSmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
+class SmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
     {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
     [Add G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_add : Smooth (I.Prod I) I fun p : G × G => p.1 + p.2
-#align has_smooth_add HasSmoothAdd
+#align has_smooth_add SmoothAdd
 -/
 
-#print HasSmoothMul /-
+#print SmoothMul /-
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) monoid or a smooth semigroup.
 A smooth monoid over `G`, for example, is obtained by requiring both the instances `monoid G`
 and `has_smooth_mul I G`. -/
 @[to_additive]
-class HasSmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
+class SmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
     {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
     [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2
-#align has_smooth_mul HasSmoothMul
-#align has_smooth_add HasSmoothAdd
+#align has_smooth_mul SmoothMul
+#align has_smooth_add SmoothAdd
 -/
 
-section HasSmoothMul
+section SmoothMul
 
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Mul G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
   [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
   {M : Type _} [TopologicalSpace M] [ChartedSpace H' M]
 
@@ -85,7 +85,7 @@ variable (I)
 #print smooth_mul /-
 @[to_additive]
 theorem smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2 :=
-  HasSmoothMul.smooth_mul
+  SmoothMul.smooth_mul
 #align smooth_mul smooth_mul
 #align smooth_add smooth_add
 -/
@@ -236,7 +236,7 @@ theorem R_apply : (𝑹 I g) h = h * g :=
 
 #print L_mul /-
 @[simp]
-theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
+theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by ext;
   simp only [ContMDiffMap.comp_apply, L_apply, mul_assoc]
 #align L_mul L_mul
@@ -244,7 +244,7 @@ theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G]
 
 #print R_mul /-
 @[simp]
-theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
+theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by ext;
   simp only [ContMDiffMap.comp_apply, R_apply, mul_assoc]
 #align R_mul R_mul
@@ -252,7 +252,7 @@ theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G]
 
 section
 
-variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [HasSmoothMul I G']
+variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [SmoothMul I G']
   (g' : G')
 
 #print smoothLeftMul_one /-
@@ -269,32 +269,32 @@ theorem smoothRightMul_one : (𝑹 I g') 1 = g' :=
 
 end
 
-#print HasSmoothMul.prod /-
+#print SmoothMul.prod /-
 -- Instance of product
 @[to_additive]
-instance HasSmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _}
-    [NormedAddCommGroup E] [NormedSpace 𝕜 E] {H : Type _} [TopologicalSpace H]
-    (I : ModelWithCorners 𝕜 E H) (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Mul G]
-    [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type _}
-    [TopologicalSpace H'] (I' : ModelWithCorners 𝕜 E' H') (G' : Type _) [TopologicalSpace G']
-    [ChartedSpace H' G'] [Mul G'] [HasSmoothMul I' G'] : HasSmoothMul (I.Prod I') (G × G') :=
+instance SmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
+    [NormedSpace 𝕜 E] {H : Type _} [TopologicalSpace H] (I : ModelWithCorners 𝕜 E H) (G : Type _)
+    [TopologicalSpace G] [ChartedSpace H G] [Mul G] [SmoothMul I G] {E' : Type _}
+    [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H']
+    (I' : ModelWithCorners 𝕜 E' H') (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G']
+    [Mul G'] [SmoothMul I' G'] : SmoothMul (I.Prod I') (G × G') :=
   { SmoothManifoldWithCorners.prod G G' with
     smooth_mul :=
       ((smooth_fst.comp smooth_fst).Smooth.mul (smooth_fst.comp smooth_snd)).prod_mk
         ((smooth_snd.comp smooth_fst).Smooth.mul (smooth_snd.comp smooth_snd)) }
-#align has_smooth_mul.prod HasSmoothMul.prod
-#align has_smooth_add.sum HasSmoothAdd.sum
+#align has_smooth_mul.prod SmoothMul.prod
+#align has_smooth_add.sum SmoothAdd.sum
 -/
 
-end HasSmoothMul
+end SmoothMul
 
 section Monoid
 
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Monoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {H' : Type _} [TopologicalSpace H']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {H' : Type _} [TopologicalSpace H']
   {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {I' : ModelWithCorners 𝕜 E' H'}
-  {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [HasSmoothMul I' G']
+  {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [SmoothMul I' G']
 
 #print smooth_pow /-
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
@@ -306,9 +306,9 @@ theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
 #print SmoothAddMonoidMorphism /-
 /-- Morphism of additive smooth monoids. -/
 structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [HasSmoothAdd I G]
-    (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
-    [HasSmoothAdd I' G'] extends G →+ G' where
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [SmoothAdd I G] (G' : Type _)
+    [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G'] [SmoothAdd I' G'] extends
+    G →+ G' where
   smooth_toFun : Smooth I I' to_fun
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
 -/
@@ -317,9 +317,8 @@ structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWit
 /-- Morphism of smooth monoids. -/
 @[to_additive]
 structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [HasSmoothMul I G] (G' : Type _)
-    [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [HasSmoothMul I' G'] extends
-    G →* G' where
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [SmoothMul I G] (G' : Type _)
+    [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [SmoothMul I' G'] extends G →* G' where
   smooth_toFun : Smooth I I' to_fun
 #align smooth_monoid_morphism SmoothMonoidMorphism
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
@@ -346,7 +345,7 @@ open scoped BigOperators
 
 variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [CommMonoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
   [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
   {M : Type _} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
   {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
@@ -547,7 +546,7 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddC
   [NormedSpace 𝕜 E]
 
 #print hasSmoothAddSelf /-
-instance hasSmoothAddSelf : HasSmoothAdd 𝓘(𝕜, E) E :=
+instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E :=
   ⟨by
     convert cont_diff_add.cont_mdiff; exact model_with_corners_self_prod.symm
     exact chartedSpaceSelf_prod⟩
Diff
@@ -42,6 +42,7 @@ we formulate the definitions and lemmas for any model.
 `[has_continuous_mul G]` as an assumption (worse) or use `haveI` in the proof (better). -/
 
 
+#print HasSmoothAdd /-
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) additive monoid or a smooth additive
 semigroup. A smooth additive monoid over `α`, for example, is obtained by requiring both the
@@ -52,7 +53,9 @@ class HasSmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [
     Prop where
   smooth_add : Smooth (I.Prod I) I fun p : G × G => p.1 + p.2
 #align has_smooth_add HasSmoothAdd
+-/
 
+#print HasSmoothMul /-
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) monoid or a smooth semigroup.
 A smooth monoid over `G`, for example, is obtained by requiring both the instances `monoid G`
@@ -65,6 +68,7 @@ class HasSmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [
   smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2
 #align has_smooth_mul HasSmoothMul
 #align has_smooth_add HasSmoothAdd
+-/
 
 section HasSmoothMul
 
@@ -78,12 +82,15 @@ section
 
 variable (I)
 
+#print smooth_mul /-
 @[to_additive]
 theorem smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2 :=
   HasSmoothMul.smooth_mul
 #align smooth_mul smooth_mul
 #align smooth_add smooth_add
+-/
 
+#print continuousMul_of_smooth /-
 /-- If the multiplication is smooth, then it is continuous. This is not an instance for technical
 reasons, see note [Design choices about smooth algebraic structures]. -/
 @[to_additive
@@ -91,7 +98,8 @@ reasons, see note [Design choices about smooth algebraic structures]. -/
 theorem continuousMul_of_smooth : ContinuousMul G :=
   ⟨(smooth_mul I).Continuous⟩
 #align has_continuous_mul_of_smooth continuousMul_of_smooth
-#align has_continuous_add_of_smooth has_continuous_add_of_smooth
+#align has_continuous_add_of_smooth continuousAdd_of_smooth
+-/
 
 end
 
@@ -99,86 +107,110 @@ section
 
 variable {f g : M → G} {s : Set M} {x : M} {n : ℕ∞}
 
+#print ContMDiffWithinAt.mul /-
 @[to_additive]
 theorem ContMDiffWithinAt.mul (hf : ContMDiffWithinAt I' I n f s x)
     (hg : ContMDiffWithinAt I' I n g s x) : ContMDiffWithinAt I' I n (f * g) s x :=
   ((smooth_mul I).SmoothAt.of_le le_top).comp_contMDiffWithinAt x (hf.prod_mk hg)
 #align cont_mdiff_within_at.mul ContMDiffWithinAt.mul
 #align cont_mdiff_within_at.add ContMDiffWithinAt.add
+-/
 
+#print ContMDiffAt.mul /-
 @[to_additive]
 theorem ContMDiffAt.mul (hf : ContMDiffAt I' I n f x) (hg : ContMDiffAt I' I n g x) :
     ContMDiffAt I' I n (f * g) x :=
   hf.mul hg
 #align cont_mdiff_at.mul ContMDiffAt.mul
 #align cont_mdiff_at.add ContMDiffAt.add
+-/
 
+#print ContMDiffOn.mul /-
 @[to_additive]
 theorem ContMDiffOn.mul (hf : ContMDiffOn I' I n f s) (hg : ContMDiffOn I' I n g s) :
     ContMDiffOn I' I n (f * g) s := fun x hx => (hf x hx).mul (hg x hx)
 #align cont_mdiff_on.mul ContMDiffOn.mul
 #align cont_mdiff_on.add ContMDiffOn.add
+-/
 
+#print ContMDiff.mul /-
 @[to_additive]
 theorem ContMDiff.mul (hf : ContMDiff I' I n f) (hg : ContMDiff I' I n g) :
     ContMDiff I' I n (f * g) := fun x => (hf x).mul (hg x)
 #align cont_mdiff.mul ContMDiff.mul
 #align cont_mdiff.add ContMDiff.add
+-/
 
+#print SmoothWithinAt.mul /-
 @[to_additive]
 theorem SmoothWithinAt.mul (hf : SmoothWithinAt I' I f s x) (hg : SmoothWithinAt I' I g s x) :
     SmoothWithinAt I' I (f * g) s x :=
   hf.mul hg
 #align smooth_within_at.mul SmoothWithinAt.mul
 #align smooth_within_at.add SmoothWithinAt.add
+-/
 
+#print SmoothAt.mul /-
 @[to_additive]
 theorem SmoothAt.mul (hf : SmoothAt I' I f x) (hg : SmoothAt I' I g x) : SmoothAt I' I (f * g) x :=
   hf.mul hg
 #align smooth_at.mul SmoothAt.mul
 #align smooth_at.add SmoothAt.add
+-/
 
+#print SmoothOn.mul /-
 @[to_additive]
 theorem SmoothOn.mul (hf : SmoothOn I' I f s) (hg : SmoothOn I' I g s) : SmoothOn I' I (f * g) s :=
   hf.mul hg
 #align smooth_on.mul SmoothOn.mul
 #align smooth_on.add SmoothOn.add
+-/
 
+#print Smooth.mul /-
 @[to_additive]
 theorem Smooth.mul (hf : Smooth I' I f) (hg : Smooth I' I g) : Smooth I' I (f * g) :=
   hf.mul hg
 #align smooth.mul Smooth.mul
 #align smooth.add Smooth.add
+-/
 
+#print smooth_mul_left /-
 @[to_additive]
 theorem smooth_mul_left {a : G} : Smooth I I fun b : G => a * b :=
   smooth_const.mul smooth_id
 #align smooth_mul_left smooth_mul_left
 #align smooth_add_left smooth_add_left
+-/
 
+#print smooth_mul_right /-
 @[to_additive]
 theorem smooth_mul_right {a : G} : Smooth I I fun b : G => b * a :=
   smooth_id.mul smooth_const
 #align smooth_mul_right smooth_mul_right
 #align smooth_add_right smooth_add_right
+-/
 
 end
 
 variable (I) (g h : G)
 
+#print smoothLeftMul /-
 /-- Left multiplication by `g`. It is meant to mimic the usual notation in Lie groups.
 Lemmas involving `smooth_left_mul` with the notation `𝑳` usually use `L` instead of `𝑳` in the
 names. -/
 def smoothLeftMul : C^∞⟮I, G; I, G⟯ :=
   ⟨leftMul g, smooth_mul_left⟩
 #align smooth_left_mul smoothLeftMul
+-/
 
+#print smoothRightMul /-
 /-- Right multiplication by `g`. It is meant to mimic the usual notation in Lie groups.
 Lemmas involving `smooth_right_mul` with the notation `𝑹` usually use `R` instead of `𝑹` in the
 names. -/
 def smoothRightMul : C^∞⟮I, G; I, G⟯ :=
   ⟨rightMul g, smooth_mul_right⟩
 #align smooth_right_mul smoothRightMul
+-/
 
 -- Left multiplication. The abbreviation is `MIL`.
 scoped[LieGroup] notation "𝑳" => smoothLeftMul
@@ -188,43 +220,56 @@ scoped[LieGroup] notation "𝑹" => smoothRightMul
 
 open scoped LieGroup
 
+#print L_apply /-
 @[simp]
 theorem L_apply : (𝑳 I g) h = g * h :=
   rfl
 #align L_apply L_apply
+-/
 
+#print R_apply /-
 @[simp]
 theorem R_apply : (𝑹 I g) h = h * g :=
   rfl
 #align R_apply R_apply
+-/
 
+#print L_mul /-
 @[simp]
 theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
     (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by ext;
   simp only [ContMDiffMap.comp_apply, L_apply, mul_assoc]
 #align L_mul L_mul
+-/
 
+#print R_mul /-
 @[simp]
 theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
     (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by ext;
   simp only [ContMDiffMap.comp_apply, R_apply, mul_assoc]
 #align R_mul R_mul
+-/
 
 section
 
 variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [HasSmoothMul I G']
   (g' : G')
 
+#print smoothLeftMul_one /-
 theorem smoothLeftMul_one : (𝑳 I g') 1 = g' :=
   mul_one g'
 #align smooth_left_mul_one smoothLeftMul_one
+-/
 
+#print smoothRightMul_one /-
 theorem smoothRightMul_one : (𝑹 I g') 1 = g' :=
   one_mul g'
 #align smooth_right_mul_one smoothRightMul_one
+-/
 
 end
 
+#print HasSmoothMul.prod /-
 -- Instance of product
 @[to_additive]
 instance HasSmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _}
@@ -239,6 +284,7 @@ instance HasSmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : T
         ((smooth_snd.comp smooth_fst).Smooth.mul (smooth_snd.comp smooth_snd)) }
 #align has_smooth_mul.prod HasSmoothMul.prod
 #align has_smooth_add.sum HasSmoothAdd.sum
+-/
 
 end HasSmoothMul
 
@@ -250,11 +296,14 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Topologica
   {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {I' : ModelWithCorners 𝕜 E' H'}
   {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [HasSmoothMul I' G']
 
+#print smooth_pow /-
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
   | 0 => by simp only [pow_zero]; exact smooth_const
   | k + 1 => by simpa [pow_succ] using smooth_id.mul (smooth_pow _)
 #align smooth_pow smooth_pow
+-/
 
+#print SmoothAddMonoidMorphism /-
 /-- Morphism of additive smooth monoids. -/
 structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
     (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [HasSmoothAdd I G]
@@ -262,7 +311,9 @@ structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWit
     [HasSmoothAdd I' G'] extends G →+ G' where
   smooth_toFun : Smooth I I' to_fun
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
+-/
 
+#print SmoothMonoidMorphism /-
 /-- Morphism of smooth monoids. -/
 @[to_additive]
 structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
@@ -272,6 +323,7 @@ structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCo
   smooth_toFun : Smooth I I' to_fun
 #align smooth_monoid_morphism SmoothMonoidMorphism
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
+-/
 
 @[to_additive]
 instance : One (SmoothMonoidMorphism I I' G G') :=
@@ -299,119 +351,152 @@ variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Topolog
   {M : Type _} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
   {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
 
+#print contMDiffWithinAt_finset_prod' /-
 @[to_additive]
 theorem contMDiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
     ContMDiffWithinAt I' I n (∏ i in t, f i) s x :=
   Finset.prod_induction f (fun f => ContMDiffWithinAt I' I n f s x) (fun f g hf hg => hf.mul hg)
     contMDiffWithinAt_const h
 #align cont_mdiff_within_at_finset_prod' contMDiffWithinAt_finset_prod'
-#align cont_mdiff_within_at_finset_sum' cont_mdiff_within_at_finset_sum'
+#align cont_mdiff_within_at_finset_sum' contMDiffWithinAt_finset_sum'
+-/
 
+#print contMDiffAt_finset_prod' /-
 @[to_additive]
 theorem contMDiffAt_finset_prod' (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
     ContMDiffAt I' I n (∏ i in t, f i) x :=
   contMDiffWithinAt_finset_prod' h
 #align cont_mdiff_at_finset_prod' contMDiffAt_finset_prod'
-#align cont_mdiff_at_finset_sum' cont_mdiff_at_finset_sum'
+#align cont_mdiff_at_finset_sum' contMDiffAt_finset_sum'
+-/
 
+#print contMDiffOn_finset_prod' /-
 @[to_additive]
 theorem contMDiffOn_finset_prod' (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
     ContMDiffOn I' I n (∏ i in t, f i) s := fun x hx =>
   contMDiffWithinAt_finset_prod' fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod' contMDiffOn_finset_prod'
-#align cont_mdiff_on_finset_sum' cont_mdiff_on_finset_sum'
+#align cont_mdiff_on_finset_sum' contMDiffOn_finset_sum'
+-/
 
+#print contMDiff_finset_prod' /-
 @[to_additive]
 theorem contMDiff_finset_prod' (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
     ContMDiff I' I n (∏ i in t, f i) := fun x => contMDiffAt_finset_prod' fun i hi => h i hi x
 #align cont_mdiff_finset_prod' contMDiff_finset_prod'
-#align cont_mdiff_finset_sum' cont_mdiff_finset_sum'
+#align cont_mdiff_finset_sum' contMDiff_finset_sum'
+-/
 
+#print contMDiffWithinAt_finset_prod /-
 @[to_additive]
 theorem contMDiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
     ContMDiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x := by simp only [← Finset.prod_apply];
   exact contMDiffWithinAt_finset_prod' h
 #align cont_mdiff_within_at_finset_prod contMDiffWithinAt_finset_prod
-#align cont_mdiff_within_at_finset_sum cont_mdiff_within_at_finset_sum
+#align cont_mdiff_within_at_finset_sum contMDiffWithinAt_finset_sum
+-/
 
+#print contMDiffAt_finset_prod /-
 @[to_additive]
 theorem contMDiffAt_finset_prod (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
     ContMDiffAt I' I n (fun x => ∏ i in t, f i x) x :=
   contMDiffWithinAt_finset_prod h
 #align cont_mdiff_at_finset_prod contMDiffAt_finset_prod
-#align cont_mdiff_at_finset_sum cont_mdiff_at_finset_sum
+#align cont_mdiff_at_finset_sum contMDiffAt_finset_sum
+-/
 
+#print contMDiffOn_finset_prod /-
 @[to_additive]
 theorem contMDiffOn_finset_prod (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
     ContMDiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
   contMDiffWithinAt_finset_prod fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod contMDiffOn_finset_prod
-#align cont_mdiff_on_finset_sum cont_mdiff_on_finset_sum
+#align cont_mdiff_on_finset_sum contMDiffOn_finset_sum
+-/
 
+#print contMDiff_finset_prod /-
 @[to_additive]
 theorem contMDiff_finset_prod (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
     ContMDiff I' I n fun x => ∏ i in t, f i x := fun x =>
   contMDiffAt_finset_prod fun i hi => h i hi x
 #align cont_mdiff_finset_prod contMDiff_finset_prod
-#align cont_mdiff_finset_sum cont_mdiff_finset_sum
+#align cont_mdiff_finset_sum contMDiff_finset_sum
+-/
 
+#print smoothWithinAt_finset_prod' /-
 @[to_additive]
 theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (∏ i in t, f i) s x :=
   contMDiffWithinAt_finset_prod' h
 #align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
-#align smooth_within_at_finset_sum' smooth_within_at_finset_sum'
+#align smooth_within_at_finset_sum' smoothWithinAt_finset_sum'
+-/
 
+#print smoothAt_finset_prod' /-
 @[to_additive]
 theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (∏ i in t, f i) x :=
   contMDiffAt_finset_prod' h
 #align smooth_at_finset_prod' smoothAt_finset_prod'
-#align smooth_at_finset_sum' smooth_at_finset_sum'
+#align smooth_at_finset_sum' smoothAt_finset_sum'
+-/
 
+#print smoothOn_finset_prod' /-
 @[to_additive]
 theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (∏ i in t, f i) s :=
   contMDiffOn_finset_prod' h
 #align smooth_on_finset_prod' smoothOn_finset_prod'
-#align smooth_on_finset_sum' smooth_on_finset_sum'
+#align smooth_on_finset_sum' smoothOn_finset_sum'
+-/
 
+#print smooth_finset_prod' /-
 @[to_additive]
 theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
   contMDiff_finset_prod' h
 #align smooth_finset_prod' smooth_finset_prod'
 #align smooth_finset_sum' smooth_finset_sum'
+-/
 
+#print smoothWithinAt_finset_prod /-
 @[to_additive]
 theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (fun x => ∏ i in t, f i x) s x :=
   contMDiffWithinAt_finset_prod h
 #align smooth_within_at_finset_prod smoothWithinAt_finset_prod
-#align smooth_within_at_finset_sum smooth_within_at_finset_sum
+#align smooth_within_at_finset_sum smoothWithinAt_finset_sum
+-/
 
+#print smoothAt_finset_prod /-
 @[to_additive]
 theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (fun x => ∏ i in t, f i x) x :=
   contMDiffAt_finset_prod h
 #align smooth_at_finset_prod smoothAt_finset_prod
-#align smooth_at_finset_sum smooth_at_finset_sum
+#align smooth_at_finset_sum smoothAt_finset_sum
+-/
 
+#print smoothOn_finset_prod /-
 @[to_additive]
 theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (fun x => ∏ i in t, f i x) s :=
   contMDiffOn_finset_prod h
 #align smooth_on_finset_prod smoothOn_finset_prod
-#align smooth_on_finset_sum smooth_on_finset_sum
+#align smooth_on_finset_sum smoothOn_finset_sum
+-/
 
+#print smooth_finset_prod /-
 @[to_additive]
 theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
     Smooth I' I fun x => ∏ i in t, f i x :=
   contMDiff_finset_prod h
 #align smooth_finset_prod smooth_finset_prod
 #align smooth_finset_sum smooth_finset_sum
+-/
 
 open Function Filter
 
+#print contMDiff_finprod /-
 @[to_additive]
 theorem contMDiff_finprod (h : ∀ i, ContMDiff I' I n (f i))
     (hfin : LocallyFinite fun i => mulSupport (f i)) : ContMDiff I' I n fun x => ∏ᶠ i, f i x :=
@@ -420,8 +505,10 @@ theorem contMDiff_finprod (h : ∀ i, ContMDiff I' I n (f i))
   rcases finprod_eventually_eq_prod hfin x with ⟨s, hs⟩
   exact (contMDiff_finset_prod (fun i hi => h i) x).congr_of_eventuallyEq hs
 #align cont_mdiff_finprod contMDiff_finprod
-#align cont_mdiff_finsum cont_mdiff_finsum
+#align cont_mdiff_finsum contMDiff_finsum
+-/
 
+#print contMDiff_finprod_cond /-
 @[to_additive]
 theorem contMDiff_finprod_cond (hc : ∀ i, p i → ContMDiff I' I n (f i))
     (hf : LocallyFinite fun i => mulSupport (f i)) :
@@ -430,15 +517,19 @@ theorem contMDiff_finprod_cond (hc : ∀ i, p i → ContMDiff I' I n (f i))
   simp only [← finprod_subtype_eq_finprod_cond]
   exact contMDiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
 #align cont_mdiff_finprod_cond contMDiff_finprod_cond
-#align cont_mdiff_finsum_cond cont_mdiff_finsum_cond
+#align cont_mdiff_finsum_cond contMDiff_finsum_cond
+-/
 
+#print smooth_finprod /-
 @[to_additive]
 theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))
     (hfin : LocallyFinite fun i => mulSupport (f i)) : Smooth I' I fun x => ∏ᶠ i, f i x :=
   contMDiff_finprod h hfin
 #align smooth_finprod smooth_finprod
 #align smooth_finsum smooth_finsum
+-/
 
+#print smooth_finprod_cond /-
 @[to_additive]
 theorem smooth_finprod_cond (hc : ∀ i, p i → Smooth I' I (f i))
     (hf : LocallyFinite fun i => mulSupport (f i)) :
@@ -446,6 +537,7 @@ theorem smooth_finprod_cond (hc : ∀ i, p i → Smooth I' I (f i))
   contMDiff_finprod_cond hc hf
 #align smooth_finprod_cond smooth_finprod_cond
 #align smooth_finsum_cond smooth_finsum_cond
+-/
 
 end CommMonoid
 
@@ -454,11 +546,13 @@ section
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
   [NormedSpace 𝕜 E]
 
+#print hasSmoothAddSelf /-
 instance hasSmoothAddSelf : HasSmoothAdd 𝓘(𝕜, E) E :=
   ⟨by
     convert cont_diff_add.cont_mdiff; exact model_with_corners_self_prod.symm
     exact chartedSpaceSelf_prod⟩
 #align has_smooth_add_self hasSmoothAddSelf
+-/
 
 end
 
Diff
@@ -201,13 +201,13 @@ theorem R_apply : (𝑹 I g) h = h * g :=
 @[simp]
 theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
     (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by ext;
-  simp only [ContMdiffMap.comp_apply, L_apply, mul_assoc]
+  simp only [ContMDiffMap.comp_apply, L_apply, mul_assoc]
 #align L_mul L_mul
 
 @[simp]
 theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
     (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by ext;
-  simp only [ContMdiffMap.comp_apply, R_apply, mul_assoc]
+  simp only [ContMDiffMap.comp_apply, R_apply, mul_assoc]
 #align R_mul R_mul
 
 section
Diff
@@ -100,30 +100,30 @@ section
 variable {f g : M → G} {s : Set M} {x : M} {n : ℕ∞}
 
 @[to_additive]
-theorem ContMdiffWithinAt.mul (hf : ContMdiffWithinAt I' I n f s x)
-    (hg : ContMdiffWithinAt I' I n g s x) : ContMdiffWithinAt I' I n (f * g) s x :=
-  ((smooth_mul I).SmoothAt.of_le le_top).comp_contMdiffWithinAt x (hf.prod_mk hg)
-#align cont_mdiff_within_at.mul ContMdiffWithinAt.mul
-#align cont_mdiff_within_at.add ContMdiffWithinAt.add
+theorem ContMDiffWithinAt.mul (hf : ContMDiffWithinAt I' I n f s x)
+    (hg : ContMDiffWithinAt I' I n g s x) : ContMDiffWithinAt I' I n (f * g) s x :=
+  ((smooth_mul I).SmoothAt.of_le le_top).comp_contMDiffWithinAt x (hf.prod_mk hg)
+#align cont_mdiff_within_at.mul ContMDiffWithinAt.mul
+#align cont_mdiff_within_at.add ContMDiffWithinAt.add
 
 @[to_additive]
-theorem ContMdiffAt.mul (hf : ContMdiffAt I' I n f x) (hg : ContMdiffAt I' I n g x) :
-    ContMdiffAt I' I n (f * g) x :=
+theorem ContMDiffAt.mul (hf : ContMDiffAt I' I n f x) (hg : ContMDiffAt I' I n g x) :
+    ContMDiffAt I' I n (f * g) x :=
   hf.mul hg
-#align cont_mdiff_at.mul ContMdiffAt.mul
-#align cont_mdiff_at.add ContMdiffAt.add
+#align cont_mdiff_at.mul ContMDiffAt.mul
+#align cont_mdiff_at.add ContMDiffAt.add
 
 @[to_additive]
-theorem ContMdiffOn.mul (hf : ContMdiffOn I' I n f s) (hg : ContMdiffOn I' I n g s) :
-    ContMdiffOn I' I n (f * g) s := fun x hx => (hf x hx).mul (hg x hx)
-#align cont_mdiff_on.mul ContMdiffOn.mul
-#align cont_mdiff_on.add ContMdiffOn.add
+theorem ContMDiffOn.mul (hf : ContMDiffOn I' I n f s) (hg : ContMDiffOn I' I n g s) :
+    ContMDiffOn I' I n (f * g) s := fun x hx => (hf x hx).mul (hg x hx)
+#align cont_mdiff_on.mul ContMDiffOn.mul
+#align cont_mdiff_on.add ContMDiffOn.add
 
 @[to_additive]
-theorem ContMdiff.mul (hf : ContMdiff I' I n f) (hg : ContMdiff I' I n g) :
-    ContMdiff I' I n (f * g) := fun x => (hf x).mul (hg x)
-#align cont_mdiff.mul ContMdiff.mul
-#align cont_mdiff.add ContMdiff.add
+theorem ContMDiff.mul (hf : ContMDiff I' I n f) (hg : ContMDiff I' I n g) :
+    ContMDiff I' I n (f * g) := fun x => (hf x).mul (hg x)
+#align cont_mdiff.mul ContMDiff.mul
+#align cont_mdiff.add ContMDiff.add
 
 @[to_additive]
 theorem SmoothWithinAt.mul (hf : SmoothWithinAt I' I f s x) (hg : SmoothWithinAt I' I g s x) :
@@ -300,142 +300,142 @@ variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Topolog
   {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
 
 @[to_additive]
-theorem contMdiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMdiffWithinAt I' I n (f i) s x) :
-    ContMdiffWithinAt I' I n (∏ i in t, f i) s x :=
-  Finset.prod_induction f (fun f => ContMdiffWithinAt I' I n f s x) (fun f g hf hg => hf.mul hg)
-    contMdiffWithinAt_const h
-#align cont_mdiff_within_at_finset_prod' contMdiffWithinAt_finset_prod'
+theorem contMDiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
+    ContMDiffWithinAt I' I n (∏ i in t, f i) s x :=
+  Finset.prod_induction f (fun f => ContMDiffWithinAt I' I n f s x) (fun f g hf hg => hf.mul hg)
+    contMDiffWithinAt_const h
+#align cont_mdiff_within_at_finset_prod' contMDiffWithinAt_finset_prod'
 #align cont_mdiff_within_at_finset_sum' cont_mdiff_within_at_finset_sum'
 
 @[to_additive]
-theorem contMdiffAt_finset_prod' (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
-    ContMdiffAt I' I n (∏ i in t, f i) x :=
-  contMdiffWithinAt_finset_prod' h
-#align cont_mdiff_at_finset_prod' contMdiffAt_finset_prod'
+theorem contMDiffAt_finset_prod' (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
+    ContMDiffAt I' I n (∏ i in t, f i) x :=
+  contMDiffWithinAt_finset_prod' h
+#align cont_mdiff_at_finset_prod' contMDiffAt_finset_prod'
 #align cont_mdiff_at_finset_sum' cont_mdiff_at_finset_sum'
 
 @[to_additive]
-theorem contMdiffOn_finset_prod' (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
-    ContMdiffOn I' I n (∏ i in t, f i) s := fun x hx =>
-  contMdiffWithinAt_finset_prod' fun i hi => h i hi x hx
-#align cont_mdiff_on_finset_prod' contMdiffOn_finset_prod'
+theorem contMDiffOn_finset_prod' (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
+    ContMDiffOn I' I n (∏ i in t, f i) s := fun x hx =>
+  contMDiffWithinAt_finset_prod' fun i hi => h i hi x hx
+#align cont_mdiff_on_finset_prod' contMDiffOn_finset_prod'
 #align cont_mdiff_on_finset_sum' cont_mdiff_on_finset_sum'
 
 @[to_additive]
-theorem contMdiff_finset_prod' (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
-    ContMdiff I' I n (∏ i in t, f i) := fun x => contMdiffAt_finset_prod' fun i hi => h i hi x
-#align cont_mdiff_finset_prod' contMdiff_finset_prod'
+theorem contMDiff_finset_prod' (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
+    ContMDiff I' I n (∏ i in t, f i) := fun x => contMDiffAt_finset_prod' fun i hi => h i hi x
+#align cont_mdiff_finset_prod' contMDiff_finset_prod'
 #align cont_mdiff_finset_sum' cont_mdiff_finset_sum'
 
 @[to_additive]
-theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n (f i) s x) :
-    ContMdiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x := by simp only [← Finset.prod_apply];
-  exact contMdiffWithinAt_finset_prod' h
-#align cont_mdiff_within_at_finset_prod contMdiffWithinAt_finset_prod
+theorem contMDiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
+    ContMDiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x := by simp only [← Finset.prod_apply];
+  exact contMDiffWithinAt_finset_prod' h
+#align cont_mdiff_within_at_finset_prod contMDiffWithinAt_finset_prod
 #align cont_mdiff_within_at_finset_sum cont_mdiff_within_at_finset_sum
 
 @[to_additive]
-theorem contMdiffAt_finset_prod (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
-    ContMdiffAt I' I n (fun x => ∏ i in t, f i x) x :=
-  contMdiffWithinAt_finset_prod h
-#align cont_mdiff_at_finset_prod contMdiffAt_finset_prod
+theorem contMDiffAt_finset_prod (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
+    ContMDiffAt I' I n (fun x => ∏ i in t, f i x) x :=
+  contMDiffWithinAt_finset_prod h
+#align cont_mdiff_at_finset_prod contMDiffAt_finset_prod
 #align cont_mdiff_at_finset_sum cont_mdiff_at_finset_sum
 
 @[to_additive]
-theorem contMdiffOn_finset_prod (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
-    ContMdiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
-  contMdiffWithinAt_finset_prod fun i hi => h i hi x hx
-#align cont_mdiff_on_finset_prod contMdiffOn_finset_prod
+theorem contMDiffOn_finset_prod (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
+    ContMDiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
+  contMDiffWithinAt_finset_prod fun i hi => h i hi x hx
+#align cont_mdiff_on_finset_prod contMDiffOn_finset_prod
 #align cont_mdiff_on_finset_sum cont_mdiff_on_finset_sum
 
 @[to_additive]
-theorem contMdiff_finset_prod (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
-    ContMdiff I' I n fun x => ∏ i in t, f i x := fun x =>
-  contMdiffAt_finset_prod fun i hi => h i hi x
-#align cont_mdiff_finset_prod contMdiff_finset_prod
+theorem contMDiff_finset_prod (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
+    ContMDiff I' I n fun x => ∏ i in t, f i x := fun x =>
+  contMDiffAt_finset_prod fun i hi => h i hi x
+#align cont_mdiff_finset_prod contMDiff_finset_prod
 #align cont_mdiff_finset_sum cont_mdiff_finset_sum
 
 @[to_additive]
 theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (∏ i in t, f i) s x :=
-  contMdiffWithinAt_finset_prod' h
+  contMDiffWithinAt_finset_prod' h
 #align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
 #align smooth_within_at_finset_sum' smooth_within_at_finset_sum'
 
 @[to_additive]
 theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (∏ i in t, f i) x :=
-  contMdiffAt_finset_prod' h
+  contMDiffAt_finset_prod' h
 #align smooth_at_finset_prod' smoothAt_finset_prod'
 #align smooth_at_finset_sum' smooth_at_finset_sum'
 
 @[to_additive]
 theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (∏ i in t, f i) s :=
-  contMdiffOn_finset_prod' h
+  contMDiffOn_finset_prod' h
 #align smooth_on_finset_prod' smoothOn_finset_prod'
 #align smooth_on_finset_sum' smooth_on_finset_sum'
 
 @[to_additive]
 theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
-  contMdiff_finset_prod' h
+  contMDiff_finset_prod' h
 #align smooth_finset_prod' smooth_finset_prod'
 #align smooth_finset_sum' smooth_finset_sum'
 
 @[to_additive]
 theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (fun x => ∏ i in t, f i x) s x :=
-  contMdiffWithinAt_finset_prod h
+  contMDiffWithinAt_finset_prod h
 #align smooth_within_at_finset_prod smoothWithinAt_finset_prod
 #align smooth_within_at_finset_sum smooth_within_at_finset_sum
 
 @[to_additive]
 theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (fun x => ∏ i in t, f i x) x :=
-  contMdiffAt_finset_prod h
+  contMDiffAt_finset_prod h
 #align smooth_at_finset_prod smoothAt_finset_prod
 #align smooth_at_finset_sum smooth_at_finset_sum
 
 @[to_additive]
 theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (fun x => ∏ i in t, f i x) s :=
-  contMdiffOn_finset_prod h
+  contMDiffOn_finset_prod h
 #align smooth_on_finset_prod smoothOn_finset_prod
 #align smooth_on_finset_sum smooth_on_finset_sum
 
 @[to_additive]
 theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
     Smooth I' I fun x => ∏ i in t, f i x :=
-  contMdiff_finset_prod h
+  contMDiff_finset_prod h
 #align smooth_finset_prod smooth_finset_prod
 #align smooth_finset_sum smooth_finset_sum
 
 open Function Filter
 
 @[to_additive]
-theorem contMdiff_finprod (h : ∀ i, ContMdiff I' I n (f i))
-    (hfin : LocallyFinite fun i => mulSupport (f i)) : ContMdiff I' I n fun x => ∏ᶠ i, f i x :=
+theorem contMDiff_finprod (h : ∀ i, ContMDiff I' I n (f i))
+    (hfin : LocallyFinite fun i => mulSupport (f i)) : ContMDiff I' I n fun x => ∏ᶠ i, f i x :=
   by
   intro x
   rcases finprod_eventually_eq_prod hfin x with ⟨s, hs⟩
-  exact (contMdiff_finset_prod (fun i hi => h i) x).congr_of_eventuallyEq hs
-#align cont_mdiff_finprod contMdiff_finprod
+  exact (contMDiff_finset_prod (fun i hi => h i) x).congr_of_eventuallyEq hs
+#align cont_mdiff_finprod contMDiff_finprod
 #align cont_mdiff_finsum cont_mdiff_finsum
 
 @[to_additive]
-theorem contMdiff_finprod_cond (hc : ∀ i, p i → ContMdiff I' I n (f i))
+theorem contMDiff_finprod_cond (hc : ∀ i, p i → ContMDiff I' I n (f i))
     (hf : LocallyFinite fun i => mulSupport (f i)) :
-    ContMdiff I' I n fun x => ∏ᶠ (i) (hi : p i), f i x :=
+    ContMDiff I' I n fun x => ∏ᶠ (i) (hi : p i), f i x :=
   by
   simp only [← finprod_subtype_eq_finprod_cond]
-  exact contMdiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
-#align cont_mdiff_finprod_cond contMdiff_finprod_cond
+  exact contMDiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
+#align cont_mdiff_finprod_cond contMDiff_finprod_cond
 #align cont_mdiff_finsum_cond cont_mdiff_finsum_cond
 
 @[to_additive]
 theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))
     (hfin : LocallyFinite fun i => mulSupport (f i)) : Smooth I' I fun x => ∏ᶠ i, f i x :=
-  contMdiff_finprod h hfin
+  contMDiff_finprod h hfin
 #align smooth_finprod smooth_finprod
 #align smooth_finsum smooth_finsum
 
@@ -443,7 +443,7 @@ theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))
 theorem smooth_finprod_cond (hc : ∀ i, p i → Smooth I' I (f i))
     (hf : LocallyFinite fun i => mulSupport (f i)) :
     Smooth I' I fun x => ∏ᶠ (i) (hi : p i), f i x :=
-  contMdiff_finprod_cond hc hf
+  contMDiff_finprod_cond hc hf
 #align smooth_finprod_cond smooth_finprod_cond
 #align smooth_finsum_cond smooth_finsum_cond
 
Diff
@@ -180,11 +180,9 @@ def smoothRightMul : C^∞⟮I, G; I, G⟯ :=
   ⟨rightMul g, smooth_mul_right⟩
 #align smooth_right_mul smoothRightMul
 
--- mathport name: smooth_left_mul
 -- Left multiplication. The abbreviation is `MIL`.
 scoped[LieGroup] notation "𝑳" => smoothLeftMul
 
--- mathport name: smooth_right_mul
 -- Right multiplication. The abbreviation is `MIR`.
 scoped[LieGroup] notation "𝑹" => smoothRightMul
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
 
 ! This file was ported from Lean 3 source module geometry.manifold.algebra.monoid
-! leanprover-community/mathlib commit 3d7987cda72abc473c7cdbbb075170e9ac620042
+! leanprover-community/mathlib commit e354e865255654389cc46e6032160238df2e0f40
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -451,3 +451,16 @@ theorem smooth_finprod_cond (hc : ∀ i, p i → Smooth I' I (f i))
 
 end CommMonoid
 
+section
+
+variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
+  [NormedSpace 𝕜 E]
+
+instance hasSmoothAddSelf : HasSmoothAdd 𝓘(𝕜, E) E :=
+  ⟨by
+    convert cont_diff_add.cont_mdiff; exact model_with_corners_self_prod.symm
+    exact chartedSpaceSelf_prod⟩
+#align has_smooth_add_self hasSmoothAddSelf
+
+end
+
Diff
@@ -47,8 +47,9 @@ we formulate the definitions and lemmas for any model.
 semigroup. A smooth additive monoid over `α`, for example, is obtained by requiring both the
 instances `add_monoid α` and `has_smooth_add α`. -/
 class HasSmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
-  {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
-  [Add G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G : Prop where
+    {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
+    [Add G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
+    Prop where
   smooth_add : Smooth (I.Prod I) I fun p : G × G => p.1 + p.2
 #align has_smooth_add HasSmoothAdd
 
@@ -58,8 +59,9 @@ A smooth monoid over `G`, for example, is obtained by requiring both the instanc
 and `has_smooth_mul I G`. -/
 @[to_additive]
 class HasSmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
-  {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
-  [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G : Prop where
+    {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
+    [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
+    Prop where
   smooth_mul : Smooth (I.Prod I) I fun p : G × G => p.1 * p.2
 #align has_smooth_mul HasSmoothMul
 #align has_smooth_add HasSmoothAdd
@@ -257,17 +259,18 @@ theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
 
 /-- Morphism of additive smooth monoids. -/
 structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-  (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [HasSmoothAdd I G]
-  (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
-  [HasSmoothAdd I' G'] extends G →+ G' where
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [HasSmoothAdd I G]
+    (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
+    [HasSmoothAdd I' G'] extends G →+ G' where
   smooth_toFun : Smooth I I' to_fun
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
 
 /-- Morphism of smooth monoids. -/
 @[to_additive]
 structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-  (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [HasSmoothMul I G] (G' : Type _)
-  [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [HasSmoothMul I' G'] extends G →* G' where
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [HasSmoothMul I G] (G' : Type _)
+    [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [HasSmoothMul I' G'] extends
+    G →* G' where
   smooth_toFun : Smooth I I' to_fun
 #align smooth_monoid_morphism SmoothMonoidMorphism
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
Diff
@@ -21,7 +21,7 @@ semigroups.
 -/
 
 
-open Manifold
+open scoped Manifold
 
 library_note "Design choices about smooth algebraic structures"/--
 1. All smooth algebraic structures on `G` are `Prop`-valued classes that extend
@@ -186,7 +186,7 @@ scoped[LieGroup] notation "𝑳" => smoothLeftMul
 -- Right multiplication. The abbreviation is `MIR`.
 scoped[LieGroup] notation "𝑹" => smoothRightMul
 
-open LieGroup
+open scoped LieGroup
 
 @[simp]
 theorem L_apply : (𝑳 I g) h = g * h :=
@@ -289,7 +289,7 @@ end Monoid
 
 section CommMonoid
 
-open BigOperators
+open scoped BigOperators
 
 variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [CommMonoid G]
Diff
@@ -200,17 +200,13 @@ theorem R_apply : (𝑹 I g) h = h * g :=
 
 @[simp]
 theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
-    (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) :=
-  by
-  ext
+    (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by ext;
   simp only [ContMdiffMap.comp_apply, L_apply, mul_assoc]
 #align L_mul L_mul
 
 @[simp]
 theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
-    (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) :=
-  by
-  ext
+    (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by ext;
   simp only [ContMdiffMap.comp_apply, R_apply, mul_assoc]
 #align R_mul R_mul
 
@@ -255,9 +251,7 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Topologica
   {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [HasSmoothMul I' G']
 
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
-  | 0 => by
-    simp only [pow_zero]
-    exact smooth_const
+  | 0 => by simp only [pow_zero]; exact smooth_const
   | k + 1 => by simpa [pow_succ] using smooth_id.mul (smooth_pow _)
 #align smooth_pow smooth_pow
 
@@ -334,9 +328,7 @@ theorem contMdiff_finset_prod' (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
 
 @[to_additive]
 theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n (f i) s x) :
-    ContMdiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x :=
-  by
-  simp only [← Finset.prod_apply]
+    ContMdiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x := by simp only [← Finset.prod_apply];
   exact contMdiffWithinAt_finset_prod' h
 #align cont_mdiff_within_at_finset_prod contMdiffWithinAt_finset_prod
 #align cont_mdiff_within_at_finset_sum cont_mdiff_within_at_finset_sum
Diff
@@ -310,27 +310,27 @@ theorem contMdiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMdiffWithinAt I' I
   Finset.prod_induction f (fun f => ContMdiffWithinAt I' I n f s x) (fun f g hf hg => hf.mul hg)
     contMdiffWithinAt_const h
 #align cont_mdiff_within_at_finset_prod' contMdiffWithinAt_finset_prod'
-#align cont_mdiff_within_at_finset_sum' contMdiffWithinAt_finset_sum'
+#align cont_mdiff_within_at_finset_sum' cont_mdiff_within_at_finset_sum'
 
 @[to_additive]
 theorem contMdiffAt_finset_prod' (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
     ContMdiffAt I' I n (∏ i in t, f i) x :=
   contMdiffWithinAt_finset_prod' h
 #align cont_mdiff_at_finset_prod' contMdiffAt_finset_prod'
-#align cont_mdiff_at_finset_sum' contMdiffAt_finset_sum'
+#align cont_mdiff_at_finset_sum' cont_mdiff_at_finset_sum'
 
 @[to_additive]
 theorem contMdiffOn_finset_prod' (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
     ContMdiffOn I' I n (∏ i in t, f i) s := fun x hx =>
   contMdiffWithinAt_finset_prod' fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod' contMdiffOn_finset_prod'
-#align cont_mdiff_on_finset_sum' contMdiffOn_finset_sum'
+#align cont_mdiff_on_finset_sum' cont_mdiff_on_finset_sum'
 
 @[to_additive]
 theorem contMdiff_finset_prod' (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
     ContMdiff I' I n (∏ i in t, f i) := fun x => contMdiffAt_finset_prod' fun i hi => h i hi x
 #align cont_mdiff_finset_prod' contMdiff_finset_prod'
-#align cont_mdiff_finset_sum' contMdiff_finset_sum'
+#align cont_mdiff_finset_sum' cont_mdiff_finset_sum'
 
 @[to_additive]
 theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n (f i) s x) :
@@ -339,49 +339,49 @@ theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n
   simp only [← Finset.prod_apply]
   exact contMdiffWithinAt_finset_prod' h
 #align cont_mdiff_within_at_finset_prod contMdiffWithinAt_finset_prod
-#align cont_mdiff_within_at_finset_sum contMdiffWithinAt_finset_sum
+#align cont_mdiff_within_at_finset_sum cont_mdiff_within_at_finset_sum
 
 @[to_additive]
 theorem contMdiffAt_finset_prod (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
     ContMdiffAt I' I n (fun x => ∏ i in t, f i x) x :=
   contMdiffWithinAt_finset_prod h
 #align cont_mdiff_at_finset_prod contMdiffAt_finset_prod
-#align cont_mdiff_at_finset_sum contMdiffAt_finset_sum
+#align cont_mdiff_at_finset_sum cont_mdiff_at_finset_sum
 
 @[to_additive]
 theorem contMdiffOn_finset_prod (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
     ContMdiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
   contMdiffWithinAt_finset_prod fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod contMdiffOn_finset_prod
-#align cont_mdiff_on_finset_sum contMdiffOn_finset_sum
+#align cont_mdiff_on_finset_sum cont_mdiff_on_finset_sum
 
 @[to_additive]
 theorem contMdiff_finset_prod (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
     ContMdiff I' I n fun x => ∏ i in t, f i x := fun x =>
   contMdiffAt_finset_prod fun i hi => h i hi x
 #align cont_mdiff_finset_prod contMdiff_finset_prod
-#align cont_mdiff_finset_sum contMdiff_finset_sum
+#align cont_mdiff_finset_sum cont_mdiff_finset_sum
 
 @[to_additive]
 theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (∏ i in t, f i) s x :=
   contMdiffWithinAt_finset_prod' h
 #align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
-#align smooth_within_at_finset_sum' smoothWithinAt_finset_sum'
+#align smooth_within_at_finset_sum' smooth_within_at_finset_sum'
 
 @[to_additive]
 theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (∏ i in t, f i) x :=
   contMdiffAt_finset_prod' h
 #align smooth_at_finset_prod' smoothAt_finset_prod'
-#align smooth_at_finset_sum' smoothAt_finset_sum'
+#align smooth_at_finset_sum' smooth_at_finset_sum'
 
 @[to_additive]
 theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (∏ i in t, f i) s :=
   contMdiffOn_finset_prod' h
 #align smooth_on_finset_prod' smoothOn_finset_prod'
-#align smooth_on_finset_sum' smoothOn_finset_sum'
+#align smooth_on_finset_sum' smooth_on_finset_sum'
 
 @[to_additive]
 theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
@@ -394,21 +394,21 @@ theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s
     SmoothWithinAt I' I (fun x => ∏ i in t, f i x) s x :=
   contMdiffWithinAt_finset_prod h
 #align smooth_within_at_finset_prod smoothWithinAt_finset_prod
-#align smooth_within_at_finset_sum smoothWithinAt_finset_sum
+#align smooth_within_at_finset_sum smooth_within_at_finset_sum
 
 @[to_additive]
 theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (fun x => ∏ i in t, f i x) x :=
   contMdiffAt_finset_prod h
 #align smooth_at_finset_prod smoothAt_finset_prod
-#align smooth_at_finset_sum smoothAt_finset_sum
+#align smooth_at_finset_sum smooth_at_finset_sum
 
 @[to_additive]
 theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (fun x => ∏ i in t, f i x) s :=
   contMdiffOn_finset_prod h
 #align smooth_on_finset_prod smoothOn_finset_prod
-#align smooth_on_finset_sum smoothOn_finset_sum
+#align smooth_on_finset_sum smooth_on_finset_sum
 
 @[to_additive]
 theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
@@ -427,7 +427,7 @@ theorem contMdiff_finprod (h : ∀ i, ContMdiff I' I n (f i))
   rcases finprod_eventually_eq_prod hfin x with ⟨s, hs⟩
   exact (contMdiff_finset_prod (fun i hi => h i) x).congr_of_eventuallyEq hs
 #align cont_mdiff_finprod contMdiff_finprod
-#align cont_mdiff_finsum contMdiff_finsum
+#align cont_mdiff_finsum cont_mdiff_finsum
 
 @[to_additive]
 theorem contMdiff_finprod_cond (hc : ∀ i, p i → ContMdiff I' I n (f i))
@@ -437,7 +437,7 @@ theorem contMdiff_finprod_cond (hc : ∀ i, p i → ContMdiff I' I n (f i))
   simp only [← finprod_subtype_eq_finprod_cond]
   exact contMdiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
 #align cont_mdiff_finprod_cond contMdiff_finprod_cond
-#align cont_mdiff_finsum_cond contMdiff_finsum_cond
+#align cont_mdiff_finsum_cond cont_mdiff_finsum_cond
 
 @[to_additive]
 theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))
Diff
@@ -310,27 +310,27 @@ theorem contMdiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMdiffWithinAt I' I
   Finset.prod_induction f (fun f => ContMdiffWithinAt I' I n f s x) (fun f g hf hg => hf.mul hg)
     contMdiffWithinAt_const h
 #align cont_mdiff_within_at_finset_prod' contMdiffWithinAt_finset_prod'
-#align cont_mdiff_within_at_finset_sum' cont_mdiff_within_at_finset_sum'
+#align cont_mdiff_within_at_finset_sum' contMdiffWithinAt_finset_sum'
 
 @[to_additive]
 theorem contMdiffAt_finset_prod' (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
     ContMdiffAt I' I n (∏ i in t, f i) x :=
   contMdiffWithinAt_finset_prod' h
 #align cont_mdiff_at_finset_prod' contMdiffAt_finset_prod'
-#align cont_mdiff_at_finset_sum' cont_mdiff_at_finset_sum'
+#align cont_mdiff_at_finset_sum' contMdiffAt_finset_sum'
 
 @[to_additive]
 theorem contMdiffOn_finset_prod' (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
     ContMdiffOn I' I n (∏ i in t, f i) s := fun x hx =>
   contMdiffWithinAt_finset_prod' fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod' contMdiffOn_finset_prod'
-#align cont_mdiff_on_finset_sum' cont_mdiff_on_finset_sum'
+#align cont_mdiff_on_finset_sum' contMdiffOn_finset_sum'
 
 @[to_additive]
 theorem contMdiff_finset_prod' (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
     ContMdiff I' I n (∏ i in t, f i) := fun x => contMdiffAt_finset_prod' fun i hi => h i hi x
 #align cont_mdiff_finset_prod' contMdiff_finset_prod'
-#align cont_mdiff_finset_sum' cont_mdiff_finset_sum'
+#align cont_mdiff_finset_sum' contMdiff_finset_sum'
 
 @[to_additive]
 theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n (f i) s x) :
@@ -339,49 +339,49 @@ theorem contMdiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMdiffWithinAt I' I n
   simp only [← Finset.prod_apply]
   exact contMdiffWithinAt_finset_prod' h
 #align cont_mdiff_within_at_finset_prod contMdiffWithinAt_finset_prod
-#align cont_mdiff_within_at_finset_sum cont_mdiff_within_at_finset_sum
+#align cont_mdiff_within_at_finset_sum contMdiffWithinAt_finset_sum
 
 @[to_additive]
 theorem contMdiffAt_finset_prod (h : ∀ i ∈ t, ContMdiffAt I' I n (f i) x) :
     ContMdiffAt I' I n (fun x => ∏ i in t, f i x) x :=
   contMdiffWithinAt_finset_prod h
 #align cont_mdiff_at_finset_prod contMdiffAt_finset_prod
-#align cont_mdiff_at_finset_sum cont_mdiff_at_finset_sum
+#align cont_mdiff_at_finset_sum contMdiffAt_finset_sum
 
 @[to_additive]
 theorem contMdiffOn_finset_prod (h : ∀ i ∈ t, ContMdiffOn I' I n (f i) s) :
     ContMdiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
   contMdiffWithinAt_finset_prod fun i hi => h i hi x hx
 #align cont_mdiff_on_finset_prod contMdiffOn_finset_prod
-#align cont_mdiff_on_finset_sum cont_mdiff_on_finset_sum
+#align cont_mdiff_on_finset_sum contMdiffOn_finset_sum
 
 @[to_additive]
 theorem contMdiff_finset_prod (h : ∀ i ∈ t, ContMdiff I' I n (f i)) :
     ContMdiff I' I n fun x => ∏ i in t, f i x := fun x =>
   contMdiffAt_finset_prod fun i hi => h i hi x
 #align cont_mdiff_finset_prod contMdiff_finset_prod
-#align cont_mdiff_finset_sum cont_mdiff_finset_sum
+#align cont_mdiff_finset_sum contMdiff_finset_sum
 
 @[to_additive]
 theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
     SmoothWithinAt I' I (∏ i in t, f i) s x :=
   contMdiffWithinAt_finset_prod' h
 #align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
-#align smooth_within_at_finset_sum' smooth_within_at_finset_sum'
+#align smooth_within_at_finset_sum' smoothWithinAt_finset_sum'
 
 @[to_additive]
 theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (∏ i in t, f i) x :=
   contMdiffAt_finset_prod' h
 #align smooth_at_finset_prod' smoothAt_finset_prod'
-#align smooth_at_finset_sum' smooth_at_finset_sum'
+#align smooth_at_finset_sum' smoothAt_finset_sum'
 
 @[to_additive]
 theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (∏ i in t, f i) s :=
   contMdiffOn_finset_prod' h
 #align smooth_on_finset_prod' smoothOn_finset_prod'
-#align smooth_on_finset_sum' smooth_on_finset_sum'
+#align smooth_on_finset_sum' smoothOn_finset_sum'
 
 @[to_additive]
 theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
@@ -394,21 +394,21 @@ theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s
     SmoothWithinAt I' I (fun x => ∏ i in t, f i x) s x :=
   contMdiffWithinAt_finset_prod h
 #align smooth_within_at_finset_prod smoothWithinAt_finset_prod
-#align smooth_within_at_finset_sum smooth_within_at_finset_sum
+#align smooth_within_at_finset_sum smoothWithinAt_finset_sum
 
 @[to_additive]
 theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (fun x => ∏ i in t, f i x) x :=
   contMdiffAt_finset_prod h
 #align smooth_at_finset_prod smoothAt_finset_prod
-#align smooth_at_finset_sum smooth_at_finset_sum
+#align smooth_at_finset_sum smoothAt_finset_sum
 
 @[to_additive]
 theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (fun x => ∏ i in t, f i x) s :=
   contMdiffOn_finset_prod h
 #align smooth_on_finset_prod smoothOn_finset_prod
-#align smooth_on_finset_sum smooth_on_finset_sum
+#align smooth_on_finset_sum smoothOn_finset_sum
 
 @[to_additive]
 theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
@@ -427,7 +427,7 @@ theorem contMdiff_finprod (h : ∀ i, ContMdiff I' I n (f i))
   rcases finprod_eventually_eq_prod hfin x with ⟨s, hs⟩
   exact (contMdiff_finset_prod (fun i hi => h i) x).congr_of_eventuallyEq hs
 #align cont_mdiff_finprod contMdiff_finprod
-#align cont_mdiff_finsum cont_mdiff_finsum
+#align cont_mdiff_finsum contMdiff_finsum
 
 @[to_additive]
 theorem contMdiff_finprod_cond (hc : ∀ i, p i → ContMdiff I' I n (f i))
@@ -437,7 +437,7 @@ theorem contMdiff_finprod_cond (hc : ∀ i, p i → ContMdiff I' I n (f i))
   simp only [← finprod_subtype_eq_finprod_cond]
   exact contMdiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
 #align cont_mdiff_finprod_cond contMdiff_finprod_cond
-#align cont_mdiff_finsum_cond cont_mdiff_finsum_cond
+#align cont_mdiff_finsum_cond contMdiff_finsum_cond
 
 @[to_additive]
 theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))

Changes in mathlib4

mathlib3
mathlib4
perf: make LocalInvariantProp a structure (#12552)
  • Also redefine MDifferentiableWithinAt and MDifferentiableAt so that they are using LiftProp[Within]At.
  • This causes a speedup in the old proof of ContMDiffWithinAt.cle_arrowCongr by 25%.
  • Also give some extra information in the proof of ContMDiffWithinAt.cle_arrowCongr to speed it up by another factor of 4.
  • A bit of the fallout (e.g. in hasSmoothAddSelf) is from Lean unfolding way too many definitions to make things definitionally equal. Since LiftPropWithinAt is now a structure, the old proofs now break, unless you rewrite with chartedSpaceSelf_prod), causing much less defeq-abuse.
  • The new lemmas MDifferentiableWithinAt.differentiableWithinAt_writtenInExtChartAt and MDifferentiableAt.differentiableWithinAt_writtenInExtChartAt have a bit long names. This is to avoid naming clash with the existing MDifferentiableWithinAt.differentiableWithinAt. I'm open for other suggestions.
Diff
@@ -339,7 +339,7 @@ theorem contMDiffWithinAt_finprod (lf : LocallyFinite fun i ↦ mulSupport <| f
 theorem contMDiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
     ContMDiffWithinAt I' I n (∏ i in t, f i) s x :=
   Finset.prod_induction f (fun f => ContMDiffWithinAt I' I n f s x) (fun _ _ hf hg => hf.mul hg)
-    contMDiffWithinAt_const h
+    (contMDiffWithinAt_const (c := 1)) h
 #align cont_mdiff_within_at_finset_prod' contMDiffWithinAt_finset_prod'
 #align cont_mdiff_within_at_finset_sum' contMDiffWithinAt_finset_sum'
 
@@ -514,8 +514,10 @@ section
 variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E : Type*} [NormedAddCommGroup E]
   [NormedSpace 𝕜 E]
 
-instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E :=
-  ⟨by rw [← modelWithCornersSelf_prod]; exact contDiff_add.contMDiff⟩
+instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E := by
+  constructor
+  rw [← modelWithCornersSelf_prod, chartedSpaceSelf_prod]
+  exact contDiff_add.contMDiff
 #align has_smooth_add_self hasSmoothAddSelf
 
 end
change the order of operation in zsmulRec and nsmulRec (#11451)

We change the following field in the definition of an additive commutative monoid:

 nsmul_succ : ∀ (n : ℕ) (x : G),
-  AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+  AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x

where the latter is more natural

We adjust the definitions of ^ in monoids, groups, etc. Originally there was a warning comment about why this natural order was preferred

use x * npowRec n x and not npowRec n x * x in the definition to make sure that definitional unfolding of npowRec is blocked, to avoid deep recursion issues.

but it seems to no longer apply.

Remarks on the PR :

  • pow_succ and pow_succ' have switched their meanings.
  • Most of the time, the proofs were adjusted by priming/unpriming one lemma, or exchanging left and right; a few proofs were more complicated to adjust.
  • In particular, [Mathlib/NumberTheory/RamificationInertia.lean] used Ideal.IsPrime.mul_mem_pow which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul.
  • the docstring for Cauchy condensation test in [Mathlib/Analysis/PSeries.lean] was mathematically incorrect, I added the mention that the function is antitone.
Diff
@@ -256,7 +256,7 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalS
 @[to_additive]
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
   | 0 => by simp only [pow_zero]; exact smooth_const
-  | k + 1 => by simpa [pow_succ] using smooth_id.mul (smooth_pow _)
+  | k + 1 => by simpa [pow_succ] using (smooth_pow _).mul smooth_id
 #align smooth_pow smooth_pow
 
 /-- Morphism of additive smooth monoids. -/
refactor(Data/FunLike): use unbundled inheritance from FunLike (#8386)

The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike is EquivLike, since that has a custom coe_injective' field that is easier to implement. All other classes should take FunLike or EquivLike as a parameter.

Zulip thread

Important changes

Previously, morphism classes would be Type-valued and extend FunLike:

/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
  extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))

After this PR, they should be Prop-valued and take FunLike as a parameter:

/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
  [FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))

(Note that A B stay marked as outParam even though they are not purely required to be so due to the FunLike parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam is slightly faster.)

Similarly, MyEquivClass should take EquivLike as a parameter.

As a result, every mention of [MyHomClass F A B] should become [FunLike F A B] [MyHomClass F A B].

Remaining issues

Slower (failing) search

While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul is more expensive. This is due to suboptimal processing of arguments. For example:

variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)

theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y

example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _

Before this PR, applying map_mul f gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]. Since M and N are out_params, [MulHomClass F ?M ?N] is synthesized first, supplies values for ?M and ?N and then the Mul M and Mul N instances can be found.

After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]. Now [FunLike F ?M ?N] is synthesized first, supplies values for ?M and ?N and then the Mul M and Mul N instances can be found, before trying MulHomClass F M N which fails. Since the Mul hierarchy is very big, this can be slow to fail, especially when there is no such Mul instance.

A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N] because MulHomClass fails or succeeds much faster than the others.

As a consequence, the simpNF linter is much slower since by design it tries and fails to apply many map_ lemmas. The same issue occurs a few times in existing calls to simp [map_mul], where map_mul is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.

simp not firing sometimes

This affects map_smulₛₗ and related definitions. For simp lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw can find every argument to map_smulₛₗ successfully but simp can't: leanprover/lean4#3701.

Missing instances due to unification failing

Especially in the category theory library, we might sometimes have a type A which is also accessible as a synonym (Bundled A hA).1. Instance synthesis doesn't always work if we have f : A →* B but x * y : (Bundled A hA).1 or vice versa. This seems to be mostly fixed by keeping A B as outParams in MulHomClass F A B. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1 instead of using the syntax in the discrimination tree.)

Workaround for issues

The timeouts can be worked around for now by specifying which map_mul we mean, either as map_mul f for some explicit f, or as e.g. MonoidHomClass.map_mul.

map_smulₛₗ not firing as simp lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ a simp lemma instead of the generic map_smulₛₗ. Writing simp [map_smulₛₗ _] also works.

Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>

Diff
@@ -285,11 +285,13 @@ instance : One (SmoothMonoidMorphism I I' G G') :=
 instance : Inhabited (SmoothMonoidMorphism I I' G G') :=
   ⟨1⟩
 
--- porting note: replaced `CoeFun` with `MonoidHomClass` and `ContinuousMapClass` instances
 @[to_additive]
-instance : MonoidHomClass (SmoothMonoidMorphism I I' G G') G G' where
+instance : FunLike (SmoothMonoidMorphism I I' G G') G G' where
   coe a := a.toFun
   coe_injective' f g h := by cases f; cases g; congr; exact DFunLike.ext' h
+
+@[to_additive]
+instance : MonoidHomClass (SmoothMonoidMorphism I I' G G') G G' where
   map_one f := f.map_one
   map_mul f := f.map_mul
 
feat: finite products/sums of differentiable maps into smooth commutative monoids are differentiable (#9775)

From sphere-eversion; I'm just upstreaming this.

Co-authored-by: Oliver Nash <github@olivernash.org>

Diff
@@ -299,16 +299,39 @@ instance : ContinuousMapClass (SmoothMonoidMorphism I I' G G') G G' where
 
 end Monoid
 
+/-! ### Differentiability of finite point-wise sums and products
+
+  Finite point-wise products (resp. sums) of differentiable/smooth functions `M → G` (at `x`/on `s`)
+  into a commutative monoid `G` are differentiable/smooth at `x`/on `s`. -/
 section CommMonoid
 
+open Function
 open scoped BigOperators
 
-variable {ι 𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H] {E : Type*}
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type*} [CommMonoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type*} [NormedAddCommGroup E']
-  [NormedSpace 𝕜 E'] {H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
-  {M : Type*} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
-  {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
+variable {ι 𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H]
+  {E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H}
+  {G : Type*} [CommMonoid G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
+  {E' : Type*} [NormedAddCommGroup E'] [NormedSpace 𝕜 E']
+  {H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
+  {M : Type*} [TopologicalSpace M] [ChartedSpace H' M]
+  {s : Set M} {x x₀ : M} {t : Finset ι} {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
+
+@[to_additive]
+theorem ContMDiffWithinAt.prod (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x₀) :
+    ContMDiffWithinAt I' I n (fun x ↦ ∏ i in t, f i x) s x₀ := by
+  classical
+  induction' t using Finset.induction_on with i K iK IH
+  · simp [contMDiffWithinAt_const]
+  · simp only [iK, Finset.prod_insert, not_false_iff]
+    exact (h _ (Finset.mem_insert_self i K)).mul (IH fun j hj ↦ h _ <| Finset.mem_insert_of_mem hj)
+
+@[to_additive]
+theorem contMDiffWithinAt_finprod (lf : LocallyFinite fun i ↦ mulSupport <| f i) {x₀ : M}
+    (h : ∀ i, ContMDiffWithinAt I' I n (f i) s x₀) :
+    ContMDiffWithinAt I' I n (fun x ↦ ∏ᶠ i, f i x) s x₀ :=
+  let ⟨_I, hI⟩ := finprod_eventually_eq_prod lf x₀
+  (ContMDiffWithinAt.prod fun i _hi ↦ h i).congr_of_eventuallyEq
+    (eventually_nhdsWithin_of_eventually_nhds hI) hI.self_of_nhds
 
 @[to_additive]
 theorem contMDiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
@@ -318,26 +341,6 @@ theorem contMDiffWithinAt_finset_prod' (h : ∀ i ∈ t, ContMDiffWithinAt I' I
 #align cont_mdiff_within_at_finset_prod' contMDiffWithinAt_finset_prod'
 #align cont_mdiff_within_at_finset_sum' contMDiffWithinAt_finset_sum'
 
-@[to_additive]
-theorem contMDiffAt_finset_prod' (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
-    ContMDiffAt I' I n (∏ i in t, f i) x :=
-  contMDiffWithinAt_finset_prod' h
-#align cont_mdiff_at_finset_prod' contMDiffAt_finset_prod'
-#align cont_mdiff_at_finset_sum' contMDiffAt_finset_sum'
-
-@[to_additive]
-theorem contMDiffOn_finset_prod' (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
-    ContMDiffOn I' I n (∏ i in t, f i) s := fun x hx =>
-  contMDiffWithinAt_finset_prod' fun i hi => h i hi x hx
-#align cont_mdiff_on_finset_prod' contMDiffOn_finset_prod'
-#align cont_mdiff_on_finset_sum' contMDiffOn_finset_sum'
-
-@[to_additive]
-theorem contMDiff_finset_prod' (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
-    ContMDiff I' I n (∏ i in t, f i) := fun x => contMDiffAt_finset_prod' fun i hi => h i hi x
-#align cont_mdiff_finset_prod' contMDiff_finset_prod'
-#align cont_mdiff_finset_sum' contMDiff_finset_sum'
-
 @[to_additive]
 theorem contMDiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMDiffWithinAt I' I n (f i) s x) :
     ContMDiffWithinAt I' I n (fun x => ∏ i in t, f i x) s x := by
@@ -346,6 +349,25 @@ theorem contMDiffWithinAt_finset_prod (h : ∀ i ∈ t, ContMDiffWithinAt I' I n
 #align cont_mdiff_within_at_finset_prod contMDiffWithinAt_finset_prod
 #align cont_mdiff_within_at_finset_sum contMDiffWithinAt_finset_sum
 
+@[to_additive]
+theorem ContMDiffAt.prod (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x₀) :
+    ContMDiffAt I' I n (fun x ↦ ∏ i in t, f i x) x₀ := by
+  simp only [← contMDiffWithinAt_univ] at *
+  exact ContMDiffWithinAt.prod h
+
+@[to_additive]
+theorem contMDiffAt_finprod
+    (lf : LocallyFinite fun i ↦ mulSupport <| f i) (h : ∀ i, ContMDiffAt I' I n (f i) x₀) :
+    ContMDiffAt I' I n (fun x ↦ ∏ᶠ i, f i x) x₀ :=
+  contMDiffWithinAt_finprod lf h
+
+@[to_additive]
+theorem contMDiffAt_finset_prod' (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
+    ContMDiffAt I' I n (∏ i in t, f i) x :=
+  contMDiffWithinAt_finset_prod' h
+#align cont_mdiff_at_finset_prod' contMDiffAt_finset_prod'
+#align cont_mdiff_at_finset_sum' contMDiffAt_finset_sum'
+
 @[to_additive]
 theorem contMDiffAt_finset_prod (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
     ContMDiffAt I' I n (fun x => ∏ i in t, f i x) x :=
@@ -353,6 +375,19 @@ theorem contMDiffAt_finset_prod (h : ∀ i ∈ t, ContMDiffAt I' I n (f i) x) :
 #align cont_mdiff_at_finset_prod contMDiffAt_finset_prod
 #align cont_mdiff_at_finset_sum contMDiffAt_finset_sum
 
+@[to_additive]
+theorem contMDiffOn_finprod
+    (lf : LocallyFinite fun i ↦ Function.mulSupport <| f i) (h : ∀ i, ContMDiffOn I' I n (f i) s) :
+    ContMDiffOn I' I n (fun x ↦ ∏ᶠ i, f i x) s := fun x hx ↦
+  contMDiffWithinAt_finprod lf fun i ↦ h i x hx
+
+@[to_additive]
+theorem contMDiffOn_finset_prod' (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
+    ContMDiffOn I' I n (∏ i in t, f i) s := fun x hx =>
+  contMDiffWithinAt_finset_prod' fun i hi => h i hi x hx
+#align cont_mdiff_on_finset_prod' contMDiffOn_finset_prod'
+#align cont_mdiff_on_finset_sum' contMDiffOn_finset_sum'
+
 @[to_additive]
 theorem contMDiffOn_finset_prod (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
     ContMDiffOn I' I n (fun x => ∏ i in t, f i x) s := fun x hx =>
@@ -360,6 +395,17 @@ theorem contMDiffOn_finset_prod (h : ∀ i ∈ t, ContMDiffOn I' I n (f i) s) :
 #align cont_mdiff_on_finset_prod contMDiffOn_finset_prod
 #align cont_mdiff_on_finset_sum contMDiffOn_finset_sum
 
+@[to_additive]
+theorem ContMDiff.prod (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
+    ContMDiff I' I n fun x ↦ ∏ i in t, f i x :=
+  fun x ↦ ContMDiffAt.prod fun j hj ↦ h j hj x
+
+@[to_additive]
+theorem contMDiff_finset_prod' (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
+    ContMDiff I' I n (∏ i in t, f i) := fun x => contMDiffAt_finset_prod' fun i hi => h i hi x
+#align cont_mdiff_finset_prod' contMDiff_finset_prod'
+#align cont_mdiff_finset_sum' contMDiff_finset_sum'
+
 @[to_additive]
 theorem contMDiff_finset_prod (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
     ContMDiff I' I n fun x => ∏ i in t, f i x := fun x =>
@@ -368,31 +414,33 @@ theorem contMDiff_finset_prod (h : ∀ i ∈ t, ContMDiff I' I n (f i)) :
 #align cont_mdiff_finset_sum contMDiff_finset_sum
 
 @[to_additive]
-theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
-    SmoothWithinAt I' I (∏ i in t, f i) s x :=
-  contMDiffWithinAt_finset_prod' h
-#align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
-#align smooth_within_at_finset_sum' smoothWithinAt_finset_sum'
+theorem contMDiff_finprod (h : ∀ i, ContMDiff I' I n (f i))
+    (hfin : LocallyFinite fun i => mulSupport (f i)) : ContMDiff I' I n fun x => ∏ᶠ i, f i x :=
+  fun x ↦ contMDiffAt_finprod hfin fun i ↦ h i x
+#align cont_mdiff_finprod contMDiff_finprod
+#align cont_mdiff_finsum contMDiff_finsum
 
 @[to_additive]
-theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
-    SmoothAt I' I (∏ i in t, f i) x :=
-  contMDiffAt_finset_prod' h
-#align smooth_at_finset_prod' smoothAt_finset_prod'
-#align smooth_at_finset_sum' smoothAt_finset_sum'
+theorem contMDiff_finprod_cond (hc : ∀ i, p i → ContMDiff I' I n (f i))
+    (hf : LocallyFinite fun i => mulSupport (f i)) :
+    ContMDiff I' I n fun x => ∏ᶠ (i) (_ : p i), f i x := by
+  simp only [← finprod_subtype_eq_finprod_cond]
+  exact contMDiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
+#align cont_mdiff_finprod_cond contMDiff_finprod_cond
+#align cont_mdiff_finsum_cond contMDiff_finsum_cond
 
 @[to_additive]
-theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
-    SmoothOn I' I (∏ i in t, f i) s :=
-  contMDiffOn_finset_prod' h
-#align smooth_on_finset_prod' smoothOn_finset_prod'
-#align smooth_on_finset_sum' smoothOn_finset_sum'
+theorem smoothAt_finprod
+    (lf : LocallyFinite fun i ↦ mulSupport <| f i) (h : ∀ i, SmoothAt I' I (f i) x₀) :
+    SmoothAt I' I (fun x ↦ ∏ᶠ i, f i x) x₀ :=
+  contMDiffWithinAt_finprod lf h
 
 @[to_additive]
-theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
-  contMDiff_finset_prod' h
-#align smooth_finset_prod' smooth_finset_prod'
-#align smooth_finset_sum' smooth_finset_sum'
+theorem smoothWithinAt_finset_prod' (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
+    SmoothWithinAt I' I (∏ i in t, f i) s x :=
+  contMDiffWithinAt_finset_prod' h
+#align smooth_within_at_finset_prod' smoothWithinAt_finset_prod'
+#align smooth_within_at_finset_sum' smoothWithinAt_finset_sum'
 
 @[to_additive]
 theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s x) :
@@ -401,6 +449,13 @@ theorem smoothWithinAt_finset_prod (h : ∀ i ∈ t, SmoothWithinAt I' I (f i) s
 #align smooth_within_at_finset_prod smoothWithinAt_finset_prod
 #align smooth_within_at_finset_sum smoothWithinAt_finset_sum
 
+@[to_additive]
+theorem smoothAt_finset_prod' (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
+    SmoothAt I' I (∏ i in t, f i) x :=
+  contMDiffAt_finset_prod' h
+#align smooth_at_finset_prod' smoothAt_finset_prod'
+#align smooth_at_finset_sum' smoothAt_finset_sum'
+
 @[to_additive]
 theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
     SmoothAt I' I (fun x => ∏ i in t, f i x) x :=
@@ -408,6 +463,13 @@ theorem smoothAt_finset_prod (h : ∀ i ∈ t, SmoothAt I' I (f i) x) :
 #align smooth_at_finset_prod smoothAt_finset_prod
 #align smooth_at_finset_sum smoothAt_finset_sum
 
+@[to_additive]
+theorem smoothOn_finset_prod' (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
+    SmoothOn I' I (∏ i in t, f i) s :=
+  contMDiffOn_finset_prod' h
+#align smooth_on_finset_prod' smoothOn_finset_prod'
+#align smooth_on_finset_sum' smoothOn_finset_sum'
+
 @[to_additive]
 theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
     SmoothOn I' I (fun x => ∏ i in t, f i x) s :=
@@ -415,6 +477,12 @@ theorem smoothOn_finset_prod (h : ∀ i ∈ t, SmoothOn I' I (f i) s) :
 #align smooth_on_finset_prod smoothOn_finset_prod
 #align smooth_on_finset_sum smoothOn_finset_sum
 
+@[to_additive]
+theorem smooth_finset_prod' (h : ∀ i ∈ t, Smooth I' I (f i)) : Smooth I' I (∏ i in t, f i) :=
+  contMDiff_finset_prod' h
+#align smooth_finset_prod' smooth_finset_prod'
+#align smooth_finset_sum' smooth_finset_sum'
+
 @[to_additive]
 theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
     Smooth I' I fun x => ∏ i in t, f i x :=
@@ -422,26 +490,6 @@ theorem smooth_finset_prod (h : ∀ i ∈ t, Smooth I' I (f i)) :
 #align smooth_finset_prod smooth_finset_prod
 #align smooth_finset_sum smooth_finset_sum
 
-open Function Filter
-
-@[to_additive]
-theorem contMDiff_finprod (h : ∀ i, ContMDiff I' I n (f i))
-    (hfin : LocallyFinite fun i => mulSupport (f i)) : ContMDiff I' I n fun x => ∏ᶠ i, f i x := by
-  intro x
-  rcases finprod_eventually_eq_prod hfin x with ⟨s, hs⟩
-  exact (contMDiff_finset_prod (fun i _ => h i) x).congr_of_eventuallyEq hs
-#align cont_mdiff_finprod contMDiff_finprod
-#align cont_mdiff_finsum contMDiff_finsum
-
-@[to_additive]
-theorem contMDiff_finprod_cond (hc : ∀ i, p i → ContMDiff I' I n (f i))
-    (hf : LocallyFinite fun i => mulSupport (f i)) :
-    ContMDiff I' I n fun x => ∏ᶠ (i) (_ : p i), f i x := by
-  simp only [← finprod_subtype_eq_finprod_cond]
-  exact contMDiff_finprod (fun i => hc i i.2) (hf.comp_injective Subtype.coe_injective)
-#align cont_mdiff_finprod_cond contMDiff_finprod_cond
-#align cont_mdiff_finsum_cond contMDiff_finsum_cond
-
 @[to_additive]
 theorem smooth_finprod (h : ∀ i, Smooth I' I (f i))
     (hfin : LocallyFinite fun i => mulSupport (f i)) : Smooth I' I fun x => ∏ᶠ i, f i x :=
chore(*): rename FunLike to DFunLike (#9785)

This prepares for the introduction of a non-dependent synonym of FunLike, which helps a lot with keeping #8386 readable.

This is entirely search-and-replace in 680197f combined with manual fixes in 4145626, e900597 and b8428f8. The commands that generated this change:

sed -i 's/\bFunLike\b/DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoFunLike\b/toDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/import Mathlib.Data.DFunLike/import Mathlib.Data.FunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bHom_FunLike\b/Hom_DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean     
sed -i 's/\binstFunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bfunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoo many metavariables to apply `fun_like.has_coe_to_fun`/too many metavariables to apply `DFunLike.hasCoeToFun`/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean

Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>

Diff
@@ -289,7 +289,7 @@ instance : Inhabited (SmoothMonoidMorphism I I' G G') :=
 @[to_additive]
 instance : MonoidHomClass (SmoothMonoidMorphism I I' G G') G G' where
   coe a := a.toFun
-  coe_injective' f g h := by cases f; cases g; congr; exact FunLike.ext' h
+  coe_injective' f g h := by cases f; cases g; congr; exact DFunLike.ext' h
   map_one f := f.map_one
   map_mul f := f.map_mul
 
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -42,8 +42,8 @@ we formulate the definitions and lemmas for any model.
 /-- Basic hypothesis to talk about a smooth (Lie) additive monoid or a smooth additive
 semigroup. A smooth additive monoid over `α`, for example, is obtained by requiring both the
 instances `AddMonoid α` and `SmoothAdd α`. -/
-class SmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
-    {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
+class SmoothAdd {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H]
+    {E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type*)
     [Add G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_add : Smooth (I.prod I) I fun p : G × G => p.1 + p.2
@@ -54,8 +54,8 @@ class SmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Top
 A smooth monoid over `G`, for example, is obtained by requiring both the instances `Monoid G`
 and `SmoothMul I G`. -/
 @[to_additive]
-class SmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
-    {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
+class SmoothMul {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H]
+    {E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type*)
     [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_mul : Smooth (I.prod I) I fun p : G × G => p.1 * p.2
@@ -63,11 +63,11 @@ class SmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [Top
 
 section SmoothMul
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Mul G]
-  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
-  [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
-  {M : Type _} [TopologicalSpace M] [ChartedSpace H' M]
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H] {E : Type*}
+  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type*} [Mul G]
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type*} [NormedAddCommGroup E']
+  [NormedSpace 𝕜 E'] {H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
+  {M : Type*} [TopologicalSpace M] [ChartedSpace H' M]
 
 section
 
@@ -198,7 +198,7 @@ set_option linter.uppercaseLean3 false in
 #align R_apply R_apply
 
 @[simp]
-theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
+theorem L_mul {G : Type*} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by
   ext
   simp only [ContMDiffMap.comp_apply, L_apply, mul_assoc]
@@ -206,7 +206,7 @@ set_option linter.uppercaseLean3 false in
 #align L_mul L_mul
 
 @[simp]
-theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
+theorem R_mul {G : Type*} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by
   ext
   simp only [ContMDiffMap.comp_apply, R_apply, mul_assoc]
@@ -215,7 +215,7 @@ set_option linter.uppercaseLean3 false in
 
 section
 
-variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [SmoothMul I G']
+variable {G' : Type*} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [SmoothMul I G']
   (g' : G')
 
 theorem smoothLeftMul_one : (𝑳 I g') 1 = g' :=
@@ -230,11 +230,11 @@ end
 
 -- Instance of product
 @[to_additive]
-instance SmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _}
-    [NormedAddCommGroup E] [NormedSpace 𝕜 E] {H : Type _} [TopologicalSpace H]
-    (I : ModelWithCorners 𝕜 E H) (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Mul G]
-    [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type _}
-    [TopologicalSpace H'] (I' : ModelWithCorners 𝕜 E' H') (G' : Type _) [TopologicalSpace G']
+instance SmoothMul.prod {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E : Type*}
+    [NormedAddCommGroup E] [NormedSpace 𝕜 E] {H : Type*} [TopologicalSpace H]
+    (I : ModelWithCorners 𝕜 E H) (G : Type*) [TopologicalSpace G] [ChartedSpace H G] [Mul G]
+    [SmoothMul I G] {E' : Type*} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type*}
+    [TopologicalSpace H'] (I' : ModelWithCorners 𝕜 E' H') (G' : Type*) [TopologicalSpace G']
     [ChartedSpace H' G'] [Mul G'] [SmoothMul I' G'] : SmoothMul (I.prod I') (G × G') :=
   { SmoothManifoldWithCorners.prod G G' with
     smooth_mul :=
@@ -247,11 +247,11 @@ end SmoothMul
 
 section Monoid
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Monoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {H' : Type _} [TopologicalSpace H']
-  {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {I' : ModelWithCorners 𝕜 E' H'}
-  {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [SmoothMul I' G']
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H] {E : Type*}
+  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type*} [Monoid G]
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {H' : Type*} [TopologicalSpace H']
+  {E' : Type*} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {I' : ModelWithCorners 𝕜 E' H'}
+  {G' : Type*} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [SmoothMul I' G']
 
 @[to_additive]
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
@@ -261,8 +261,8 @@ theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
 
 /-- Morphism of additive smooth monoids. -/
 structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [SmoothAdd I G]
-    (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
+    (G : Type*) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [SmoothAdd I G]
+    (G' : Type*) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
     [SmoothAdd I' G'] extends G →+ G' where
   smooth_toFun : Smooth I I' toFun
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
@@ -270,7 +270,7 @@ structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWit
 /-- Morphism of smooth monoids. -/
 @[to_additive]
 structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [SmoothMul I G] (G' : Type _)
+    (G : Type*) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [SmoothMul I G] (G' : Type*)
     [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [SmoothMul I' G'] extends
     G →* G' where
   smooth_toFun : Smooth I I' toFun
@@ -303,11 +303,11 @@ section CommMonoid
 
 open scoped BigOperators
 
-variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [CommMonoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
-  [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
-  {M : Type _} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
+variable {ι 𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H] {E : Type*}
+  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type*} [CommMonoid G]
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type*} [NormedAddCommGroup E']
+  [NormedSpace 𝕜 E'] {H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
+  {M : Type*} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
   {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
 
 @[to_additive]
@@ -461,7 +461,7 @@ end CommMonoid
 
 section
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E : Type*} [NormedAddCommGroup E]
   [NormedSpace 𝕜 E]
 
 instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E :=
@@ -472,12 +472,12 @@ end
 
 section DivConst
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {H : Type*} [TopologicalSpace H] {E : Type*}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H}
-  {G : Type _} [DivInvMonoid G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
-  {E' : Type _} [NormedAddCommGroup E']
-  [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
-  {M : Type _} [TopologicalSpace M] [ChartedSpace H' M]
+  {G : Type*} [DivInvMonoid G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
+  {E' : Type*} [NormedAddCommGroup E']
+  [NormedSpace 𝕜 E'] {H' : Type*} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
+  {M : Type*} [TopologicalSpace M] [ChartedSpace H' M]
 
 variable {f : M → G} {s : Set M} {x : M} {n : ℕ∞} (c : G)
 
feat: groups with zero with a smooth division away from zero (#6069)

We have currently (additive or multiplicative) Lie groups but no typeclass to express that division is smooth away from zero in fields. This PR adds such a typeclass, modelled on the one we already have in topological spaces.

Diff
@@ -469,3 +469,53 @@ instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E :=
 #align has_smooth_add_self hasSmoothAddSelf
 
 end
+
+section DivConst
+
+variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
+  [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H}
+  {G : Type _} [DivInvMonoid G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
+  {E' : Type _} [NormedAddCommGroup E']
+  [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
+  {M : Type _} [TopologicalSpace M] [ChartedSpace H' M]
+
+variable {f : M → G} {s : Set M} {x : M} {n : ℕ∞} (c : G)
+
+@[to_additive]
+theorem ContMDiffWithinAt.div_const (hf : ContMDiffWithinAt I' I n f s x) :
+    ContMDiffWithinAt I' I n (fun x ↦ f x / c) s x := by
+  simpa only [div_eq_mul_inv] using hf.mul contMDiffWithinAt_const
+
+@[to_additive]
+nonrec theorem ContMDiffAt.div_const (hf : ContMDiffAt I' I n f x) :
+    ContMDiffAt I' I n (fun x ↦ f x / c) x :=
+  hf.div_const c
+
+@[to_additive]
+theorem ContMDiffOn.div_const (hf : ContMDiffOn I' I n f s) :
+    ContMDiffOn I' I n (fun x ↦ f x / c) s := fun x hx => (hf x hx).div_const c
+
+@[to_additive]
+theorem ContMDiff.div_const (hf : ContMDiff I' I n f) :
+    ContMDiff I' I n (fun x ↦ f x / c) := fun x => (hf x).div_const c
+
+@[to_additive]
+nonrec theorem SmoothWithinAt.div_const (hf : SmoothWithinAt I' I f s x) :
+  SmoothWithinAt I' I (fun x ↦ f x / c) s x :=
+  hf.div_const c
+
+@[to_additive]
+nonrec theorem SmoothAt.div_const (hf : SmoothAt I' I f x) :
+    SmoothAt I' I (fun x ↦ f x / c) x :=
+  hf.div_const c
+
+@[to_additive]
+nonrec theorem SmoothOn.div_const (hf : SmoothOn I' I f s) :
+    SmoothOn I' I (fun x ↦ f x / c) s :=
+  hf.div_const c
+
+@[to_additive]
+nonrec theorem Smooth.div_const (hf : Smooth I' I f) : Smooth I' I (fun x ↦ f x / c) :=
+  hf.div_const c
+
+end DivConst
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,14 +2,11 @@
 Copyright © 2020 Nicolò Cavalleri. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Nicolò Cavalleri
-
-! This file was ported from Lean 3 source module geometry.manifold.algebra.monoid
-! leanprover-community/mathlib commit e354e865255654389cc46e6032160238df2e0f40
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Geometry.Manifold.ContMDiffMap
 
+#align_import geometry.manifold.algebra.monoid from "leanprover-community/mathlib"@"e354e865255654389cc46e6032160238df2e0f40"
+
 /-!
 # Smooth monoid
 A smooth monoid is a monoid that is also a smooth manifold, in which multiplication is a smooth map
chore: tidy various files (#5469)

Co-authored-by: Scott Morrison <scott@tqft.net>

Diff
@@ -32,7 +32,7 @@ mathematically interesting monoid on a topological manifold such that (a) the sp
 `SmoothManifoldWithCorners`; (b) the multiplication is smooth at `(a, b)` in the charts
 `extChartAt I a`, `extChartAt I b`, `extChartAt I (a * b)`.
 
-2. Because of `ModelProd` we can't assume, e.g., that a `lie_group` is modelled on `𝓘(𝕜, E)`. So,
+2. Because of `ModelProd` we can't assume, e.g., that a `LieGroup` is modelled on `𝓘(𝕜, E)`. So,
 we formulate the definitions and lemmas for any model.
 
 3. While smoothness of an operation implies its continuity, lemmas like
feat: port Geometry.Manifold.Algebra.Structures (#5453)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com>

Diff
@@ -15,8 +15,8 @@ import Mathlib.Geometry.Manifold.ContMDiffMap
 A smooth monoid is a monoid that is also a smooth manifold, in which multiplication is a smooth map
 of the product manifold `G` × `G` into `G`.
 
-In this file we define the basic structures to talk about smooth monoids: `HasSmoothMul` and its
-additive counterpart `HasSmoothAdd`. These structures are general enough to also talk about smooth
+In this file we define the basic structures to talk about smooth monoids: `SmoothMul` and its
+additive counterpart `SmoothAdd`. These structures are general enough to also talk about smooth
 semigroups.
 -/
 
@@ -26,7 +26,7 @@ open scoped Manifold
 library_note "Design choices about smooth algebraic structures"/--
 1. All smooth algebraic structures on `G` are `Prop`-valued classes that extend
 `SmoothManifoldWithCorners I G`. This way we save users from adding both
-`[SmoothManifoldWithCorners I G]` and `[HasSmoothMul I G]` to the assumptions. While many API
+`[SmoothManifoldWithCorners I G]` and `[SmoothMul I G]` to the assumptions. While many API
 lemmas hold true without the `SmoothManifoldWithCorners I G` assumption, we're not aware of a
 mathematically interesting monoid on a topological manifold such that (a) the space is not a
 `SmoothManifoldWithCorners`; (b) the multiplication is smooth at `(a, b)` in the charts
@@ -37,38 +37,38 @@ we formulate the definitions and lemmas for any model.
 
 3. While smoothness of an operation implies its continuity, lemmas like
 `continuousMul_of_smooth` can't be instances becausen otherwise Lean would have to search for
-`HasSmoothMul I G` with unknown `𝕜`, `E`, `H`, and `I : ModelWithCorners 𝕜 E H`. If users needs
+`SmoothMul I G` with unknown `𝕜`, `E`, `H`, and `I : ModelWithCorners 𝕜 E H`. If users needs
 `[ContinuousMul G]` in a proof about a smooth monoid, then they need to either add
 `[ContinuousMul G]` as an assumption (worse) or use `haveI` in the proof (better). -/
 
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) additive monoid or a smooth additive
 semigroup. A smooth additive monoid over `α`, for example, is obtained by requiring both the
-instances `AddMonoid α` and `HasSmoothAdd α`. -/
-class HasSmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
+instances `AddMonoid α` and `SmoothAdd α`. -/
+class SmoothAdd {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
     {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
     [Add G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_add : Smooth (I.prod I) I fun p : G × G => p.1 + p.2
-#align has_smooth_add HasSmoothAdd
+#align has_smooth_add SmoothAdd
 
 -- See note [Design choices about smooth algebraic structures]
 /-- Basic hypothesis to talk about a smooth (Lie) monoid or a smooth semigroup.
 A smooth monoid over `G`, for example, is obtained by requiring both the instances `Monoid G`
-and `HasSmoothMul I G`. -/
+and `SmoothMul I G`. -/
 @[to_additive]
-class HasSmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
+class SmoothMul {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H]
     {E : Type _} [NormedAddCommGroup E] [NormedSpace 𝕜 E] (I : ModelWithCorners 𝕜 E H) (G : Type _)
     [Mul G] [TopologicalSpace G] [ChartedSpace H G] extends SmoothManifoldWithCorners I G :
     Prop where
   smooth_mul : Smooth (I.prod I) I fun p : G × G => p.1 * p.2
-#align has_smooth_mul HasSmoothMul
+#align has_smooth_mul SmoothMul
 
-section HasSmoothMul
+section SmoothMul
 
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Mul G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
   [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
   {M : Type _} [TopologicalSpace M] [ChartedSpace H' M]
 
@@ -78,7 +78,7 @@ variable (I)
 
 @[to_additive]
 theorem smooth_mul : Smooth (I.prod I) I fun p : G × G => p.1 * p.2 :=
-  HasSmoothMul.smooth_mul
+  SmoothMul.smooth_mul
 #align smooth_mul smooth_mul
 #align smooth_add smooth_add
 
@@ -201,7 +201,7 @@ set_option linter.uppercaseLean3 false in
 #align R_apply R_apply
 
 @[simp]
-theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
+theorem L_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑳 I (g * h) = (𝑳 I g).comp (𝑳 I h) := by
   ext
   simp only [ContMDiffMap.comp_apply, L_apply, mul_assoc]
@@ -209,7 +209,7 @@ set_option linter.uppercaseLean3 false in
 #align L_mul L_mul
 
 @[simp]
-theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G]
+theorem R_mul {G : Type _} [Semigroup G] [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G]
     (g h : G) : 𝑹 I (g * h) = (𝑹 I h).comp (𝑹 I g) := by
   ext
   simp only [ContMDiffMap.comp_apply, R_apply, mul_assoc]
@@ -218,7 +218,7 @@ set_option linter.uppercaseLean3 false in
 
 section
 
-variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [HasSmoothMul I G']
+variable {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H G'] [SmoothMul I G']
   (g' : G')
 
 theorem smoothLeftMul_one : (𝑳 I g') 1 = g' :=
@@ -233,29 +233,30 @@ end
 
 -- Instance of product
 @[to_additive]
-instance HasSmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _}
+instance SmoothMul.prod {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _}
     [NormedAddCommGroup E] [NormedSpace 𝕜 E] {H : Type _} [TopologicalSpace H]
     (I : ModelWithCorners 𝕜 E H) (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Mul G]
-    [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type _}
+    [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {H' : Type _}
     [TopologicalSpace H'] (I' : ModelWithCorners 𝕜 E' H') (G' : Type _) [TopologicalSpace G']
-    [ChartedSpace H' G'] [Mul G'] [HasSmoothMul I' G'] : HasSmoothMul (I.prod I') (G × G') :=
+    [ChartedSpace H' G'] [Mul G'] [SmoothMul I' G'] : SmoothMul (I.prod I') (G × G') :=
   { SmoothManifoldWithCorners.prod G G' with
     smooth_mul :=
       ((smooth_fst.comp smooth_fst).smooth.mul (smooth_fst.comp smooth_snd)).prod_mk
         ((smooth_snd.comp smooth_fst).smooth.mul (smooth_snd.comp smooth_snd)) }
-#align has_smooth_mul.prod HasSmoothMul.prod
-#align has_smooth_add.sum HasSmoothAdd.sum
+#align has_smooth_mul.prod SmoothMul.prod
+#align has_smooth_add.sum SmoothAdd.sum
 
-end HasSmoothMul
+end SmoothMul
 
 section Monoid
 
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [Monoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {H' : Type _} [TopologicalSpace H']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {H' : Type _} [TopologicalSpace H']
   {E' : Type _} [NormedAddCommGroup E'] [NormedSpace 𝕜 E'] {I' : ModelWithCorners 𝕜 E' H'}
-  {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [HasSmoothMul I' G']
+  {G' : Type _} [Monoid G'] [TopologicalSpace G'] [ChartedSpace H' G'] [SmoothMul I' G']
 
+@[to_additive]
 theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
   | 0 => by simp only [pow_zero]; exact smooth_const
   | k + 1 => by simpa [pow_succ] using smooth_id.mul (smooth_pow _)
@@ -263,17 +264,17 @@ theorem smooth_pow : ∀ n : ℕ, Smooth I I fun a : G => a ^ n
 
 /-- Morphism of additive smooth monoids. -/
 structure SmoothAddMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [HasSmoothAdd I G]
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [AddMonoid G] [SmoothAdd I G]
     (G' : Type _) [TopologicalSpace G'] [ChartedSpace H' G'] [AddMonoid G']
-    [HasSmoothAdd I' G'] extends G →+ G' where
+    [SmoothAdd I' G'] extends G →+ G' where
   smooth_toFun : Smooth I I' toFun
 #align smooth_add_monoid_morphism SmoothAddMonoidMorphism
 
 /-- Morphism of smooth monoids. -/
 @[to_additive]
 structure SmoothMonoidMorphism (I : ModelWithCorners 𝕜 E H) (I' : ModelWithCorners 𝕜 E' H')
-    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [HasSmoothMul I G] (G' : Type _)
-    [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [HasSmoothMul I' G'] extends
+    (G : Type _) [TopologicalSpace G] [ChartedSpace H G] [Monoid G] [SmoothMul I G] (G' : Type _)
+    [TopologicalSpace G'] [ChartedSpace H' G'] [Monoid G'] [SmoothMul I' G'] extends
     G →* G' where
   smooth_toFun : Smooth I I' toFun
 #align smooth_monoid_morphism SmoothMonoidMorphism
@@ -307,7 +308,7 @@ open scoped BigOperators
 
 variable {ι 𝕜 : Type _} [NontriviallyNormedField 𝕜] {H : Type _} [TopologicalSpace H] {E : Type _}
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] {I : ModelWithCorners 𝕜 E H} {G : Type _} [CommMonoid G]
-  [TopologicalSpace G] [ChartedSpace H G] [HasSmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
+  [TopologicalSpace G] [ChartedSpace H G] [SmoothMul I G] {E' : Type _} [NormedAddCommGroup E']
   [NormedSpace 𝕜 E'] {H' : Type _} [TopologicalSpace H'] {I' : ModelWithCorners 𝕜 E' H'}
   {M : Type _} [TopologicalSpace M] [ChartedSpace H' M] {s : Set M} {x : M} {t : Finset ι}
   {f : ι → M → G} {n : ℕ∞} {p : ι → Prop}
@@ -466,7 +467,7 @@ section
 variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
   [NormedSpace 𝕜 E]
 
-instance hasSmoothAddSelf : HasSmoothAdd 𝓘(𝕜, E) E :=
+instance hasSmoothAddSelf : SmoothAdd 𝓘(𝕜, E) E :=
   ⟨by rw [← modelWithCornersSelf_prod]; exact contDiff_add.contMDiff⟩
 #align has_smooth_add_self hasSmoothAddSelf
 
feat: port Geometry.Manifold.Algebra.Monoid (#5438)

Dependencies 12 + 878

879 files ported (98.7%)
391712 lines ported (98.6%)
Show graph

The unported dependencies are

The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file