Skip to content

Commit dc75ecf

Browse files
committed
refactor: Turn Algebra.IsAlgebraic and Algebra.IsIntegral into classes (#12761)
As [discussed on Zulip](https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/Typeclass.20for.20algebraic.20extension.20of.20fields.3F), this PR replaces the current definition of `Algebra.IsAlgebraic` and `Algebra.IsIntegral` with classes. The following main changes are required: * Since a class must be a structure, we can't identify `Algebra.IsAlgebraic R A` with `∀ (x : A), IsAlgebraic R x`. Either use the projection `.isAlgebraic`, or use the new definition `Algebra.IsAlgebraic.isAlgebraic` which leaves the proof implicit. Idem for integral. * Turn `Algebra.IsAlgebraic` and `Algebra.IsIntegral` arguments into instance implicits; turn theorems with those as the conclusion into instances. * `Algebra.IsAlgebraic` is now `protected`, like `Algebra.IsIntegral`. The spelling `Algebra.IsAlgebraic.isAlgebraic x` and `Algebra.IsIntegral.isIntegral x` to prove an element `x` is algebraic/integral is kind of ugly, do you have better suggestions?
1 parent 4ee2b68 commit dc75ecf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+550
-472
lines changed

Mathlib/AlgebraicGeometry/PrimeSpectrum/Basic.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -721,9 +721,9 @@ theorem comap_singleton_isClosed_of_surjective (f : R →+* S) (hf : Function.Su
721721
theorem comap_singleton_isClosed_of_isIntegral (f : R →+* S) (hf : f.IsIntegral)
722722
(x : PrimeSpectrum S) (hx : IsClosed ({x} : Set (PrimeSpectrum S))) :
723723
IsClosed ({comap f x} : Set (PrimeSpectrum R)) :=
724+
have := (isClosed_singleton_iff_isMaximal x).1 hx
724725
(isClosed_singleton_iff_isMaximal _).2
725-
(Ideal.isMaximal_comap_of_isIntegral_of_isMaximal' f hf x.asIdeal <|
726-
(isClosed_singleton_iff_isMaximal x).1 hx)
726+
(Ideal.isMaximal_comap_of_isIntegral_of_isMaximal' f hf x.asIdeal)
727727
#align prime_spectrum.comap_singleton_is_closed_of_is_integral PrimeSpectrum.comap_singleton_isClosed_of_isIntegral
728728

729729
theorem image_comap_zeroLocus_eq_zeroLocus_comap (hf : Surjective f) (I : Ideal S) :

Mathlib/FieldTheory/Adjoin.lean

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ theorem adjoin_algebraic_toSubalgebra {S : Set E} (hS : ∀ x ∈ S, IsAlgebraic
631631
simp only [isAlgebraic_iff_isIntegral] at hS
632632
have : Algebra.IsIntegral F (Algebra.adjoin F S) := by
633633
rwa [← le_integralClosure_iff_isIntegral, Algebra.adjoin_le_iff]
634-
have := isField_of_isIntegral_of_isField' this (Field.toIsField F)
634+
have : IsField (Algebra.adjoin F S) := isField_of_isIntegral_of_isField' (Field.toIsField F)
635635
rw [← ((Algebra.adjoin F S).toIntermediateField' this).eq_adjoin_of_eq_algebra_adjoin F S] <;> rfl
636636
#align intermediate_field.adjoin_algebraic_to_subalgebra IntermediateField.adjoin_algebraic_toSubalgebra
637637

@@ -675,38 +675,39 @@ theorem le_sup_toSubalgebra : E1.toSubalgebra ⊔ E2.toSubalgebra ≤ (E1 ⊔ E2
675675
sup_le (show E1 ≤ E1 ⊔ E2 from le_sup_left) (show E2 ≤ E1 ⊔ E2 from le_sup_right)
676676
#align intermediate_field.le_sup_to_subalgebra IntermediateField.le_sup_toSubalgebra
677677

678-
theorem sup_toSubalgebra_of_isAlgebraic_right (halg : Algebra.IsAlgebraic K E2) :
678+
theorem sup_toSubalgebra_of_isAlgebraic_right [Algebra.IsAlgebraic K E2] :
679679
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
680680
have : (adjoin E1 (E2 : Set L)).toSubalgebra = _ := adjoin_algebraic_toSubalgebra fun x h ↦
681-
IsAlgebraic.tower_top E1 (isAlgebraic_iff.1 (halg ⟨x, h⟩))
681+
IsAlgebraic.tower_top E1 (isAlgebraic_iff.1
682+
(Algebra.IsAlgebraic.isAlgebraic (⟨x, h⟩ : E2)))
682683
apply_fun Subalgebra.restrictScalars K at this
683684
erw [← restrictScalars_toSubalgebra, restrictScalars_adjoin,
684685
Algebra.restrictScalars_adjoin] at this
685686
exact this
686687

687-
theorem sup_toSubalgebra_of_isAlgebraic_left (halg : Algebra.IsAlgebraic K E1) :
688+
theorem sup_toSubalgebra_of_isAlgebraic_left [Algebra.IsAlgebraic K E1] :
688689
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra := by
689-
have := sup_toSubalgebra_of_isAlgebraic_right E2 E1 halg
690+
have := sup_toSubalgebra_of_isAlgebraic_right E2 E1
690691
rwa [sup_comm (a := E1), sup_comm (a := E1.toSubalgebra)]
691692

692693
/-- The compositum of two intermediate fields is equal to the compositum of them
693694
as subalgebras, if one of them is algebraic over the base field. -/
694695
theorem sup_toSubalgebra_of_isAlgebraic
695696
(halg : Algebra.IsAlgebraic K E1 ∨ Algebra.IsAlgebraic K E2) :
696697
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
697-
halg.elim (sup_toSubalgebra_of_isAlgebraic_left E1 E2)
698-
(sup_toSubalgebra_of_isAlgebraic_right E1 E2)
698+
halg.elim (fun _ ↦ sup_toSubalgebra_of_isAlgebraic_left E1 E2)
699+
(fun _ ↦ sup_toSubalgebra_of_isAlgebraic_right E1 E2)
699700

700701
theorem sup_toSubalgebra_of_left [FiniteDimensional K E1] :
701702
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
702-
sup_toSubalgebra_of_isAlgebraic_left E1 E2 (Algebra.IsAlgebraic.of_finite K _)
703+
sup_toSubalgebra_of_isAlgebraic_left E1 E2
703704
#align intermediate_field.sup_to_subalgebra IntermediateField.sup_toSubalgebra_of_left
704705

705706
@[deprecated] alias sup_toSubalgebra := sup_toSubalgebra_of_left
706707

707708
theorem sup_toSubalgebra_of_right [FiniteDimensional K E2] :
708709
(E1 ⊔ E2).toSubalgebra = E1.toSubalgebra ⊔ E2.toSubalgebra :=
709-
sup_toSubalgebra_of_isAlgebraic_right E1 E2 (Algebra.IsAlgebraic.of_finite K _)
710+
sup_toSubalgebra_of_isAlgebraic_right E1 E2
710711

711712
instance finiteDimensional_sup [FiniteDimensional K E1] [FiniteDimensional K E2] :
712713
FiniteDimensional K (E1 ⊔ E2 : IntermediateField K L) := by
@@ -804,15 +805,16 @@ theorem adjoin_toSubalgebra_of_isAlgebraic (L : IntermediateField F K)
804805
erw [← restrictScalars_toSubalgebra, restrictScalars_adjoin_of_algEquiv i' hi,
805806
Algebra.restrictScalars_adjoin_of_algEquiv i' hi, restrictScalars_adjoin,
806807
Algebra.restrictScalars_adjoin]
807-
exact E'.sup_toSubalgebra_of_isAlgebraic L (halg.imp i'.isAlgebraic id)
808+
exact E'.sup_toSubalgebra_of_isAlgebraic L (halg.imp
809+
(fun (_ : Algebra.IsAlgebraic F E) ↦ i'.isAlgebraic) id)
808810

809811
theorem adjoin_toSubalgebra_of_isAlgebraic_left (L : IntermediateField F K)
810-
(halg : Algebra.IsAlgebraic F E) :
812+
[halg : Algebra.IsAlgebraic F E] :
811813
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K) :=
812814
adjoin_toSubalgebra_of_isAlgebraic E L (Or.inl halg)
813815

814816
theorem adjoin_toSubalgebra_of_isAlgebraic_right (L : IntermediateField F K)
815-
(halg : Algebra.IsAlgebraic F L) :
817+
[halg : Algebra.IsAlgebraic F L] :
816818
(adjoin E (L : Set K)).toSubalgebra = Algebra.adjoin E (L : Set K) :=
817819
adjoin_toSubalgebra_of_isAlgebraic E L (Or.inr halg)
818820

@@ -829,12 +831,12 @@ theorem adjoin_rank_le_of_isAlgebraic (L : IntermediateField F K)
829831
rwa [(Subalgebra.equivOfEq _ _ h).symm.toLinearEquiv.rank_eq] at this
830832

831833
theorem adjoin_rank_le_of_isAlgebraic_left (L : IntermediateField F K)
832-
(halg : Algebra.IsAlgebraic F E) :
834+
[halg : Algebra.IsAlgebraic F E] :
833835
Module.rank E (adjoin E (L : Set K)) ≤ Module.rank F L :=
834836
adjoin_rank_le_of_isAlgebraic E L (Or.inl halg)
835837

836838
theorem adjoin_rank_le_of_isAlgebraic_right (L : IntermediateField F K)
837-
(halg : Algebra.IsAlgebraic F L) :
839+
[halg : Algebra.IsAlgebraic F L] :
838840
Module.rank E (adjoin E (L : Set K)) ≤ Module.rank F L :=
839841
adjoin_rank_le_of_isAlgebraic E L (Or.inr halg)
840842

@@ -905,7 +907,7 @@ theorem exists_finset_of_mem_supr'' {ι : Type*} {f : ι → IntermediateField F
905907
(subset_adjoin F (rootSet (minpoly F x1) E) _)
906908
· rw [IntermediateField.minpoly_eq, Subtype.coe_mk]
907909
· rw [mem_rootSet_of_ne, minpoly.aeval]
908-
exact minpoly.ne_zero (isIntegral_iff.mp (h i ⟨x1, hx1⟩).isIntegral)
910+
exact minpoly.ne_zero (isIntegral_iff.mp (Algebra.IsIntegral.isIntegral (⟨x1, hx1⟩ : f i)))
909911
#align intermediate_field.exists_finset_of_mem_supr'' IntermediateField.exists_finset_of_mem_supr''
910912

911913
theorem exists_finset_of_mem_adjoin {S : Set E} {x : E} (hx : x ∈ adjoin F S) :
@@ -1192,7 +1194,7 @@ variable {F} in
11921194
/-- If `E / F` is an infinite algebraic extension, then there exists an intermediate field
11931195
`L / F` with arbitrarily large finite extension degree. -/
11941196
theorem exists_lt_finrank_of_infinite_dimensional
1195-
(halg : Algebra.IsAlgebraic F E) (hnfd : ¬ FiniteDimensional F E) (n : ℕ) :
1197+
[Algebra.IsAlgebraic F E] (hnfd : ¬ FiniteDimensional F E) (n : ℕ) :
11961198
∃ L : IntermediateField F E, FiniteDimensional F L ∧ n < finrank F L := by
11971199
induction' n with n ih
11981200
· exact ⟨⊥, Subalgebra.finite_bot, finrank_pos⟩
@@ -1202,7 +1204,7 @@ theorem exists_lt_finrank_of_infinite_dimensional
12021204
rw [show L = ⊤ from eq_top_iff.2 fun x _ ↦ hnfd x] at fin
12031205
exact topEquiv.toLinearEquiv.finiteDimensional
12041206
let L' := L ⊔ F⟮x⟯
1205-
haveI := adjoin.finiteDimensional (halg x).isIntegral
1207+
haveI := adjoin.finiteDimensional (Algebra.IsIntegral.isIntegral (R := F) x)
12061208
refine ⟨L', inferInstance, by_contra fun h ↦ ?_⟩
12071209
have h1 : L = L' := eq_of_le_of_finrank_le le_sup_left ((not_lt.1 h).trans hn)
12081210
have h2 : F⟮x⟯ ≤ L' := le_sup_right
@@ -1224,12 +1226,13 @@ theorem _root_.minpoly.degree_le (x : L) [FiniteDimensional K L] :
12241226
theorem isAlgebraic_iSup {ι : Type*} {t : ι → IntermediateField K L}
12251227
(h : ∀ i, Algebra.IsAlgebraic K (t i)) :
12261228
Algebra.IsAlgebraic K (⨆ i, t i : IntermediateField K L) := by
1229+
constructor
12271230
rintro ⟨x, hx⟩
12281231
obtain ⟨s, hx⟩ := exists_finset_of_mem_supr' hx
12291232
rw [isAlgebraic_iff, Subtype.coe_mk, ← Subtype.coe_mk (p := (· ∈ _)) x hx, ← isAlgebraic_iff]
12301233
haveI : ∀ i : Σ i, t i, FiniteDimensional K K⟮(i.2 : L)⟯ := fun ⟨i, x⟩ ↦
1231-
adjoin.finiteDimensional (isIntegral_iff.1 (h i x).isIntegral)
1232-
apply Algebra.IsAlgebraic.of_finite
1234+
adjoin.finiteDimensional (isIntegral_iff.1 (Algebra.IsIntegral.isIntegral x))
1235+
apply IsAlgebraic.of_finite
12331236
#align intermediate_field.is_algebraic_supr IntermediateField.isAlgebraic_iSup
12341237

12351238
theorem isAlgebraic_adjoin {S : Set L} (hS : ∀ x ∈ S, IsIntegral K x) :

Mathlib/FieldTheory/AxGrothendieck.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ open MvPolynomial Finset Function
3131

3232
/-- Any injective polynomial map over an algebraic extension of a finite field is surjective. -/
3333
theorem ax_grothendieck_of_locally_finite {ι K R : Type*} [Field K] [Finite K] [CommRing R]
34-
[Finite ι] [Algebra K R] (alg : Algebra.IsAlgebraic K R) (ps : ι → MvPolynomial ι R)
34+
[Finite ι] [Algebra K R] [Algebra.IsAlgebraic K R] (ps : ι → MvPolynomial ι R)
3535
(hinj : Injective fun v i => MvPolynomial.eval v (ps i)) :
3636
Surjective fun v i => MvPolynomial.eval v (ps i) := by
3737
classical
@@ -48,7 +48,7 @@ theorem ax_grothendieck_of_locally_finite {ι K R : Type*} [Field K] [Finite K]
4848
k ∈ (ps i).support → coeff k (ps i) ∈ Algebra.adjoin K (s : Set R) :=
4949
fun i k hk => Algebra.subset_adjoin
5050
(mem_union_left _ (mem_biUnion.2 ⟨i, mem_univ _, mem_image_of_mem _ hk⟩))
51-
letI := isNoetherian_adjoin_finset s fun x _ => alg.isIntegral x
51+
letI := isNoetherian_adjoin_finset s fun x _ => Algebra.IsIntegral.isIntegral (R := K) x
5252
letI := Module.IsNoetherian.finite K (Algebra.adjoin K (s : Set R))
5353
letI : Finite (Algebra.adjoin K (s : Set R)) :=
5454
FiniteDimensional.finite_of_finite K (Algebra.adjoin K (s : Set R))

Mathlib/FieldTheory/Extension.lean

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ theorem nonempty_algHom_of_adjoin_splits : Nonempty (E →ₐ[F] K) :=
173173
variable {x : E} (hx : x ∈ adjoin F S) {y : K} (hy : aeval y (minpoly F x) = 0)
174174

175175
theorem exists_algHom_adjoin_of_splits_of_aeval : ∃ φ : adjoin F S →ₐ[F] K, φ ⟨x, hx⟩ = y := by
176-
have ix := isAlgebraic_adjoin (fun s hs ↦ (hK s hs).1) ⟨x, hx⟩
176+
have := isAlgebraic_adjoin (fun s hs ↦ (hK s hs).1)
177+
have ix : IsAlgebraic F _ := Algebra.IsAlgebraic.isAlgebraic (⟨x, hx⟩ : adjoin F S)
177178
rw [isAlgebraic_iff_isIntegral, isIntegral_iff] at ix
178179
obtain ⟨φ, hφ⟩ := exists_algHom_adjoin_of_splits hK ((algHomAdjoinIntegralEquiv F ix).symm
179180
⟨y, mem_aroots.mpr ⟨minpoly.ne_zero ix, hy⟩⟩) (adjoin_simple_le_iff.mpr hx)
@@ -207,12 +208,12 @@ of `x` over `F`. -/
207208
theorem Algebra.IsAlgebraic.range_eval_eq_rootSet_minpoly_of_splits {F K : Type*} (L : Type*)
208209
[Field F] [Field K] [Field L] [Algebra F L] [Algebra F K]
209210
(hA : ∀ x : K, (minpoly F x).Splits (algebraMap F L))
210-
(hK : Algebra.IsAlgebraic F K) (x : K) :
211+
[Algebra.IsAlgebraic F K] (x : K) :
211212
(Set.range fun (ψ : K →ₐ[F] L) => ψ x) = (minpoly F x).rootSet L := by
212213
ext a
213-
rw [mem_rootSet_of_ne (minpoly.ne_zero (hK.isIntegral x))]
214+
rw [mem_rootSet_of_ne (minpoly.ne_zero (Algebra.IsIntegral.isIntegral x))]
214215
refine ⟨fun ⟨ψ, hψ⟩ ↦ ?_, fun ha ↦ IntermediateField.exists_algHom_of_splits_of_aeval
215-
(fun x ↦ ⟨hK.isIntegral x, hA x⟩) ha⟩
216+
(fun x ↦ ⟨Algebra.IsIntegral.isIntegral x, hA x⟩) ha⟩
216217
rw [← hψ, Polynomial.aeval_algHom_apply ψ x, minpoly.aeval, map_zero]
217218

218219
end Algebra.IsAlgebraic

Mathlib/FieldTheory/Fixed.lean

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,14 @@ section Finite
275275

276276
variable [Finite G]
277277

278-
instance normal : Normal (FixedPoints.subfield G F) F :=
279-
fun x => (isIntegral G F x).isAlgebraic, fun x =>
278+
instance normal : Normal (FixedPoints.subfield G F) F where
279+
isAlgebraic x := (isIntegral G F x).isAlgebraic
280+
splits' x :=
280281
(Polynomial.splits_id_iff_splits _).1 <| by
281282
cases nonempty_fintype G
282283
rw [← minpoly_eq_minpoly, minpoly, coe_algebraMap, ← Subfield.toSubring_subtype_eq_subtype,
283284
Polynomial.map_toSubring _ (subfield G F).toSubring, prodXSubSMul]
284-
exact Polynomial.splits_prod _ fun _ _ => Polynomial.splits_X_sub_C _
285+
exact Polynomial.splits_prod _ fun _ _ => Polynomial.splits_X_sub_C _
285286
#align fixed_points.normal FixedPoints.normal
286287

287288
instance separable : IsSeparable (FixedPoints.subfield G F) F :=

Mathlib/FieldTheory/IntermediateField.lean

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -834,24 +834,25 @@ theorem minpoly_eq (x : S) : minpoly K x = minpoly K (x : L) :=
834834
end IntermediateField
835835

836836
/-- If `L/K` is algebraic, the `K`-subalgebras of `L` are all fields. -/
837-
def subalgebraEquivIntermediateField (alg : Algebra.IsAlgebraic K L) :
837+
def subalgebraEquivIntermediateField [Algebra.IsAlgebraic K L] :
838838
Subalgebra K L ≃o IntermediateField K L where
839-
toFun S := S.toIntermediateField fun x hx => S.inv_mem_of_algebraic (alg (⟨x, hx⟩ : S))
839+
toFun S := S.toIntermediateField fun x hx => S.inv_mem_of_algebraic
840+
(Algebra.IsAlgebraic.isAlgebraic ((⟨x, hx⟩ : S) : L))
840841
invFun S := S.toSubalgebra
841842
left_inv _ := toSubalgebra_toIntermediateField _ _
842843
right_inv := toIntermediateField_toSubalgebra
843844
map_rel_iff' := Iff.rfl
844845
#align subalgebra_equiv_intermediate_field subalgebraEquivIntermediateField
845846

846847
@[simp]
847-
theorem mem_subalgebraEquivIntermediateField (alg : Algebra.IsAlgebraic K L) {S : Subalgebra K L}
848-
{x : L} : x ∈ subalgebraEquivIntermediateField alg S ↔ x ∈ S :=
848+
theorem mem_subalgebraEquivIntermediateField [Algebra.IsAlgebraic K L] {S : Subalgebra K L}
849+
{x : L} : x ∈ subalgebraEquivIntermediateField S ↔ x ∈ S :=
849850
Iff.rfl
850851
#align mem_subalgebra_equiv_intermediate_field mem_subalgebraEquivIntermediateField
851852

852853
@[simp]
853-
theorem mem_subalgebraEquivIntermediateField_symm (alg : Algebra.IsAlgebraic K L)
854+
theorem mem_subalgebraEquivIntermediateField_symm [Algebra.IsAlgebraic K L]
854855
{S : IntermediateField K L} {x : L} :
855-
x ∈ (subalgebraEquivIntermediateField alg).symm S ↔ x ∈ S :=
856+
x ∈ subalgebraEquivIntermediateField.symm S ↔ x ∈ S :=
856857
Iff.rfl
857858
#align mem_subalgebra_equiv_intermediate_field_symm mem_subalgebraEquivIntermediateField_symm

Mathlib/FieldTheory/IsAlgClosed/AlgebraicClosure.lean

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,11 @@ def ofStepHom (n) : Step k n →ₐ[k] AlgebraicClosureAux k :=
380380
0 n n.zero_le x }
381381
#noalign algebraic_closure.of_step_hom
382382

383-
theorem isAlgebraic : Algebra.IsAlgebraic k (AlgebraicClosureAux k) := fun z =>
384-
IsIntegral.isAlgebraic <|
385-
let ⟨n, x, hx⟩ := exists_ofStep k z
386-
hx ▸ (Step.isIntegral k n x).map (ofStepHom k n)
383+
instance isAlgebraic : Algebra.IsAlgebraic k (AlgebraicClosureAux k) :=
384+
fun z =>
385+
IsIntegral.isAlgebraic <|
386+
let ⟨n, x, hx⟩ := exists_ofStep k z
387+
hx ▸ (Step.isIntegral k n x).map (ofStepHom k n)⟩
387388

388389
@[local instance] theorem isAlgClosure : IsAlgClosure k (AlgebraicClosureAux k) :=
389390
⟨AlgebraicClosureAux.instIsAlgClosed k, isAlgebraic k⟩
@@ -451,10 +452,9 @@ instance isAlgClosed : IsAlgClosed (AlgebraicClosure k) :=
451452

452453
instance : IsAlgClosure k (AlgebraicClosure k) := by
453454
rw [isAlgClosure_iff]
454-
refine ⟨inferInstance, (algEquivAlgebraicClosureAux k).symm.isAlgebraic <|
455-
AlgebraicClosureAux.isAlgebraic _⟩
455+
exact ⟨inferInstance, (algEquivAlgebraicClosureAux k).symm.isAlgebraic⟩
456456

457-
theorem isAlgebraic : Algebra.IsAlgebraic k (AlgebraicClosure k) :=
457+
instance isAlgebraic : Algebra.IsAlgebraic k (AlgebraicClosure k) :=
458458
IsAlgClosure.algebraic
459459
#align algebraic_closure.is_algebraic AlgebraicClosure.isAlgebraic
460460

0 commit comments

Comments
 (0)