Skip to content

Commit 3325a31

Browse files
eliasjudinAristotle-Harmoniceric-wieser
committed
refactor(Algebra/MvPolynomial): generalize pUnitAlgEquiv to Unique (leanprover-community#37801)
## Summary Generalizes `MvPolynomial.pUnitAlgEquiv` from `PUnit` to any uniquely inhabited index type as `MvPolynomial.uniqueAlgEquiv`. The old `pUnitAlgEquiv` API is kept as deprecated compatibility aliases, and downstream uses are migrated where appropriate. This PR adds proofs autoformalised by @Aristotle-Harmonic. ## Motivation The equivalence `MvPolynomial σ R ≃ₐ[R] R[X]` only needs `[Unique σ]`, not the specific index type `PUnit`. Co-authored-by: Aristotle (Harmonic) <aristotle-harmonic@harmonic.fun> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Eric Wieser <efw@google.com>
1 parent 67bc64e commit 3325a31

9 files changed

Lines changed: 107 additions & 55 deletions

File tree

Mathlib/Algebra/MvPolynomial/Equiv.lean

Lines changed: 88 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/-
22
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Johannes Hölzl, Johan Commelin, Mario Carneiro
4+
Authors: Johannes Hölzl, Johan Commelin, Mario Carneiro, Elias Judin
55
-/
66
module
77

88
public import Mathlib.Algebra.BigOperators.Finsupp.Fin
9+
public import Mathlib.Algebra.MonoidAlgebra.Basic
910
public import Mathlib.Algebra.MvPolynomial.Degrees
1011
public import Mathlib.Algebra.MvPolynomial.Rename
1112
public import Mathlib.Algebra.Polynomial.AlgebraMap
12-
public import Mathlib.Algebra.MonoidAlgebra.Basic
1313
public import Mathlib.Algebra.Polynomial.Degree.Lemmas
1414
public import Mathlib.Data.Finsupp.Option
1515
public import Mathlib.Logic.Equiv.Fin.Basic
@@ -62,24 +62,24 @@ section Equiv
6262

6363
variable (R) [CommSemiring R]
6464

65-
/-- The ring isomorphism between multivariable polynomials in a single variable and
66-
polynomials over the ground ring.
67-
-/
65+
/-- The algebra isomorphism between multivariable polynomials indexed by a type with a unique
66+
element and polynomials over the ground ring. -/
6867
@[simps]
69-
def pUnitAlgEquiv : MvPolynomial PUnit R ≃ₐ[R] R[X] where
68+
def uniqueAlgEquiv (σ : Type*) [Unique σ] : MvPolynomial σ R ≃ₐ[R] R[X] where
7069
toFun := eval₂ Polynomial.C fun _ => Polynomial.X
71-
invFun := Polynomial.eval₂ MvPolynomial.C (X PUnit.unit)
70+
invFun := Polynomial.eval₂ MvPolynomial.C (X default)
7271
left_inv := by
73-
let f : R[X] →+* MvPolynomial PUnit R := Polynomial.eval₂RingHom MvPolynomial.C (X PUnit.unit)
74-
let g : MvPolynomial PUnit R →+* R[X] := eval₂Hom Polynomial.C fun _ => Polynomial.X
72+
let f : R[X] →+* MvPolynomial σ R := Polynomial.eval₂RingHom MvPolynomial.C (X default)
73+
let g : MvPolynomial σ R →+* R[X] := eval₂Hom Polynomial.C fun _ => Polynomial.X
7574
change ∀ p, f.comp g p = p
7675
apply is_id
7776
· ext a
7877
dsimp [f, g]
7978
rw [eval₂_C, Polynomial.eval₂_C]
80-
· rintro ⟨⟩
79+
· intro i
8180
dsimp [f, g]
8281
rw [eval₂_X, Polynomial.eval₂_X]
82+
rw [← Unique.eq_default i]
8383
right_inv p :=
8484
Polynomial.induction_on p (fun a => by rw [Polynomial.eval₂_C, MvPolynomial.eval₂_C])
8585
(fun p q hp hq => by rw [Polynomial.eval₂_add, MvPolynomial.eval₂_add, hp, hq]) fun p n _ => by
@@ -89,15 +89,34 @@ def pUnitAlgEquiv : MvPolynomial PUnit R ≃ₐ[R] R[X] where
8989
map_add' _ _ := eval₂_add _ _
9090
commutes' _ := eval₂_C _ _ _
9191

92+
theorem uniqueAlgEquiv_monomial [Unique σ] {d : σ →₀ ℕ} {r : R} :
93+
(MvPolynomial.uniqueAlgEquiv R σ) (MvPolynomial.monomial d r)
94+
= Polynomial.monomial (d default) r := by
95+
simp [Polynomial.C_mul_X_pow_eq_monomial]
96+
97+
theorem uniqueAlgEquiv_symm_monomial [Unique σ] {d : σ →₀ ℕ} {r : R} :
98+
(MvPolynomial.uniqueAlgEquiv R σ).symm (Polynomial.monomial (d default) r)
99+
= MvPolynomial.monomial d r := by
100+
simp [MvPolynomial.monomial_eq]
101+
102+
/-- The algebra isomorphism between multivariable polynomials in a single variable and
103+
polynomials over the ground ring. -/
104+
@[deprecated uniqueAlgEquiv (since := "2026-04-15")]
105+
abbrev pUnitAlgEquiv := uniqueAlgEquiv (R := R) PUnit
106+
107+
set_option linter.deprecated false in
108+
@[deprecated uniqueAlgEquiv_monomial (since := "2026-04-15")]
92109
theorem pUnitAlgEquiv_monomial {d : PUnit →₀ ℕ} {r : R} :
93110
MvPolynomial.pUnitAlgEquiv R (MvPolynomial.monomial d r)
94-
= Polynomial.monomial (d ()) r := by
95-
simp [Polynomial.C_mul_X_pow_eq_monomial]
111+
= Polynomial.monomial (d ()) r :=
112+
uniqueAlgEquiv_monomial _
96113

114+
set_option linter.deprecated false in
115+
@[deprecated uniqueAlgEquiv_symm_monomial (since := "2026-04-15")]
97116
theorem pUnitAlgEquiv_symm_monomial {d : PUnit →₀ ℕ} {r : R} :
98117
(MvPolynomial.pUnitAlgEquiv R).symm (Polynomial.monomial (d ()) r)
99-
= MvPolynomial.monomial d r := by
100-
simp [MvPolynomial.monomial_eq]
118+
= MvPolynomial.monomial d r :=
119+
uniqueAlgEquiv_symm_monomial _
101120

102121
section Map
103122

@@ -109,7 +128,8 @@ def mapEquiv [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂) :
109128
AddMonoidAlgebra.mapRingEquiv _ e
110129

111130
@[simp]
112-
lemma mapEquiv_apply [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂) (x : MvPolynomial σ S₁) :
131+
lemma mapEquiv_apply [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂)
132+
(x : MvPolynomial σ S₁) :
113133
mapEquiv σ e x = map e x := rfl
114134

115135
@[simp]
@@ -134,7 +154,8 @@ def mapAlgEquiv (e : A₁ ≃ₐ[R] A₂) : MvPolynomial σ A₁ ≃ₐ[R] MvPol
134154
AddMonoidAlgebra.mapAlgEquiv _ _ e
135155

136156
@[simp]
137-
lemma mapAlgEquiv_apply (e : A₁ ≃ₐ[R] A₂) (x : MvPolynomial σ A₁) : mapAlgEquiv σ e x = map e x :=
157+
lemma mapAlgEquiv_apply (e : A₁ ≃ₐ[R] A₂) (x : MvPolynomial σ A₁) :
158+
mapAlgEquiv σ e x = map e x :=
138159
rfl
139160

140161
@[simp]
@@ -156,29 +177,65 @@ section Eval
156177

157178
variable {R S : Type*} [CommSemiring R] [CommSemiring S]
158179

180+
theorem eval₂_uniqueAlgEquiv [Unique σ] {f : MvPolynomial σ R} {φ : R →+* S}
181+
{a : σ → S} :
182+
((MvPolynomial.uniqueAlgEquiv R σ) f : Polynomial R).eval₂ φ (a default) =
183+
f.eval₂ φ a := by
184+
simp only [MvPolynomial.uniqueAlgEquiv_apply]
185+
induction f using MvPolynomial.induction_on' with
186+
| monomial d r =>
187+
rw [← MvPolynomial.uniqueAlgEquiv_apply (R := R) (σ := σ), uniqueAlgEquiv_monomial]
188+
simp only [Polynomial.eval₂_monomial, eval₂_monomial]
189+
rw [Finsupp.unique_single d, Finsupp.prod_single_index]
190+
· simp
191+
· simp only [pow_zero]
192+
| add f g hf hg => simp only [eval₂_add, Polynomial.eval₂_add, hf, hg]
193+
194+
theorem eval₂_uniqueAlgEquiv_symm [Unique σ] {f : Polynomial R} {φ : R →+* S}
195+
{a : σ → S} :
196+
((MvPolynomial.uniqueAlgEquiv R σ).symm f : MvPolynomial σ R).eval₂ φ a =
197+
f.eval₂ φ (a default) := by
198+
rw [(eval₂_uniqueAlgEquiv (R := R) (σ := σ) (f := (MvPolynomial.uniqueAlgEquiv R σ).symm f)
199+
(φ := φ) (a := a)).symm]
200+
rw [AlgEquiv.apply_symm_apply]
201+
202+
theorem eval₂_const_uniqueAlgEquiv_symm [Unique σ] {f : Polynomial R}
203+
{φ : R →+* S} {a : S} :
204+
((MvPolynomial.uniqueAlgEquiv R σ).symm f : MvPolynomial σ R).eval₂ φ (fun _ ↦ a) =
205+
f.eval₂ φ a := by
206+
rw [eval₂_uniqueAlgEquiv_symm]
207+
208+
theorem eval₂_const_uniqueAlgEquiv [Unique σ] {f : MvPolynomial σ R}
209+
{φ : R →+* S} {a : S} :
210+
((MvPolynomial.uniqueAlgEquiv R σ) f : Polynomial R).eval₂ φ a =
211+
f.eval₂ φ (fun _ ↦ a) := by
212+
rw [← eval₂_uniqueAlgEquiv]
213+
214+
set_option linter.deprecated false in
215+
@[deprecated eval₂_uniqueAlgEquiv_symm (since := "2026-04-15")]
159216
theorem eval₂_pUnitAlgEquiv_symm {f : Polynomial R} {φ : R →+* S} {a : Unit → S} :
160217
((MvPolynomial.pUnitAlgEquiv R).symm f : MvPolynomial Unit R).eval₂ φ a =
161-
f.eval₂ φ (a ()) := by
162-
simp only [MvPolynomial.pUnitAlgEquiv_symm_apply]
163-
induction f using Polynomial.induction_on' with
164-
| add f g hf hg => simp [hf, hg]
165-
| monomial n r => simp
218+
f.eval₂ φ (a ()) :=
219+
eval₂_uniqueAlgEquiv_symm
166220

221+
set_option linter.deprecated false in
222+
@[deprecated eval₂_const_uniqueAlgEquiv_symm (since := "2026-04-15")]
167223
theorem eval₂_const_pUnitAlgEquiv_symm {f : Polynomial R} {φ : R →+* S} {a : S} :
168224
((MvPolynomial.pUnitAlgEquiv R).symm f : MvPolynomial Unit R).eval₂ φ (fun _ ↦ a) =
169-
f.eval₂ φ a := by
170-
rw [eval₂_pUnitAlgEquiv_symm]
225+
f.eval₂ φ a :=
226+
eval₂_const_uniqueAlgEquiv_symm
171227

228+
set_option linter.deprecated false in
229+
@[deprecated eval₂_uniqueAlgEquiv (since := "2026-04-15")]
172230
theorem eval₂_pUnitAlgEquiv {f : MvPolynomial PUnit R} {φ : R →+* S} {a : PUnit → S} :
173-
((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ (a default) = f.eval₂ φ a := by
174-
simp only [MvPolynomial.pUnitAlgEquiv_apply]
175-
induction f using MvPolynomial.induction_on' with
176-
| monomial d r => simp
177-
| add f g hf hg => simp [hf, hg]
231+
((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ (a default) = f.eval₂ φ a :=
232+
eval₂_uniqueAlgEquiv
178233

234+
set_option linter.deprecated false in
235+
@[deprecated eval₂_const_uniqueAlgEquiv (since := "2026-04-15")]
179236
theorem eval₂_const_pUnitAlgEquiv {f : MvPolynomial PUnit R} {φ : R →+* S} {a : S} :
180-
((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ a = f.eval₂ φ (fun _ ↦ a) := by
181-
rw [← eval₂_pUnitAlgEquiv]
237+
((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ a = f.eval₂ φ (fun _ ↦ a) :=
238+
eval₂_const_uniqueAlgEquiv
182239

183240
end Eval
184241

@@ -788,7 +845,7 @@ lemma Polynomial.toMvPolynomial_X (i : σ) : X.toMvPolynomial i = MvPolynomial.X
788845

789846
lemma Polynomial.toMvPolynomial_eq_rename_comp (i : σ) :
790847
toMvPolynomial (R := R) i =
791-
(MvPolynomial.rename (fun _ : Unit ↦ i)).comp (MvPolynomial.pUnitAlgEquiv R).symm := by
848+
(MvPolynomial.rename (fun _ : Unit ↦ i)).comp (MvPolynomial.uniqueAlgEquiv R Unit).symm := by
792849
ext
793850
simp
794851

Mathlib/AlgebraicGeometry/AffineSpace.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ lemma isIntegralHom_over_iff_isEmpty : IsIntegralHom (𝔸(n; S) ↘ S) ↔ IsEm
424424
obtain ⟨p : Polynomial R, hp, hp'⟩ :=
425425
(MorphismProperty.arrow_mk_iso_iff (RingHom.toMorphismProperty RingHom.IsIntegral)
426426
(arrowIsoΓSpecOfIsAffine _)).mpr h.2 (X i)
427-
have : (rename fun _ ↦ i).comp (pUnitAlgEquiv.{_, v} _).symm.toAlgHom p = 0 := by
427+
have : (rename fun _ ↦ i).comp (uniqueAlgEquiv.{_, v} _ PUnit).symm.toAlgHom p = 0 := by
428428
simp [← hp', ← algebraMap_eq]
429429
rw [AlgHom.comp_apply, map_eq_zero_iff _ (rename_injective _ (fun _ _ _ ↦ rfl))] at this
430430
simp only [AlgEquiv.toAlgHom_eq_coe, AlgHom.coe_coe, EmbeddingLike.map_eq_zero_iff] at this

Mathlib/RingTheory/AlgebraicIndependent/TranscendenceBasis.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ theorem IsTranscendenceBasis.polynomial [Nonempty ι] [Subsingleton ι] :
184184
nontriviality R
185185
have := (nonempty_unique ι).some
186186
refine (isTranscendenceBasis_equiv (Equiv.equivPUnit.{_, 1} _).symm).mp <|
187-
(MvPolynomial.pUnitAlgEquiv R).symm.isTranscendenceBasis_iff.mp ?_
187+
(MvPolynomial.uniqueAlgEquiv R PUnit).symm.isTranscendenceBasis_iff.mp ?_
188188
convert IsTranscendenceBasis.mvPolynomial PUnit R
189189
ext; simp
190190

Mathlib/RingTheory/AlgebraicIndependent/Transcendental.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ its element is transcendental. -/
4141
theorem algebraicIndependent_unique_type_iff [Unique ι] :
4242
AlgebraicIndependent R x ↔ Transcendental R (x default) := by
4343
rw [transcendental_iff_injective, algebraicIndependent_iff_injective_aeval]
44-
let i := (renameEquiv R (Equiv.equivPUnit.{_, 1} ι)).trans (pUnitAlgEquiv R)
44+
let i := uniqueAlgEquiv R ι
4545
have key : aeval (R := R) x = (Polynomial.aeval (R := R) (x default)).comp i := by
4646
ext y
4747
simp [i, Subsingleton.elim y default]

Mathlib/RingTheory/FinitePresentation.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ instance self : FinitePresentation R R :=
200200
/-- `R[X]` is finitely presented as `R`-algebra. -/
201201
instance polynomial [FinitePresentation R A] : FinitePresentation R A[X] :=
202202
letI := FinitePresentation.mvPolynomial R A Unit
203-
have := equiv (MvPolynomial.pUnitAlgEquiv.{_, 0} A)
203+
have := equiv (MvPolynomial.uniqueAlgEquiv.{_, 0} A PUnit)
204204
.trans _ A _
205205

206206
open MvPolynomial

Mathlib/RingTheory/FreeCommRing.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ noncomputable alias freeCommRingPemptyEquivInt := freeCommRingPEmptyEquivInt
410410

411411
/-- The free commutative ring on a type with one term is isomorphic to `ℤ[X]`. -/
412412
def freeCommRingPUnitEquivPolynomialInt : FreeCommRing PUnit.{u + 1} ≃+* ℤ[X] :=
413-
(freeCommRingEquivMvPolynomialInt _).trans (MvPolynomial.pUnitAlgEquiv ℤ).toRingEquiv
413+
(freeCommRingEquivMvPolynomialInt _).trans (MvPolynomial.uniqueAlgEquiv ℤ PUnit).toRingEquiv
414414

415415
@[deprecated (since := "2026-02-08")]
416416
noncomputable alias freeCommRingPunitEquivPolynomialInt := freeCommRingPUnitEquivPolynomialInt

Mathlib/RingTheory/PowerSeries/Basic.lean

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -858,21 +858,22 @@ section CommSemiring
858858
variable {R : Type*} [CommSemiring R] (φ ψ : R[X])
859859

860860
theorem _root_.MvPolynomial.toMvPowerSeries_pUnitAlgEquiv {f : MvPolynomial PUnit R} :
861-
(f.toMvPowerSeries : PowerSeries R) = (f.pUnitAlgEquiv R).toPowerSeries := by
861+
(f.toMvPowerSeries : PowerSeries R) =
862+
(MvPolynomial.uniqueAlgEquiv R PUnit f).toPowerSeries := by
862863
induction f using MvPolynomial.induction_on' with
863864
| monomial d r =>
864865
--Note: this `have` should be a generic `simp` lemma for a `Unique` type with `()` replaced
865866
--by any element.
866867
have : single () (d ()) = d := by ext; simp
867-
simp only [MvPolynomial.coe_monomial, MvPolynomial.pUnitAlgEquiv_monomial,
868+
simp only [MvPolynomial.coe_monomial, MvPolynomial.uniqueAlgEquiv_monomial,
868869
Polynomial.coe_monomial, PowerSeries.monomial, this]
869870
| add f g hf hg => simp [hf, hg]
870871

871872
theorem pUnitAlgEquiv_symm_toPowerSeries {f : Polynomial R} :
872873
((f.toPowerSeries) : MvPowerSeries PUnit R)
873-
= ((MvPolynomial.pUnitAlgEquiv R).symm f).toMvPowerSeries := by
874-
set g := (MvPolynomial.pUnitAlgEquiv R).symm f
875-
have : f = MvPolynomial.pUnitAlgEquiv R g := by simp only [g, AlgEquiv.apply_symm_apply]
874+
= ((MvPolynomial.uniqueAlgEquiv R PUnit).symm f).toMvPowerSeries := by
875+
set g := (MvPolynomial.uniqueAlgEquiv R PUnit).symm f
876+
have : f = MvPolynomial.uniqueAlgEquiv R PUnit g := by simp only [g, AlgEquiv.apply_symm_apply]
876877
rw [this, MvPolynomial.toMvPowerSeries_pUnitAlgEquiv]
877878

878879
variable (A : Type*) [Semiring A] [Algebra R A]

Mathlib/RingTheory/PowerSeries/Evaluation.lean

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,8 @@ noncomputable def eval₂ : PowerSeries R → S :=
134134

135135
@[simp]
136136
theorem eval₂_coe (f : Polynomial R) : eval₂ φ a f = f.eval₂ φ a := by
137-
let g : MvPolynomial Unit R := (MvPolynomial.pUnitAlgEquiv R).symm f
138-
have : f = MvPolynomial.pUnitAlgEquiv R g := by
139-
simp only [g, ← AlgEquiv.symm_apply_eq]
140-
simp only [this, PowerSeries.eval₂, MvPolynomial.eval₂_const_pUnitAlgEquiv]
137+
rw [← (MvPolynomial.uniqueAlgEquiv R Unit).apply_symm_apply f]
138+
simp only [PowerSeries.eval₂, MvPolynomial.eval₂_const_uniqueAlgEquiv]
141139
rw [← MvPolynomial.toMvPowerSeries_pUnitAlgEquiv, MvPowerSeries.eval₂_coe]
142140

143141
@[simp]
@@ -194,21 +192,17 @@ theorem eval₂_unique (hφ : Continuous φ) (ha : HasEval a)
194192
{ε : PowerSeries R → S} (hε : Continuous ε)
195193
(h : ∀ p : Polynomial R, ε p = Polynomial.eval₂ φ a p) :
196194
ε = eval₂ φ a := by
197-
apply MvPowerSeries.eval₂_unique hφ (hasEval ha) hε
198-
intro p
199-
rw [MvPolynomial.toMvPowerSeries_pUnitAlgEquiv, h, ← MvPolynomial.eval₂_pUnitAlgEquiv]
195+
refine MvPowerSeries.eval₂_unique hφ (hasEval ha) hε (fun p ↦ ?_)
196+
rw [MvPolynomial.toMvPowerSeries_pUnitAlgEquiv, h, ← MvPolynomial.eval₂_uniqueAlgEquiv]
200197

201198
theorem comp_eval₂ (hφ : Continuous φ) (ha : HasEval a)
202199
{T : Type*} [UniformSpace T] [CompleteSpace T] [T2Space T]
203200
[CommRing T] [IsTopologicalRing T] [IsLinearTopology T T] [IsUniformAddGroup T]
204201
{ε : S →+* T} (hε : Continuous ε) :
205202
ε ∘ eval₂ φ a = eval₂ (ε.comp φ) (ε a) := by
206-
apply eval₂_unique _ (ha.map hε)
207-
· exact Continuous.comp hε (continuous_eval₂ hφ ha)
208-
· intro p
209-
simp only [Function.comp_apply, eval₂_coe]
210-
exact Polynomial.hom_eval₂ p φ ε a
211-
· simp only [RingHom.coe_comp, Continuous.comp hε hφ]
203+
refine eval₂_unique (by simp only [RingHom.coe_comp, hε.comp hφ]) (ha.map hε)
204+
(hε.comp (continuous_eval₂ hφ ha)) (fun p ↦ ?_)
205+
simpa [Function.comp_apply, eval₂_coe] using p.hom_eval₂ φ ε a
212206

213207
variable [Algebra R S] [ContinuousSMul R S]
214208

Mathlib/RingTheory/Smooth/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ section Polynomial
394394

395395
open scoped Polynomial in
396396
instance polynomial (R : Type*) [CommRing R] :
397-
FormallySmooth R R[X] := .of_equiv (MvPolynomial.pUnitAlgEquiv.{_, 0} R)
397+
FormallySmooth R R[X] := .of_equiv (MvPolynomial.uniqueAlgEquiv.{_, 0} R PUnit)
398398

399399
instance : FormallySmooth R R := .of_equiv (MvPolynomial.isEmptyAlgEquiv R Empty)
400400

0 commit comments

Comments
 (0)