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

tactic: generalize hS : (↑(p.map <| algebraMap A B).frange : Set B) = S
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
⊢ IsIntegral { x // x ∈ adjoin R ↑(frange (Polynomial.map (algebraMap A B) p)) } x

tactic: obtain ⟨q, hq⟩ :
  ∃ q : (adjoin R S)[X], q.map (algebraMap (adjoin R S) B) = (p.map <| algebraMap A B) := by
  rw [← Set.mem_range]
  exact (Polynomial.mem_map_range _).2 fun i => ⟨⟨_, coeffs_mem i⟩, rfl⟩
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
⊢ IsIntegral { x // x ∈ adjoin R S } x

tactic: use q
state_before: case intro
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ IsIntegral { x // x ∈ adjoin R S } x

tactic: constructor
state_before: case intro
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ Monic q ∧ eval₂ (algebraMap { x // x ∈ adjoin R S } B) x q = 0

tactic: intro i
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
⊢ ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S

tactic: by_cases hi : (p.map <| algebraMap A B).coeff i = 0
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
i : ℕ
⊢ coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S

tactic: rw [← hS]
state_before: case neg
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
i : ℕ
hi : ¬coeff (Polynomial.map (algebraMap A B) p) i = 0
⊢ coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S

tactic: exact subset_adjoin (coeff_mem_frange _ _ hi)
state_before: case neg
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
i : ℕ
hi : ¬coeff (Polynomial.map (algebraMap A B) p) i = 0
⊢ coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R ↑(frange (Polynomial.map (algebraMap A B) p))

tactic: rw [hi]
state_before: case pos
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
i : ℕ
hi : coeff (Polynomial.map (algebraMap A B) p) i = 0
⊢ coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S

tactic: exact Subalgebra.zero_mem _
state_before: case pos
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
i : ℕ
hi : coeff (Polynomial.map (algebraMap A B) p) i = 0
⊢ 0 ∈ adjoin R S

tactic: rw [← Set.mem_range]
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
⊢ ∃ q, Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p

tactic: exact (Polynomial.mem_map_range _).2 fun i => ⟨⟨_, coeffs_mem i⟩, rfl⟩
state_before: R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
⊢ Polynomial.map (algebraMap A B) p ∈ Set.range fun q => Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q

tactic: suffices h : (q.map (algebraMap (adjoin R S) B)).Monic
state_before: case intro.left
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ Monic q

tactic: refine' monic_of_injective _ h
state_before: case intro.left
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
h : Monic (Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q)
⊢ Monic q

tactic: exact Subtype.val_injective
state_before: case intro.left
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
h : Monic (Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q)
⊢ Function.Injective ↑(algebraMap { x // x ∈ adjoin R S } B)

tactic: rw [hq]
state_before: case h
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ Monic (Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q)

tactic: exact pmonic.map _
state_before: case h
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ Monic (Polynomial.map (algebraMap A B) p)

tactic: convert hp using 1
state_before: case intro.right
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ eval₂ (algebraMap { x // x ∈ adjoin R S } B) x q = 0

tactic: replace hq := congr_arg (eval x) hq
state_before: case h.e'_2
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q = Polynomial.map (algebraMap A B) p
⊢ eval₂ (algebraMap { x // x ∈ adjoin R S } B) x q = ↑(aeval x) p

tactic: convert hq using 1 <;> symm <;> apply eval_map
state_before: case h.e'_2
R : Type u_3
A : Type u_1
B : Type u_2
S✝ : Type ?u.1370556
T : Type ?u.1370559
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
x : B
p : A[X]
pmonic : Monic p
hp : ↑(aeval x) p = 0
S : Set B
hS : ↑(frange (Polynomial.map (algebraMap A B) p)) = S
coeffs_mem : ∀ (i : ℕ), coeff (Polynomial.map (algebraMap A B) p) i ∈ adjoin R S
q : { x // x ∈ adjoin R S }[X]
hq : eval x (Polynomial.map (algebraMap { x // x ∈ adjoin R S } B) q) = eval x (Polynomial.map (algebraMap A B) p)
⊢ eval₂ (algebraMap { x // x ∈ adjoin R S } B) x q = ↑(aeval x) p