Theorem: Polynomial.bUnion_roots_finite
File: Mathlib/Algebra/Polynomial/Roots.lean

tactic: let π : R[X] → Fin (d + 1) → R := fun f i => f.coeff i
state_before: R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
⊢ Set.Finite fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
state_after: R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ Set.Finite fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U

tactic: refine ((Set.Finite.pi fun _ => h).subset <| ?_).of_finite_image (?_ : Set.InjOn π _)
state_before: R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ Set.Finite fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
state_after: case refine_1
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ (π '' fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U) ⊆ Set.univ.pi fun x => U

case refine_2
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ Set.InjOn π fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U

tactic: exact Set.image_subset_iff.2 fun f hf i _ => hf.2 i
state_before: case refine_1
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ (π '' fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U) ⊆ Set.univ.pi fun x => U
state_after: no goals

tactic: refine fun x hx y hy hxy => (ext_iff_natDegree_le hx.1 hy.1).2 fun i hi => ?_
state_before: case refine_2
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
⊢ Set.InjOn π fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
state_after: case refine_2
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
x : R[X]
hx : x ∈ fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
y : R[X]
hy : y ∈ fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
hxy : π x = π y
i : ℕ
hi : i ≤ d
⊢ x.coeff i = y.coeff i

tactic: exact id congr_fun hxy ⟨i, Nat.lt_succ_of_le hi⟩
state_before: case refine_2
R✝ : Type u
S✝ : Type v
T : Type w
a b : R✝
n : ℕ
inst✝⁶ : CommRing R✝
inst✝⁵ : IsDomain R✝
p q : R✝[X]
inst✝⁴ : CommRing T
R : Type u_1
S : Type u_2
inst✝³ : Semiring R
inst✝² : CommRing S
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
m : R →+* S
d : ℕ
U : Set R
h : U.Finite
π : R[X] → Fin (d + 1) → R := fun f i => f.coeff ↑i
x : R[X]
hx : x ∈ fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
y : R[X]
hy : y ∈ fun f => f.natDegree ≤ d ∧ ∀ (i : ℕ), f.coeff i ∈ U
hxy : π x = π y
i : ℕ
hi : i ≤ d
⊢ x.coeff i = y.coeff i
state_after: no goals