Theorem: Algebra.FiniteType.iff_quotient_mvPolynomial
File: Mathlib/RingTheory/FiniteType.lean

tactic: constructor
state_before: R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
⊢ FiniteType R A ↔ ∃ s f, Surjective ↑f

tactic: rintro ⟨s, hs⟩
state_before: case mp
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
⊢ FiniteType R A → ∃ s f, Surjective ↑f

tactic: use s, MvPolynomial.aeval (↑)
state_before: case mp.mk.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
hs : adjoin R ↑s = ⊤
⊢ ∃ s f, Surjective ↑f

tactic: intro x
state_before: case mp.mk.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
hs : adjoin R ↑s = ⊤
⊢ Surjective ↑(MvPolynomial.aeval Subtype.val)

tactic: have hrw : (↑s : Set A) = fun x : A => x ∈ s.val := rfl
state_before: case mp.mk.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
hs : adjoin R ↑s = ⊤
x : A
⊢ ∃ a, ↑(MvPolynomial.aeval Subtype.val) a = x

tactic: rw [← Set.mem_range, ← AlgHom.coe_range, ← adjoin_eq_range, ← hrw, hs]
state_before: case mp.mk.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
hs : adjoin R ↑s = ⊤
x : A
hrw : ↑s = fun x => x ∈ s.val
⊢ ∃ a, ↑(MvPolynomial.aeval Subtype.val) a = x

tactic: exact Set.mem_univ x
state_before: case mp.mk.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
hs : adjoin R ↑s = ⊤
x : A
hrw : ↑s = fun x => x ∈ s.val
⊢ x ∈ ↑⊤

tactic: rintro ⟨s, ⟨f, hsur⟩⟩
state_before: case mpr
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
⊢ (∃ s f, Surjective ↑f) → FiniteType R A

tactic: exact FiniteType.of_surjective (FiniteType.mvPolynomial R { x // x ∈ s }) f hsur
state_before: case mpr.intro.intro
R : Type u_1
A : Type u
B : Type ?u.42057
M : Type ?u.42060
N : Type ?u.42063
inst✝⁸ : CommRing R
inst✝⁷ : CommRing A
inst✝⁶ : Algebra R A
inst✝⁵ : CommRing B
inst✝⁴ : Algebra R B
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup N
inst✝ : Module R N
s : Finset A
f : MvPolynomial { x // x ∈ s } R →ₐ[R] A
hsur : Surjective ↑f
⊢ FiniteType R A