Theorem: isIntegral_trans
File: Mathlib/RingTheory/IntegralClosure.lean

tactic: rcases hx with ⟨p, pmonic, hp⟩
state_before: R : Type u_1
A : Type u_2
B : Type u_3
S : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S
g : S →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
hx : IsIntegral A x
⊢ IsIntegral R x

tactic: let S : Set B := ↑(p.map <| algebraMap A B).frange
state_before: case intro.intro
R : Type u_1
A : Type u_2
B : Type u_3
S : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S
g : S →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
⊢ IsIntegral R x

tactic: refine' isIntegral_of_mem_of_FG (adjoin R (S ∪ {x})) _ _ (subset_adjoin <| Or.inr rfl)
state_before: case intro.intro
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
⊢ IsIntegral R x

tactic: refine' fg_trans (FG_adjoin_of_finite (Finset.finite_toSet _) fun x hx => _) _
state_before: case intro.intro
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
⊢ FG (↑Subalgebra.toSubmodule (adjoin R (S ∪ {x})))

tactic: rw [Finset.mem_coe, frange, Finset.mem_image] at hx
state_before: case intro.intro.refine'_1
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x✝ : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x✝ p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
x : B
hx : x ∈ S
⊢ IsIntegral R x

tactic: rcases hx with ⟨i, _, rfl⟩
state_before: case intro.intro.refine'_1
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x✝ : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x✝ p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
x : B
hx : ∃ a, a ∈ support (Polynomial.map (algebraMap A B) p) ∧ coeff (Polynomial.map (algebraMap A B) p) a = x
⊢ IsIntegral R x

tactic: rw [coeff_map]
state_before: case intro.intro.refine'_1.intro.intro
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
i : ℕ
left✝ : i ∈ support (Polynomial.map (algebraMap A B) p)
⊢ IsIntegral R (coeff (Polynomial.map (algebraMap A B) p) i)

tactic: exact map_isIntegral (IsScalarTower.toAlgHom R A B) (A_int _)
state_before: case intro.intro.refine'_1.intro.intro
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
i : ℕ
left✝ : i ∈ support (Polynomial.map (algebraMap A B) p)
⊢ IsIntegral R (↑(algebraMap A B) (coeff p i))

tactic: apply FG_adjoin_singleton_of_integral
state_before: case intro.intro.refine'_2
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
⊢ FG (↑Subalgebra.toSubmodule (adjoin { x // x ∈ adjoin R S } {x}))

tactic: exact isIntegral_trans_aux _ pmonic hp
state_before: case intro.intro.refine'_2.hx
R : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type ?u.1384892
T : Type ?u.1384895
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : CommRing B
inst✝⁵ : CommRing S✝
inst✝⁴ : CommRing T
inst✝³ : Algebra A B
inst✝² : Algebra R B
f : R →+* S✝
g : S✝ →+* T
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A B
A_int : Algebra.IsIntegral R A
x : B
p : A[X]
pmonic : Monic p
hp : eval₂ (algebraMap A B) x p = 0
S : Set B := ↑(frange (Polynomial.map (algebraMap A B) p))
⊢ IsIntegral { x // x ∈ adjoin R S } x