Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 0bb5e5d

Browse files
feat(ring_theory/algebra_tower): Artin--Tate lemma (#4282)
Co-authored-by: Rob Lewis <Rob.y.lewis@gmail.com>
1 parent 88187ba commit 0bb5e5d

File tree

7 files changed

+216
-39
lines changed

7 files changed

+216
-39
lines changed

src/field_theory/intermediate_field.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ instance to_algebra : algebra S L :=
210210
S.to_subalgebra.to_algebra
211211

212212
instance : is_scalar_tower K S L :=
213-
is_scalar_tower.subalgebra _ _ S.to_subalgebra
213+
is_scalar_tower.subalgebra' _ _ _ S.to_subalgebra
214214

215215
variables {L' : Type*} [field L'] [algebra K L']
216216

src/linear_algebra/basic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,11 @@ le_antisymm (span_le.2 h₁) h₂
723723
@[simp] lemma span_eq : span R (p : set M) = p :=
724724
span_eq_of_le _ (subset.refl _) subset_span
725725

726+
lemma map_span (f : M →ₗ[R] M₂) (s : set M) :
727+
(span R s).map f = span R (f '' s) :=
728+
eq.symm $ span_eq_of_le _ (set.image_subset f subset_span) $
729+
map_le_iff_le_comap.2 $ span_le.2 $ λ x hx, subset_span ⟨x, hx, rfl⟩
730+
726731
/-- An induction principle for span membership. If `p` holds for 0 and all elements of `s`, and is
727732
preserved under addition and scalar multiplication, then `p` holds for all elements of the span of
728733
`s`. -/

src/linear_algebra/finsupp.lean

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ noncomputable theory
1111

1212
open set linear_map submodule
1313

14-
open_locale classical
14+
open_locale classical big_operators
1515

1616
namespace finsupp
1717

1818
variables {α : Type*} {M : Type*} {N : Type*} {R : Type*}
19-
variables [ring R] [add_comm_group M] [module R M] [add_comm_group N] [module R N]
19+
variables [semiring R] [add_comm_monoid M] [semimodule R M] [add_comm_monoid N] [semimodule R N]
2020

2121
def lsingle (a : α) : M →ₗ[R] (α →₀ M) :=
2222
⟨single a, assume a b, single_add, assume c b, (smul_single _ _ _).symm⟩
@@ -41,7 +41,7 @@ rfl
4141
rfl
4242

4343
@[simp] lemma ker_lsingle (a : α) : (lsingle a : M →ₗ[R] (α →₀ M)).ker = ⊥ :=
44-
ker_eq_bot.2 (single_injective a)
44+
ker_eq_bot_of_injective (single_injective a)
4545

4646
lemma lsingle_range_le_ker_lapply (s t : set α) (h : disjoint s t) :
4747
(⨆a∈s, (lsingle a : M →ₗ[R] (α →₀ M)).range) ≤ (⨅a∈t, ker (lapply a)) :=
@@ -284,7 +284,7 @@ end lmap_domain
284284

285285
section total
286286
variables (α) {α' : Type*} (M) {M' : Type*} (R)
287-
[add_comm_group M'] [module R M']
287+
[add_comm_monoid M'] [semimodule R M']
288288
(v : α → M) {v' : α' → M'}
289289

290290
/-- Interprets (l : α →₀ R) as linear combination of the elements in the family (v : α → M) and
@@ -463,7 +463,7 @@ by simp [lcongr]
463463
end finsupp
464464

465465
variables {R : Type*} {M : Type*} {N : Type*}
466-
variables [ring R] [add_comm_group M] [module R M] [add_comm_group N] [module R N]
466+
variables [semiring R] [add_comm_monoid M] [semimodule R M] [add_comm_monoid N] [semimodule R N]
467467

468468
lemma linear_map.map_finsupp_total
469469
(f : M →ₗ[R] N) {ι : Type*} {g : ι → M} (l : ι →₀ R) :
@@ -496,3 +496,10 @@ begin
496496
have hi : i ∈ s, { rw finset.mem_image, exact ⟨⟨x, hx⟩, finset.mem_univ _, rfl⟩ },
497497
exact hN i hi (hg _),
498498
end
499+
500+
lemma mem_span_finset {s : finset M} {x : M} :
501+
x ∈ span R (↑s : set M) ↔ ∃ f : M → R, ∑ i in s, f i • i = x :=
502+
⟨λ hx, let ⟨v, hvs, hvx⟩ := (finsupp.mem_span_iff_total _).1
503+
(show x ∈ span R (id '' (↑s : set M)), by rwa set.image_id) in
504+
⟨v, hvx ▸ (finsupp.total_apply_of_mem_supported _ hvs).symm⟩,
505+
λ ⟨f, hf⟩, hf ▸ sum_mem _ (λ i hi, smul_mem _ _ $ subset_span hi)⟩

src/ring_theory/adjoin.lean

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ open submodule
2929

3030
namespace algebra
3131

32-
variables {R : Type u} {A : Type v}
32+
variables {R : Type u} {A : Type v} {B : Type w}
3333

3434
section semiring
35-
variables [comm_semiring R] [semiring A]
36-
variables [algebra R A] {s t : set A}
35+
variables [comm_semiring R] [semiring A] [semiring B]
36+
variables [algebra R A] [algebra R B] {s t : set A}
3737
open subsemiring
3838

3939
theorem subset_adjoin : s ⊆ adjoin R s :=
@@ -76,6 +76,11 @@ begin
7676
exact span_le.2 (show monoid.closure s ⊆ adjoin R s, from monoid.closure_subset subset_adjoin)
7777
end
7878

79+
lemma adjoin_image (f : A →ₐ[R] B) (s : set A) :
80+
adjoin R (f '' s) = (adjoin R s).map f :=
81+
le_antisymm (adjoin_le $ set.image_subset _ subset_adjoin) $
82+
subalgebra.map_le.2 $ adjoin_le $ set.image_subset_iff.1 subset_adjoin
83+
7984
end semiring
8085

8186
section comm_semiring
@@ -199,21 +204,44 @@ end algebra
199204

200205
namespace subalgebra
201206

202-
variables {R : Type u} {A : Type v}
203-
variables [comm_ring R] [comm_ring A] [algebra R A]
207+
variables {R : Type u} {A : Type v} {B : Type w}
208+
variables [comm_semiring R] [semiring A] [algebra R A] [semiring B] [algebra R B]
204209

205210
/-- A subalgebra `S` is finitely generated if there exists `t : finset A` such that
206211
`algebra.adjoin R t = S`. -/
207212
def fg (S : subalgebra R A) : Prop :=
208213
∃ t : finset A, algebra.adjoin R ↑t = S
209214

215+
lemma fg_adjoin_finset (s : finset A) : (algebra.adjoin R (↑s : set A)).fg :=
216+
⟨s, rfl⟩
217+
210218
theorem fg_def {S : subalgebra R A} : S.fg ↔ ∃ t : set A, set.finite t ∧ algebra.adjoin R t = S :=
211219
⟨λ ⟨t, ht⟩, ⟨↑t, set.finite_mem_finset t, ht⟩,
212220
λ ⟨t, ht1, ht2⟩, ⟨ht1.to_finset, by rwa set.finite.coe_to_finset⟩⟩
213221

214222
theorem fg_bot : (⊥ : subalgebra R A).fg :=
215223
⟨∅, algebra.adjoin_empty R A⟩
216224

225+
lemma fg_of_submodule_fg (h : (⊤ : submodule R A).fg) : (⊤ : subalgebra R A).fg :=
226+
let ⟨s, hs⟩ := h in ⟨s, to_submodule_injective $
227+
by { rw [algebra.coe_top, eq_top_iff, ← hs, span_le], exact algebra.subset_adjoin }⟩
228+
229+
section
230+
open_locale classical
231+
lemma fg_map (S : subalgebra R A) (f : A →ₐ[R] B) (hs : S.fg) : (S.map f).fg :=
232+
let ⟨s, hs⟩ := hs in ⟨s.image f, by rw [finset.coe_image, algebra.adjoin_image, hs]⟩
233+
end
234+
235+
lemma fg_of_fg_map (S : subalgebra R A) (f : A →ₐ[R] B) (hf : function.injective f)
236+
(hs : (S.map f).fg) : S.fg :=
237+
let ⟨s, hs⟩ := hs in ⟨s.preimage f $ λ _ _ _ _ h, hf h, map_injective f hf $
238+
by { rw [← algebra.adjoin_image, finset.coe_preimage, set.image_preimage_eq_of_subset, hs],
239+
rw [← alg_hom.coe_range, ← algebra.adjoin_le_iff, hs, ← algebra.map_top], exact map_mono le_top }⟩
240+
241+
lemma fg_top (S : subalgebra R A) : (⊤ : subalgebra R S).fg ↔ S.fg :=
242+
⟨λ h, by { rw [← S.range_val, ← algebra.map_top], exact fg_map _ _ h },
243+
λ h, fg_of_fg_map _ S.val subtype.val_injective $ by { rw [algebra.map_top, range_val], exact h }⟩
244+
217245
end subalgebra
218246

219247
variables {R : Type u} {A : Type v} {B : Type w}

src/ring_theory/algebra.lean

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -948,9 +948,9 @@ instance algebra : algebra R S :=
948948
smul_def' := λ c x, subtype.eq $ algebra.smul_def _ _,
949949
.. (algebra_map R A).cod_srestrict S $ λ x, S.range_le ⟨x, rfl⟩ }
950950

951-
instance to_algebra {R : Type u} {A : Type v} [comm_semiring R] [comm_semiring A]
952-
[algebra R A] (S : subalgebra R A) : algebra S A :=
953-
algebra.of_subsemiring _
951+
instance to_algebra {R A B : Type*} [comm_semiring R] [comm_semiring A] [semiring B]
952+
[algebra R A] [algebra A B] (A₀ : subalgebra R A) : algebra A₀ B :=
953+
algebra.of_subsemiring A₀
954954

955955
instance nontrivial [nontrivial A] : nontrivial S :=
956956
subsemiring.nontrivial S
@@ -962,7 +962,8 @@ subsemiring.nontrivial S
962962
def val : S →ₐ[R] A :=
963963
by refine_struct { to_fun := (coe : S → A) }; intros; refl
964964

965-
@[simp]
965+
@[simp] lemma coe_val : (S.val : S → A) = coe := rfl
966+
966967
lemma val_apply (x : S) : S.val x = (x : A) := rfl
967968

968969
/-- Convert a `subalgebra` to `submodule` -/
@@ -1019,10 +1020,18 @@ def comap' (S : subalgebra R B) (f : A →ₐ[R] B) : subalgebra R A :=
10191020
from (f.commutes r).symm ▸ S.algebra_map_mem r,
10201021
.. subsemiring.comap (f : A →+* B) S,}
10211022

1023+
lemma map_mono {S₁ S₂ : subalgebra R A} {f : A →ₐ[R] B} :
1024+
S₁ ≤ S₂ → S₁.map f ≤ S₂.map f :=
1025+
set.image_subset f
1026+
10221027
theorem map_le {S : subalgebra R A} {f : A →ₐ[R] B} {U : subalgebra R B} :
10231028
map S f ≤ U ↔ S ≤ comap' U f :=
10241029
set.image_subset_iff
10251030

1031+
lemma map_injective {S₁ S₂ : subalgebra R A} (f : A →ₐ[R] B)
1032+
(hf : function.injective f) (ih : S₁.map f = S₂.map f) : S₁ = S₂ :=
1033+
ext $ set.ext_iff.1 $ set.image_injective.2 hf $ set.ext $ ext_iff.1 ih
1034+
10261035
lemma mem_map {S : subalgebra R A} {f : A →ₐ[R] B} {y : B} :
10271036
y ∈ map S f ↔ ∃ x ∈ S, f x = y :=
10281037
subsemiring.mem_map
@@ -1160,6 +1169,17 @@ bot_equiv_of_injective (ring_hom.injective _)
11601169

11611170
end algebra
11621171

1172+
namespace subalgebra
1173+
1174+
variables {R : Type u} {A : Type v}
1175+
variables [comm_semiring R] [semiring A] [algebra R A]
1176+
variables (S : subalgebra R A)
1177+
1178+
lemma range_val : S.val.range = S :=
1179+
ext $ set.ext_iff.1 $ S.val.coe_range.trans subtype.range_val
1180+
1181+
end subalgebra
1182+
11631183
section nat
11641184

11651185
variables (R : Type*) [semiring R]

src/ring_theory/algebra_tower.lean

Lines changed: 102 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,22 @@ end semimodule
4747

4848
section semiring
4949
variables [comm_semiring R] [comm_semiring S] [semiring A] [semiring B]
50-
variables [algebra R S] [algebra S A] [algebra R A] [algebra S B] [algebra R B]
51-
variables {R S A}
50+
variables [algebra R S] [algebra S A] [algebra S B]
5251

53-
theorem of_algebra_map_eq (h : ∀ x, algebra_map R A x = algebra_map S A (algebra_map R S x)) :
52+
variables {R S A}
53+
theorem of_algebra_map_eq [algebra R A]
54+
(h : ∀ x, algebra_map R A x = algebra_map S A (algebra_map R S x)) :
5455
is_scalar_tower R S A :=
5556
⟨λ x y z, by simp_rw [algebra.smul_def, ring_hom.map_mul, mul_assoc, h]⟩
5657

58+
variables (R S A)
59+
60+
instance subalgebra (S₀ : subalgebra R S) : is_scalar_tower S₀ S A :=
61+
of_algebra_map_eq $ λ x, rfl
62+
63+
variables [algebra R A] [algebra R B]
5764
variables [is_scalar_tower R S A] [is_scalar_tower R S B]
5865

59-
variables (R S A)
6066
theorem algebra_map_eq :
6167
algebra_map R A = (algebra_map S A).comp (algebra_map R S) :=
6268
ring_hom.ext $ λ x, by simp_rw [ring_hom.comp_apply, algebra.algebra_map_eq_smul_one,
@@ -65,6 +71,10 @@ ring_hom.ext $ λ x, by simp_rw [ring_hom.comp_apply, algebra.algebra_map_eq_smu
6571
theorem algebra_map_apply (x : R) : algebra_map R A x = algebra_map S A (algebra_map R S x) :=
6672
by rw [algebra_map_eq R S A, ring_hom.comp_apply]
6773

74+
instance subalgebra' (S₀ : subalgebra R S) : is_scalar_tower R S₀ A :=
75+
@is_scalar_tower.of_algebra_map_eq R S₀ A _ _ _ _ _ _ $ λ _,
76+
(is_scalar_tower.algebra_map_apply R S A _ : _)
77+
6878
@[ext] lemma algebra.ext {S : Type u} {A : Type v} [comm_semiring S] [semiring A]
6979
(h1 h2 : algebra S A) (h : ∀ {r : S} {x : A}, (by haveI := h1; exact r • x) = r • x) : h1 = h2 :=
7080
begin
@@ -108,10 +118,12 @@ instance comap {R S A : Type*} [comm_semiring R] [comm_semiring S] [semiring A]
108118
[algebra R S] [algebra S A] : is_scalar_tower R S (algebra.comap R S A) :=
109119
of_algebra_map_eq $ λ x, rfl
110120

111-
instance subsemiring (U : subsemiring S) : is_scalar_tower U S A :=
121+
-- conflicts with is_scalar_tower.subalgebra
122+
@[priority 999] instance subsemiring (U : subsemiring S) : is_scalar_tower U S A :=
112123
of_algebra_map_eq $ λ x, rfl
113124

114-
instance subring {S A : Type*} [comm_ring S] [ring A] [algebra S A]
125+
-- conflicts with is_scalar_tower.subalgebra
126+
@[priority 999] instance subring {S A : Type*} [comm_ring S] [ring A] [algebra S A]
115127
(U : set S) [is_subring U] : is_scalar_tower U S A :=
116128
of_algebra_map_eq $ λ x, rfl
117129

@@ -121,21 +133,19 @@ instance of_ring_hom {R A B : Type*} [comm_semiring R] [comm_semiring A] [comm_s
121133
@is_scalar_tower R A B _ (f.to_ring_hom.to_algebra.to_has_scalar) _ :=
122134
by { letI := (f : A →+* B).to_algebra, exact of_algebra_map_eq (λ x, (f.commutes x).symm) }
123135

124-
end semiring
125-
126-
section comm_semiring
127-
variables [comm_semiring R] [comm_semiring A] [algebra R A]
128-
variables [comm_semiring B] [algebra A B] [algebra R B] [is_scalar_tower R A B]
136+
instance polynomial : is_scalar_tower R S (polynomial A) :=
137+
of_algebra_map_eq $ λ x, congr_arg polynomial.C $ algebra_map_apply R S A x
129138

130-
instance subalgebra (S : subalgebra R A) : is_scalar_tower R S A :=
131-
of_algebra_map_eq $ λ x, rfl
139+
variables (R S A)
140+
theorem aeval_apply (x : A) (p : polynomial R) : polynomial.aeval x p =
141+
polynomial.aeval x (polynomial.map (algebra_map R S) p) :=
142+
by rw [polynomial.aeval_def, polynomial.aeval_def, polynomial.eval₂_map, algebra_map_eq R S A]
132143

133-
instance polynomial : is_scalar_tower R A (polynomial B) :=
134-
of_algebra_map_eq $ λ x, congr_arg polynomial.C $ algebra_map_apply R A B x
144+
end semiring
135145

136-
theorem aeval_apply (x : B) (p : polynomial R) : polynomial.aeval x p =
137-
polynomial.aeval x (polynomial.map (algebra_map R A) p) :=
138-
by rw [polynomial.aeval_def, polynomial.aeval_def, polynomial.eval₂_map, algebra_map_eq R A B]
146+
section comm_semiring
147+
variables [comm_semiring R] [comm_semiring A] [comm_semiring B]
148+
variables [algebra R A] [algebra A B] [algebra R B] [is_scalar_tower R A B]
139149

140150
lemma algebra_map_aeval (x : A) (p : polynomial R) :
141151
algebra_map A B (polynomial.aeval x p) = polynomial.aeval (algebra_map A B x) p :=
@@ -246,6 +256,17 @@ by { ext z, exact ⟨λ ⟨⟨x, y, _, h1⟩, h2⟩, ⟨y, h2 ▸ h1⟩, λ ⟨y
246256

247257
end is_scalar_tower
248258

259+
section
260+
open_locale classical
261+
lemma algebra.fg_trans' {R S A : Type*} [comm_ring R] [comm_ring S] [comm_ring A]
262+
[algebra R S] [algebra S A] [algebra R A] [is_scalar_tower R S A]
263+
(hRS : (⊤ : subalgebra R S).fg) (hSA : (⊤ : subalgebra S A).fg) :
264+
(⊤ : subalgebra R A).fg :=
265+
let ⟨s, hs⟩ := hRS, ⟨t, ht⟩ := hSA in ⟨s.image (algebra_map S A) ∪ t,
266+
by rw [finset.coe_union, finset.coe_image, algebra.adjoin_union, algebra.adjoin_algebra_map, hs,
267+
algebra.map_top, is_scalar_tower.range_under_adjoin, ht, subalgebra.res_top]⟩
268+
end
269+
249270
namespace submodule
250271

251272
open is_scalar_tower
@@ -379,3 +400,66 @@ theorem is_basis.smul_repr_mk
379400
by simp [is_basis.smul_repr]
380401

381402
end ring
403+
404+
section artin_tate
405+
406+
variables (C : Type*)
407+
variables [comm_ring A] [comm_ring B] [comm_ring C]
408+
variables [algebra A B] [algebra B C] [algebra A C] [is_scalar_tower A B C]
409+
410+
open finset submodule
411+
open_locale classical
412+
413+
lemma exists_subalgebra_of_fg (hAC : (⊤ : subalgebra A C).fg) (hBC : (⊤ : submodule B C).fg) :
414+
∃ B₀ : subalgebra A B, B₀.fg ∧ (⊤ : submodule B₀ C).fg :=
415+
begin
416+
cases hAC with x hx,
417+
cases hBC with y hy, have := hy,
418+
simp_rw [eq_top_iff', mem_span_finset] at this, choose f hf,
419+
let s : finset B := (finset.product (x ∪ (y * y)) y).image (function.uncurry f),
420+
have hsx : ∀ (xi ∈ x) (yj ∈ y), f xi yj ∈ s := λ xi hxi yj hyj,
421+
show function.uncurry f (xi, yj) ∈ s,
422+
from mem_image_of_mem _ $ mem_product.2 ⟨mem_union_left _ hxi, hyj⟩,
423+
have hsy : ∀ (yi yj yk ∈ y), f (yi * yj) yk ∈ s := λ yi yj yk hyi hyj hyk,
424+
show function.uncurry f (yi * yj, yk) ∈ s,
425+
from mem_image_of_mem _ $ mem_product.2 ⟨mem_union_right _ $ finset.mul_mem_mul hyi hyj, hyk⟩,
426+
have hxy : ∀ xi ∈ x, xi ∈ span (algebra.adjoin A (↑s : set B)) (↑(insert 1 y : finset C) : set C) :=
427+
λ xi hxi, hf xi ▸ sum_mem _ (λ yj hyj, smul_mem
428+
(span (algebra.adjoin A (↑s : set B)) (↑(insert 1 y : finset C) : set C))
429+
⟨f xi yj, algebra.subset_adjoin $ hsx xi hxi yj hyj⟩
430+
(subset_span $ mem_insert_of_mem hyj)),
431+
have hyy : span (algebra.adjoin A (↑s : set B)) (↑(insert 1 y : finset C) : set C) *
432+
span (algebra.adjoin A (↑s : set B)) (↑(insert 1 y : finset C) : set C) ≤
433+
span (algebra.adjoin A (↑s : set B)) (↑(insert 1 y : finset C) : set C),
434+
{ rw [span_mul_span, span_le, coe_insert], rintros _ ⟨yi, yj, rfl | hyi, rfl | hyj, rfl⟩,
435+
{ rw mul_one, exact subset_span (set.mem_insert _ _) },
436+
{ rw one_mul, exact subset_span (set.mem_insert_of_mem _ hyj) },
437+
{ rw mul_one, exact subset_span (set.mem_insert_of_mem _ hyi) },
438+
{ rw ← hf (yi * yj), exact (submodule.mem_coe _).2 (sum_mem _ $ λ yk hyk, smul_mem
439+
(span (algebra.adjoin A (↑s : set B)) (insert 1 ↑y : set C))
440+
⟨f (yi * yj) yk, algebra.subset_adjoin $ hsy yi yj yk hyi hyj hyk⟩
441+
(subset_span $ set.mem_insert_of_mem _ hyk : yk ∈ _)) } },
442+
refine ⟨algebra.adjoin A (↑s : set B), subalgebra.fg_adjoin_finset _, insert 1 y, _⟩,
443+
refine restrict_scalars'_injective _ _ (_ : restrict_scalars' A _ = _),
444+
rw [restrict_scalars'_top, eq_top_iff, ← algebra.coe_top, ← hx, algebra.adjoin_eq_span, span_le],
445+
refine λ r hr, monoid.in_closure.rec_on hr hxy (subset_span $ mem_insert_self _ _)
446+
(λ p q _ _ hp hq, hyy $ submodule.mul_mem_mul hp hq)
447+
end
448+
449+
/-- Artin--Tate lemma: if A ⊆ B ⊆ C is a chain of subrings of commutative rings, and
450+
A is noetherian, and C is algebra-finite over A, and C is module-finite over B,
451+
then B is algebra-finite over A.
452+
453+
References: Atiyah--Macdonald Proposition 7.8; Stacks 00IS; Altman--Kleiman 16.17. -/
454+
theorem fg_of_fg_of_fg [is_noetherian_ring A]
455+
(hAC : (⊤ : subalgebra A C).fg) (hBC : (⊤ : submodule B C).fg)
456+
(hBCi : function.injective (algebra_map B C)) :
457+
(⊤ : subalgebra A B).fg :=
458+
let ⟨B₀, hAB₀, hB₀C⟩ := exists_subalgebra_of_fg A B C hAC hBC in
459+
algebra.fg_trans' (B₀.fg_top.2 hAB₀) $ subalgebra.fg_of_submodule_fg $
460+
have is_noetherian_ring B₀, from is_noetherian_ring_of_fg hAB₀,
461+
have is_noetherian B₀ C, by exactI is_noetherian_of_fg_of_noetherian' hB₀C,
462+
by exactI fg_of_injective (is_scalar_tower.to_alg_hom B₀ B C).to_linear_map
463+
(linear_map.ker_eq_bot.2 hBCi)
464+
465+
end artin_tate

0 commit comments

Comments
 (0)