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

Commit 516b0df

Browse files
committed
refactor(ring_theory/algebra): re-bundle subalgebra (#4180)
This PR makes `subalgebra` extend `subsemiring` instead of using `subsemiring` as a field in its definition. The refactor is needed because `intermediate_field` should simultaneously extend `subalgebra` and `subfield`, and so the type of the `carrier` fields should match. I added some copies of definitions that use `subring` instead of `is_subring` if I needed to change these definitions anyway.
1 parent d09ef4a commit 516b0df

File tree

13 files changed

+144
-80
lines changed

13 files changed

+144
-80
lines changed

src/algebra/category/Algebra/limits.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ The flat sections of a functor into `Algebra R` form a submodule of all sections
3939
-/
4040
def sections_subalgebra (F : J ⥤ Algebra R) :
4141
subalgebra R (Π j, F.obj j) :=
42-
{ carrier := SemiRing.sections_subsemiring (F ⋙ forget₂ (Algebra R) Ring ⋙ forget₂ Ring SemiRing),
43-
algebra_map_mem' := λ r j j' f, (F.map f).commutes r, }
42+
{ algebra_map_mem' := λ r j j' f, (F.map f).commutes r,
43+
..SemiRing.sections_subsemiring (F ⋙ forget₂ (Algebra R) Ring ⋙ forget₂ Ring SemiRing) }
4444

4545

4646
instance limit_semiring (F : J ⥤ Algebra R) :

src/field_theory/adjoin.lean

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@ variables (F : Type*) [field F] {E : Type*} [field E] [algebra F E] (S : set E)
3232
`adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`.
3333
-/
3434
def adjoin : subalgebra F E :=
35-
{ carrier :=
36-
{ carrier := field.closure (set.range (algebra_map F E) ∪ S),
37-
one_mem' := is_submonoid.one_mem,
38-
mul_mem' := λ x y, is_submonoid.mul_mem,
39-
zero_mem' := is_add_submonoid.zero_mem,
40-
add_mem' := λ x y, is_add_submonoid.add_mem },
35+
{ carrier := field.closure (set.range (algebra_map F E) ∪ S),
36+
one_mem' := is_submonoid.one_mem,
37+
mul_mem' := λ x y, is_submonoid.mul_mem,
38+
zero_mem' := is_add_submonoid.zero_mem,
39+
add_mem' := λ x y, is_add_submonoid.add_mem,
4140
algebra_map_mem' := λ x, field.mem_closure (or.inl (set.mem_range.mpr ⟨x,rfl⟩)) }
4241

4342
lemma adjoin.algebra_map_mem (x : F) : algebra_map F E x ∈ adjoin F S :=

src/field_theory/fixed.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ polynomial.induction_on p
6464
(λ n x ih, by rw [smul_mul', polynomial.smul_C, smul, smul_pow, polynomial.smul_X])
6565

6666
instance : algebra (fixed_points G F) F :=
67-
algebra.of_subring _
67+
algebra.of_is_subring _
6868

6969
theorem coe_algebra_map :
7070
algebra_map (fixed_points G F) F = is_subring.subtype (fixed_points G F) :=

src/field_theory/splitting_field.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,11 @@ alg_equiv.symm $ alg_equiv.of_bijective
328328
(alg_hom.cod_restrict
329329
(adjoin_root.alg_hom _ x $ minimal_polynomial.aeval hx) _
330330
(λ p, adjoin_root.induction_on _ p $ λ p,
331-
(algebra.adjoin_singleton_eq_range F x).symm ▸ ⟨p, rfl⟩))
331+
(algebra.adjoin_singleton_eq_range F x).symm ▸ (polynomial.aeval _).mem_range.mpr ⟨p, rfl⟩))
332332
⟨(alg_hom.injective_cod_restrict _ _ _).2 $ (alg_hom.injective_iff _).2 $ λ p,
333333
adjoin_root.induction_on _ p $ λ p hp, ideal.quotient.eq_zero_iff_mem.2 $
334334
ideal.mem_span_singleton.2 $ minimal_polynomial.dvd hx hp,
335-
λ y, let ⟨p, hp⟩ := (subalgebra.ext_iff.1 (algebra.adjoin_singleton_eq_range F x) y).1 y.2 in
335+
λ y, let ⟨p, _, hp⟩ := (subalgebra.ext_iff.1 (algebra.adjoin_singleton_eq_range F x) y).1 y.2 in
336336
⟨adjoin_root.mk _ p, subtype.eq hp⟩⟩
337337

338338
open finset

src/field_theory/subfield.lean

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ subfield, subfields
6161
open_locale big_operators
6262
universes u v w
6363

64-
open group
6564
variables {K : Type u} {L : Type v} {M : Type w} [field K] [field L] [field M]
6665

6766
set_option old_structure_cmd true

src/ring_theory/adjoin.lean

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,20 @@ le_antisymm
9696
theorem adjoin_eq_range :
9797
adjoin R s = (mv_polynomial.aeval (coe : s → A)).range :=
9898
le_antisymm
99-
(adjoin_le $ λ x hx, ⟨mv_polynomial.X ⟨x, hx⟩, mv_polynomial.eval₂_X _ _ _⟩)
100-
(λ x ⟨p, hp⟩, hp ▸ mv_polynomial.induction_on p
101-
(λ r, by rw [mv_polynomial.aeval_def, mv_polynomial.eval₂_C]; exact (adjoin R s).2 r)
99+
(adjoin_le $ λ x hx, ⟨mv_polynomial.X ⟨x, hx⟩, set.mem_univ _, mv_polynomial.eval₂_X _ _ _⟩)
100+
(λ x ⟨p, _, (hp : mv_polynomial.aeval coe p = x)⟩, hp ▸ mv_polynomial.induction_on p
101+
(λ r, by { rw [mv_polynomial.aeval_def, mv_polynomial.eval₂_C],
102+
exact (adjoin R s).algebra_map_mem r })
102103
(λ p q hp hq, by rw alg_hom.map_add; exact is_add_submonoid.add_mem hp hq)
103104
(λ p ⟨n, hn⟩ hp, by rw [alg_hom.map_mul, mv_polynomial.aeval_def _ (mv_polynomial.X _),
104105
mv_polynomial.eval₂_X]; exact is_submonoid.mul_mem hp (subset_adjoin hn)))
105106

106107
theorem adjoin_singleton_eq_range (x : A) : adjoin R {x} = (polynomial.aeval x).range :=
107108
le_antisymm
108-
(adjoin_le $ set.singleton_subset_iff.2 ⟨polynomial.X, polynomial.eval₂_X _ _⟩)
109-
(λ y ⟨p, hp⟩, hp ▸ polynomial.induction_on p
110-
(λ r, by rw [polynomial.aeval_def, polynomial.eval₂_C]; exact (adjoin R _).2 r)
109+
(adjoin_le $ set.singleton_subset_iff.2 ⟨polynomial.X, set.mem_univ _, polynomial.eval₂_X _ _⟩)
110+
(λ y ⟨p, _, (hp : polynomial.aeval x p = y)⟩, hp ▸ polynomial.induction_on p
111+
(λ r, by { rw [polynomial.aeval_def, polynomial.eval₂_C],
112+
exact (adjoin R _).algebra_map_mem r })
111113
(λ p q hp hq, by rw alg_hom.map_add; exact is_add_submonoid.add_mem hp hq)
112114
(λ n r ih, by { rw [pow_succ', ← mul_assoc, alg_hom.map_mul,
113115
polynomial.aeval_def _ polynomial.X, polynomial.eval₂_X],
@@ -128,7 +130,7 @@ variables [algebra R A] {s t : set A}
128130
variables {R s t}
129131
open ring
130132

131-
theorem adjoin_int (s : set R) : adjoin ℤ s = subalgebra_of_subring (closure s) :=
133+
theorem adjoin_int (s : set R) : adjoin ℤ s = subalgebra_of_is_subring (closure s) :=
132134
le_antisymm (adjoin_le subset_closure) (closure_subset subset_adjoin)
133135

134136
theorem mem_adjoin_iff {s : set A} {x : A} :
@@ -231,5 +233,5 @@ convert alg_hom.is_noetherian_ring_range _; apply_instance
231233

232234
theorem is_noetherian_ring_closure (s : set R) (hs : s.finite) :
233235
is_noetherian_ring (ring.closure s) :=
234-
show is_noetherian_ring (subalgebra_of_subring (ring.closure s)), from
236+
show is_noetherian_ring (subalgebra_of_is_subring (ring.closure s)), from
235237
algebra.adjoin_int s ▸ is_noetherian_ring_of_fg (subalgebra.fg_def.2 ⟨s, hs, rfl⟩)

src/ring_theory/adjoin_root.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ polynomial.induction_on p (λ x, by { rw aeval_C, refl })
9292

9393
theorem adjoin_root_eq_top : algebra.adjoin R ({root f} : set (adjoin_root f)) = ⊤ :=
9494
algebra.eq_top_iff.2 $ λ x, induction_on f x $ λ p,
95-
(algebra.adjoin_singleton_eq_range R (root f)).symm ▸ ⟨p, aeval_eq p⟩
95+
(algebra.adjoin_singleton_eq_range R (root f)).symm ▸ ⟨p, set.mem_univ _, aeval_eq p⟩
9696

9797
@[simp] lemma eval₂_root (f : polynomial R) : f.eval₂ (of f) (root f) = 0 :=
9898
by rw [← algebra_map_eq, ← aeval_def, aeval_eq, mk_self]

src/ring_theory/algebra.lean

Lines changed: 86 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Kenny Lau, Yury Kudryashov
55
-/
66
import data.matrix.basic
77
import linear_algebra.tensor_product
8-
import ring_theory.subsemiring
8+
import ring_theory.subring
99
import deprecated.subring
1010

1111
/-!
@@ -187,19 +187,33 @@ instance of_subsemiring (S : subsemiring R) : algebra S A :=
187187

188188
/-- Algebra over a subring. -/
189189
instance of_subring {R A : Type*} [comm_ring R] [ring A] [algebra R A]
190-
(S : set R) [is_subring S] : algebra S A :=
190+
(S : subring R) : algebra S A :=
191191
{ smul := λ s x, (s : R) • x,
192192
commutes' := λ r x, algebra.commutes r x,
193193
smul_def' := λ r x, algebra.smul_def r x,
194-
.. (algebra_map R A).comp (⟨coe, rfl, λ _ _, rfl, rfl, λ _ _, rfl⟩ : S →+* R) }
194+
.. (algebra_map R A).comp (subring.subtype S) }
195+
196+
lemma algebra_map_of_subring {R : Type*} [comm_ring R] (S : subring R) :
197+
(algebra_map S R : S →+* R) = subring.subtype S := rfl
198+
199+
lemma coe_algebra_map_of_subring {R : Type*} [comm_ring R] (S : subring R) :
200+
(algebra_map S R : S → R) = subtype.val := rfl
201+
202+
lemma algebra_map_of_subring_apply {R : Type*} [comm_ring R] (S : subring R) (x : S) :
203+
algebra_map S R x = x := rfl
195204

196-
lemma subring_coe_algebra_map_hom {R : Type*} [comm_ring R] (S : set R) [is_subring S] :
205+
/-- Algebra over a set that is closed under the ring operations. -/
206+
instance of_is_subring {R A : Type*} [comm_ring R] [ring A] [algebra R A]
207+
(S : set R) [is_subring S] : algebra S A :=
208+
algebra.of_subring S.to_subring
209+
210+
lemma is_subring_coe_algebra_map_hom {R : Type*} [comm_ring R] (S : set R) [is_subring S] :
197211
(algebra_map S R : S →+* R) = is_subring.subtype S := rfl
198212

199-
lemma subring_coe_algebra_map {R : Type*} [comm_ring R] (S : set R) [is_subring S] :
213+
lemma is_subring_coe_algebra_map {R : Type*} [comm_ring R] (S : set R) [is_subring S] :
200214
(algebra_map S R : S → R) = subtype.val := rfl
201215

202-
lemma subring_algebra_map_apply {R : Type*} [comm_ring R] (S : set R) [is_subring S] (x : S) :
216+
lemma is_subring_algebra_map_apply {R : Type*} [comm_ring R] (S : set R) [is_subring S] (x : S) :
203217
algebra_map S R x = x := rfl
204218

205219
lemma set_range_subset {R : Type*} [comm_ring R] {T₁ T₂ : set R} [is_subring T₁] (hyp : T₁ ⊆ T₂) :
@@ -471,6 +485,19 @@ variables [algebra R A] [algebra R B] [algebra R C] (φ : A →ₐ[R] B)
471485

472486
end ring
473487

488+
section division_ring
489+
490+
variables [comm_ring R] [division_ring A] [division_ring B]
491+
variables [algebra R A] [algebra R B] (φ : A →ₐ[R] B)
492+
493+
@[simp] lemma map_inv (x) : φ (x⁻¹) = (φ x)⁻¹ :=
494+
φ.to_ring_hom.map_inv x
495+
496+
@[simp] lemma map_div (x y) : φ (x / y) = φ x / φ y :=
497+
φ.to_ring_hom.map_div x y
498+
499+
end division_ring
500+
474501
theorem injective_iff {R A B : Type*} [comm_semiring R] [ring A] [semiring B]
475502
[algebra R A] [algebra R B] (f : A →ₐ[R] B) :
476503
function.injective f ↔ (∀ x, f x = 0 → x = 0) :=
@@ -744,20 +771,22 @@ instance algebra_rat {α} [division_ring α] [char_zero α] : algebra ℚ α :=
744771

745772
end rat
746773

747-
/-- A subalgebra is a subring that includes the range of `algebra_map`. -/
774+
/-- A subalgebra is a sub(semi)ring that includes the range of `algebra_map`. -/
748775
structure subalgebra (R : Type u) (A : Type v)
749-
[comm_semiring R] [semiring A] [algebra R A] : Type v :=
750-
(carrier : subsemiring A)
776+
[comm_semiring R] [semiring A] [algebra R A] extends subsemiring A : Type v :=
751777
(algebra_map_mem' : ∀ r, algebra_map R A r ∈ carrier)
752778

779+
/-- Reinterpret a `subalgebra` as a `subsemiring`. -/
780+
add_decl_doc subalgebra.to_subsemiring
781+
753782
namespace subalgebra
754783

755784
variables {R : Type u} {A : Type v} {B : Type w}
756785
variables [comm_semiring R] [semiring A] [algebra R A] [semiring B] [algebra R B]
757786
include R
758787

759788
instance : has_coe (subalgebra R A) (subsemiring A) :=
760-
⟨λ S, S.carrier
789+
⟨λ S, { ..S }
761790

762791
instance : has_mem A (subalgebra R A) :=
763792
⟨λ x S, x ∈ (S : set A)⟩
@@ -859,6 +888,12 @@ instance {R : Type u} {A : Type v} [comm_semiring R] [semiring A] [algebra R A]
859888
{ one_mem := S.one_mem,
860889
mul_mem := λ _ _, S.mul_mem }
861890

891+
/-- A subalgebra over a ring is also a `subring`. -/
892+
def to_subring {R : Type u} {A : Type v} [comm_ring R] [ring A] [algebra R A] (S : subalgebra R A) :
893+
subring A :=
894+
{ neg_mem' := λ _, S.neg_mem,
895+
.. S.to_subsemiring }
896+
862897
instance {R : Type u} {A : Type v} [comm_ring R] [ring A] [algebra R A] (S : subalgebra R A) :
863898
is_subring (S : set A) :=
864899
{ neg_mem := λ _, S.neg_mem }
@@ -928,27 +963,27 @@ instance : partial_order (subalgebra R A) :=
928963
def comap {R : Type u} {S : Type v} {A : Type w}
929964
[comm_semiring R] [comm_semiring S] [semiring A] [algebra R S] [algebra S A]
930965
(iSB : subalgebra S A) : subalgebra R (algebra.comap R S A) :=
931-
{ carrier := (iSB : subsemiring A),
932-
algebra_map_mem' := λ r, iSB.algebra_map_mem (algebra_map R S r) }
966+
{ algebra_map_mem' := λ r, iSB.algebra_map_mem (algebra_map R S r),
967+
.. iSB }
933968

934969
/-- If `S` is an `R`-subalgebra of `A` and `T` is an `S`-subalgebra of `A`,
935970
then `T` is an `R`-subalgebra of `A`. -/
936971
def under {R : Type u} {A : Type v} [comm_semiring R] [comm_semiring A]
937972
{i : algebra R A} (S : subalgebra R A)
938973
(T : subalgebra S A) : subalgebra R A :=
939-
{ carrier := T,
940-
algebra_map_mem' := λ r, T.algebra_map_mem ⟨algebra_map R A r, S.algebra_map_mem r⟩ }
974+
{ algebra_map_mem' := λ r, T.algebra_map_mem ⟨algebra_map R A r, S.algebra_map_mem r⟩,
975+
.. T }
941976

942977
/-- Transport a subalgebra via an algebra homomorphism. -/
943978
def map (S : subalgebra R A) (f : A →ₐ[R] B) : subalgebra R B :=
944-
{ carrier := subsemiring.map (f : A →+* B) S,
945-
algebra_map_mem' := λ r, f.commutes r ▸ set.mem_image_of_mem _ (S.algebra_map_mem r) }
979+
{ algebra_map_mem' := λ r, f.commutes r ▸ set.mem_image_of_mem _ (S.algebra_map_mem r),
980+
.. subsemiring.map (f : A →+* B) S,}
946981

947982
/-- Preimage of a subalgebra under an algebra homomorphism. -/
948983
def comap' (S : subalgebra R B) (f : A →ₐ[R] B) : subalgebra R A :=
949-
{ carrier := subsemiring.comap (f : A →+* B) S,
950-
algebra_map_mem' := λ r, show f (algebra_map R A r) ∈ S,
951-
from (f.commutes r).symm ▸ S.algebra_map_mem r }
984+
{ algebra_map_mem' := λ r, show f (algebra_map R A r) ∈ S,
985+
from (f.commutes r).symm ▸ S.algebra_map_mem r,
986+
.. subsemiring.comap (f : A →+* B) S,}
952987

953988
theorem map_le {S : subalgebra R A} {f : A →ₐ[R] B} {U : subalgebra R B} :
954989
map S f ≤ U ↔ S ≤ comap' U f :=
@@ -972,13 +1007,14 @@ variables (φ : A →ₐ[R] B)
9721007

9731008
/-- Range of an `alg_hom` as a subalgebra. -/
9741009
protected def range (φ : A →ₐ[R] B) : subalgebra R B :=
975-
{ carrier :=
976-
{ carrier := set.range φ,
977-
one_mem' := ⟨1, φ.map_one⟩,
978-
mul_mem' := λ _ _ ⟨x, hx⟩ ⟨y, hy⟩, ⟨x * y, by rw [φ.map_mul, hx, hy]⟩,
979-
zero_mem' := ⟨0, φ.map_zero⟩,
980-
add_mem' := λ _ _ ⟨x, hx⟩ ⟨y, hy⟩, ⟨x + y, by rw [φ.map_add, hx, hy]⟩ },
981-
algebra_map_mem' := λ r, ⟨algebra_map R A r, φ.commutes r⟩ }
1010+
{ algebra_map_mem' := λ r, ⟨algebra_map R A r, set.mem_univ _, φ.commutes r⟩,
1011+
.. φ.to_ring_hom.srange }
1012+
1013+
@[simp] lemma mem_range (φ : A →ₐ[R] B) {y : B} :
1014+
y ∈ φ.range ↔ ∃ x, φ x = y := ring_hom.mem_srange
1015+
1016+
@[simp] lemma coe_range (φ : A →ₐ[R] B) : (φ.range : set B) = set.range φ :=
1017+
by { ext, rw [subalgebra.mem_coe, mem_range], refl }
9821018

9831019
/-- Restrict the codomain of an algebra homomorphism. -/
9841020
def cod_restrict (f : A →ₐ[R] B) (S : subalgebra R B) (hf : ∀ x, f x ∈ S) : A →ₐ[R] S :=
@@ -1013,8 +1049,8 @@ variables [comm_semiring R] [semiring A] [algebra R A] [semiring B] [algebra R B
10131049

10141050
/-- The minimal subalgebra that includes `s`. -/
10151051
def adjoin (s : set A) : subalgebra R A :=
1016-
{ carrier := subsemiring.closure (set.range (algebra_map R A) ∪ s),
1017-
algebra_map_mem' := λ r, subsemiring.subset_closure $ or.inl ⟨r, rfl⟩ }
1052+
{ algebra_map_mem' := λ r, subsemiring.subset_closure $ or.inl ⟨r, rfl⟩,
1053+
.. subsemiring.closure (set.range (algebra_map R A) ∪ s) }
10181054
variables {R}
10191055

10201056
protected lemma gc : galois_connection (adjoin R : set A → subalgebra R A) coe :=
@@ -1034,8 +1070,9 @@ galois_insertion.lift_complete_lattice algebra.gi
10341070
instance : inhabited (subalgebra R A) := ⟨⊥⟩
10351071

10361072
theorem mem_bot {x : A} : x ∈ (⊥ : subalgebra R A) ↔ x ∈ set.range (algebra_map R A) :=
1037-
suffices (⊥ : subalgebra R A) = (of_id R A).range, by rw this; refl,
1038-
le_antisymm bot_le $ subalgebra.range_le _
1073+
suffices (of_id R A).range = (⊥ : subalgebra R A),
1074+
by { rw [← this, ← subalgebra.mem_coe, alg_hom.coe_range], refl },
1075+
le_bot_iff.mp (λ x hx, subalgebra.range_le _ ((of_id R A).coe_range ▸ hx))
10391076

10401077
theorem mem_top {x : A} : x ∈ (⊤ : subalgebra R A) :=
10411078
subsemiring.subset_closure $ or.inr trivial
@@ -1048,7 +1085,8 @@ theorem eq_top_iff {S : subalgebra R A} :
10481085
⟨λ h x, by rw h; exact mem_top, λ h, by ext x; exact ⟨λ _, mem_top, λ _, h x⟩⟩
10491086

10501087
@[simp] theorem map_top (f : A →ₐ[R] B) : subalgebra.map (⊤ : subalgebra R A) f = f.range :=
1051-
subalgebra.ext $ λ x, ⟨λ ⟨y, _, hy⟩, ⟨y, hy⟩, λ ⟨y, hy⟩, ⟨y, algebra.mem_top, hy⟩⟩
1088+
subalgebra.ext $ λ x,
1089+
⟨λ ⟨y, _, hy⟩, ⟨y, set.mem_univ _, hy⟩, λ ⟨y, mem, hy⟩, ⟨y, algebra.mem_top, hy⟩⟩
10521090

10531091
@[simp] theorem map_bot (f : A →ₐ[R] B) : subalgebra.map (⊥ : subalgebra R A) f = ⊥ :=
10541092
eq_bot_iff.2 $ λ x ⟨y, hy, hfy⟩, let ⟨r, hr⟩ := mem_bot.1 hy in subalgebra.range_le _
@@ -1105,8 +1143,8 @@ instance algebra_nat : algebra ℕ R :=
11051143
variables {R}
11061144
/-- A subsemiring is a `ℕ`-subalgebra. -/
11071145
def subalgebra_of_subsemiring (S : subsemiring R) : subalgebra ℕ R :=
1108-
{ carrier := S,
1109-
algebra_map_mem' := λ i, S.coe_nat_mem i }
1146+
{ algebra_map_mem' := λ i, S.coe_nat_mem i,
1147+
.. S }
11101148

11111149
@[simp] lemma mem_subalgebra_of_subsemiring {x : R} {S : subsemiring R} :
11121150
x ∈ subalgebra_of_subsemiring S ↔ x ∈ S :=
@@ -1153,19 +1191,18 @@ def ring_hom.to_int_alg_hom {R S : Type*} [ring R] [ring S] (f : R →+* S) : R
11531191
.. f }
11541192

11551193
variables {R}
1194+
11561195
/-- A subring is a `ℤ`-subalgebra. -/
1157-
def subalgebra_of_subring (S : set R) [is_subring S] : subalgebra ℤ R :=
1158-
{ carrier :=
1159-
{ carrier := S,
1160-
one_mem' := is_submonoid.one_mem,
1161-
mul_mem' := λ _ _, is_submonoid.mul_mem,
1162-
zero_mem' := is_add_submonoid.zero_mem,
1163-
add_mem' := λ _ _, is_add_submonoid.add_mem, },
1164-
algebra_map_mem' := λ i, int.induction_on i (show (0 : R) ∈ S, from is_add_submonoid.zero_mem)
1165-
(λ i ih, show (i + 1 : R) ∈ S, from is_add_submonoid.add_mem ih is_submonoid.one_mem)
1166-
(λ i ih, show ((-i - 1 : ℤ) : R) ∈ S, by { rw [int.cast_sub, int.cast_one],
1167-
exact is_add_subgroup.sub_mem S _ _ ih is_submonoid.one_mem }) }
1196+
def subalgebra_of_subring (S : subring R) : subalgebra ℤ R :=
1197+
{ algebra_map_mem' := λ i, int.induction_on i S.zero_mem
1198+
(λ i ih, S.add_mem ih S.one_mem)
1199+
(λ i ih, show ((-i - 1 : ℤ) : R) ∈ S, by { rw [int.cast_sub, int.cast_one],
1200+
exact S.sub_mem ih S.one_mem }),
1201+
.. S }
11681202

1203+
/-- A subset closed under the ring operations is a `ℤ`-subalgebra. -/
1204+
def subalgebra_of_is_subring (S : set R) [is_subring S] : subalgebra ℤ R :=
1205+
subalgebra_of_subring S.to_subring
11691206

11701207
section
11711208
variables {S : Type*} [ring S]
@@ -1181,10 +1218,14 @@ instance nat_algebra_subsingleton : subsingleton (algebra ℕ S) :=
11811218
⟨λ P Q, by { ext, simp, }⟩
11821219
end
11831220

1184-
@[simp] lemma mem_subalgebra_of_subring {x : R} {S : set R} [is_subring S] :
1221+
@[simp] lemma mem_subalgebra_of_subring {x : R} {S : subring R} :
11851222
x ∈ subalgebra_of_subring S ↔ x ∈ S :=
11861223
iff.rfl
11871224

1225+
@[simp] lemma mem_subalgebra_of_is_subring {x : R} {S : set R} [is_subring S] :
1226+
x ∈ subalgebra_of_is_subring S ↔ x ∈ S :=
1227+
iff.rfl
1228+
11881229
section span_int
11891230
open submodule
11901231

src/ring_theory/algebra_tower.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ variables [algebra R S] [algebra S A] [algebra R A] [is_scalar_tower R S A]
189189

190190
/-- If A/S/R is a tower of algebras then the `res`triction of a S-subalgebra of A is an R-subalgebra of A. -/
191191
def res (U : subalgebra S A) : subalgebra R A :=
192-
{ carrier := U,
193-
algebra_map_mem' := λ x, by { rw algebra_map_apply R S A, exact U.algebra_map_mem _ } }
192+
{ algebra_map_mem' := λ x, by { rw algebra_map_apply R S A, exact U.algebra_map_mem _ },
193+
.. U}
194194

195195
@[simp] lemma res_top : res R (⊤ : subalgebra S A) = ⊤ :=
196196
algebra.eq_top_iff.2 $ λ _, show _ ∈ (⊤ : subalgebra S A), from algebra.mem_top
@@ -223,7 +223,7 @@ show z ∈ subsemiring.closure (set.range (algebra_map (to_alg_hom R S A).range
223223
z ∈ subsemiring.closure (set.range (algebra_map S A) ∪ t : set A),
224224
from suffices set.range (algebra_map (to_alg_hom R S A).range A) = set.range (algebra_map S A),
225225
by rw this,
226-
by { ext z, exact ⟨λ ⟨⟨x, y, h1⟩, h2⟩, ⟨y, h2 ▸ h1⟩, λ ⟨y, hy⟩, ⟨⟨z, y, hy⟩, rfl⟩⟩ }
226+
by { ext z, exact ⟨λ ⟨⟨x, y, _, h1⟩, h2⟩, ⟨y, h2 ▸ h1⟩, λ ⟨y, hy⟩, ⟨⟨z, y, set.mem_univ _, hy⟩, rfl⟩⟩ }
227227

228228
end is_scalar_tower
229229

0 commit comments

Comments
 (0)