Theorem: Polynomial.induction_on
File: Mathlib/Algebra/Polynomial/Induction.lean

tactic: rw [← sum_C_mul_X_pow_eq p, Polynomial.sum]
state_before: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
B : ∀ (s : Finset ℕ), M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M p
state_after: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
B : ∀ (s : Finset ℕ), M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (∑ n ∈ p.support, C (p.coeff n) * X ^ n)

tactic: exact B (support p)
state_before: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
B : ∀ (s : Finset ℕ), M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (∑ n ∈ p.support, C (p.coeff n) * X ^ n)
state_after: no goals

tactic: intro n a
state_before: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
⊢ ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
state_after: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
n : ℕ
a : R
⊢ M (C a * X ^ n)

tactic: induction' n with n ih
state_before: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
n : ℕ
a : R
⊢ M (C a * X ^ n)
state_after: case zero
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
⊢ M (C a * X ^ 0)

case succ
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
n : ℕ
ih : M (C a * X ^ n)
⊢ M (C a * X ^ (n + 1))

tactic: rw [pow_zero, mul_one]
state_before: case zero
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
⊢ M (C a * X ^ 0)
state_after: case zero
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
⊢ M (C a)

tactic: exact h_C a
state_before: case zero
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
⊢ M (C a)
state_after: no goals

tactic: exact h_monomial _ _ ih
state_before: case succ
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A : Type z
a✝ b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
a : R
n : ℕ
ih : M (C a * X ^ n)
⊢ M (C a * X ^ (n + 1))
state_after: no goals

tactic: apply Finset.induction
state_before: R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ ∀ (s : Finset ℕ), M (∑ n ∈ s, C (p.coeff n) * X ^ n)
state_after: case empty
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ M (∑ n ∈ ∅, C (p.coeff n) * X ^ n)

case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ ∀ ⦃a : ℕ⦄ {s : Finset ℕ}, a ∉ s → M (∑ n ∈ s, C (p.coeff n) * X ^ n) → M (∑ n ∈ insert a s, C (p.coeff n) * X ^ n)

tactic: convert h_C 0
state_before: case empty
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ M (∑ n ∈ ∅, C (p.coeff n) * X ^ n)
state_after: case h.e'_1
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ ∑ n ∈ ∅, C (p.coeff n) * X ^ n = C 0

tactic: exact C_0.symm
state_before: case h.e'_1
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ ∑ n ∈ ∅, C (p.coeff n) * X ^ n = C 0
state_after: no goals

tactic: intro n s ns ih
state_before: case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
⊢ ∀ ⦃a : ℕ⦄ {s : Finset ℕ}, a ∉ s → M (∑ n ∈ s, C (p.coeff n) * X ^ n) → M (∑ n ∈ insert a s, C (p.coeff n) * X ^ n)
state_after: case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
n : ℕ
s : Finset ℕ
ns : n ∉ s
ih : M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (∑ n ∈ insert n s, C (p.coeff n) * X ^ n)

tactic: rw [sum_insert ns]
state_before: case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
n : ℕ
s : Finset ℕ
ns : n ∉ s
ih : M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (∑ n ∈ insert n s, C (p.coeff n) * X ^ n)
state_after: case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
n : ℕ
s : Finset ℕ
ns : n ∉ s
ih : M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (C (p.coeff n) * X ^ n + ∑ x ∈ s, C (p.coeff x) * X ^ x)

tactic: exact h_add _ _ A ih
state_before: case insert
R : Type u
S : Type v
T : Type w
ι : Type x
k : Type y
A✝ : Type z
a b : R
m n✝ : ℕ
inst✝ : Semiring R
p✝ q r : R[X]
M : R[X] → Prop
p : R[X]
h_C : ∀ (a : R), M (C a)
h_add : ∀ (p q : R[X]), M p → M q → M (p + q)
h_monomial : ∀ (n : ℕ) (a : R), M (C a * X ^ n) → M (C a * X ^ (n + 1))
A : ∀ {n : ℕ} {a : R}, M (C a * X ^ n)
n : ℕ
s : Finset ℕ
ns : n ∉ s
ih : M (∑ n ∈ s, C (p.coeff n) * X ^ n)
⊢ M (C (p.coeff n) * X ^ n + ∑ x ∈ s, C (p.coeff x) * X ^ x)
state_after: no goals