Theorem: MvPolynomial.eval₂Hom_congr'
File: Mathlib/Data/MvPolynomial/Variables.lean

tactic: rintro rfl h rfl
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ f₂ : R →+* S
g₁ g₂ : σ → S
p₁ p₂ : MvPolynomial σ R
⊢ f₁ = f₂ → (∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₂ → g₁ i = g₂ i) → p₁ = p₂ → ↑(eval₂Hom f₁ g₁) p₁ = ↑(eval₂Hom f₂ g₂) p₂

tactic: rw [p₁.as_sum]
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
⊢ ↑(eval₂Hom f₁ g₁) p₁ = ↑(eval₂Hom f₁ g₂) p₁

tactic: simp only [map_sum, eval₂Hom_monomial]
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
⊢ ↑(eval₂Hom f₁ g₁) (∑ v in support p₁, ↑(monomial v) (coeff v p₁)) =
    ↑(eval₂Hom f₁ g₂) (∑ v in support p₁, ↑(monomial v) (coeff v p₁))

tactic: apply Finset.sum_congr rfl
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
⊢ (∑ x in support p₁, ↑f₁ (coeff x p₁) * Finsupp.prod x fun i k => g₁ i ^ k) =
    ∑ x in support p₁, ↑f₁ (coeff x p₁) * Finsupp.prod x fun i k => g₂ i ^ k

tactic: intro d hd
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
⊢ ∀ (x : σ →₀ ℕ),
    x ∈ support p₁ →
      (↑f₁ (coeff x p₁) * Finsupp.prod x fun i k => g₁ i ^ k) = ↑f₁ (coeff x p₁) * Finsupp.prod x fun i k => g₂ i ^ k

tactic: congr 1
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
⊢ (↑f₁ (coeff d p₁) * Finsupp.prod d fun i k => g₁ i ^ k) = ↑f₁ (coeff d p₁) * Finsupp.prod d fun i k => g₂ i ^ k

tactic: simp only [Finsupp.prod]
state_before: case e_a
R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
⊢ (Finsupp.prod d fun i k => g₁ i ^ k) = Finsupp.prod d fun i k => g₂ i ^ k

tactic: apply Finset.prod_congr rfl
state_before: case e_a
R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
⊢ ∏ x in d.support, g₁ x ^ ↑d x = ∏ x in d.support, g₂ x ^ ↑d x

tactic: intro i hi
state_before: case e_a
R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
⊢ ∀ (x : σ), x ∈ d.support → g₁ x ^ ↑d x = g₂ x ^ ↑d x

tactic: have : i ∈ p₁.vars := by
  rw [mem_vars]
  exact ⟨d, hd, hi⟩
state_before: case e_a
R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
i : σ
hi : i ∈ d.support
⊢ g₁ i ^ ↑d i = g₂ i ^ ↑d i

tactic: rw [h i this this]
state_before: case e_a
R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
i : σ
hi : i ∈ d.support
this : i ∈ vars p₁
⊢ g₁ i ^ ↑d i = g₂ i ^ ↑d i

tactic: rw [mem_vars]
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
i : σ
hi : i ∈ d.support
⊢ i ∈ vars p₁

tactic: exact ⟨d, hd, hi⟩
state_before: R : Type u
S : Type v
σ : Type u_1
τ : Type ?u.629877
r : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
p q : MvPolynomial σ R
inst✝ : CommSemiring S
f₁ : R →+* S
g₁ g₂ : σ → S
p₁ : MvPolynomial σ R
h : ∀ (i : σ), i ∈ vars p₁ → i ∈ vars p₁ → g₁ i = g₂ i
d : σ →₀ ℕ
hd : d ∈ support p₁
i : σ
hi : i ∈ d.support
⊢ ∃ d x, i ∈ d.support