Theorem: Polynomial.natDegree_ne_zero_induction_on
File: Mathlib/Data/Polynomial/Inductions.lean

tactic: suffices f.natDegree = 0 ∨ M f from Or.recOn this (fun h => (f0 h).elim) id
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
⊢ M f

tactic: refine Polynomial.induction_on f ?_ ?_ ?_
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
⊢ natDegree f = 0 ∨ M f

tactic: exact fun a => Or.inl (natDegree_C _)
state_before: case refine_1
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
⊢ ∀ (a : R), natDegree (↑C a) = 0 ∨ M (↑C a)

tactic: rintro p q (hp | hp) (hq | hq)
state_before: case refine_2
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
⊢ ∀ (p q : R[X]), natDegree p = 0 ∨ M p → natDegree q = 0 ∨ M q → natDegree (p + q) = 0 ∨ M (p + q)

tactic: refine' Or.inl _
state_before: case refine_2.inl.inl
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : natDegree p = 0
hq : natDegree q = 0
⊢ natDegree (p + q) = 0 ∨ M (p + q)

tactic: rw [eq_C_of_natDegree_eq_zero hp, eq_C_of_natDegree_eq_zero hq, ← C_add, natDegree_C]
state_before: case refine_2.inl.inl
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : natDegree p = 0
hq : natDegree q = 0
⊢ natDegree (p + q) = 0

tactic: refine' Or.inr _
state_before: case refine_2.inl.inr
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : natDegree p = 0
hq : M q
⊢ natDegree (p + q) = 0 ∨ M (p + q)

tactic: rw [eq_C_of_natDegree_eq_zero hp]
state_before: case refine_2.inl.inr
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : natDegree p = 0
hq : M q
⊢ M (p + q)

tactic: exact h_C_add hq
state_before: case refine_2.inl.inr
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : natDegree p = 0
hq : M q
⊢ M (↑C (coeff p 0) + q)

tactic: refine' Or.inr _
state_before: case refine_2.inr.inl
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : M p
hq : natDegree q = 0
⊢ natDegree (p + q) = 0 ∨ M (p + q)

tactic: rw [eq_C_of_natDegree_eq_zero hq, add_comm]
state_before: case refine_2.inr.inl
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : M p
hq : natDegree q = 0
⊢ M (p + q)

tactic: exact h_C_add hp
state_before: case refine_2.inr.inl
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : M p
hq : natDegree q = 0
⊢ M (↑C (coeff q 0) + p)

tactic: exact Or.inr (h_add hp hq)
state_before: case refine_2.inr.inr
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p✝ q✝ : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
p q : R[X]
hp : M p
hq : M q
⊢ natDegree (p + q) = 0 ∨ M (p + q)

tactic: intro n a _
state_before: case refine_3
R : Type u
S : Type v
T : Type w
A : Type z
a b : R
n : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
⊢ ∀ (n : ℕ) (a : R),
    natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n) → natDegree (↑C a * X ^ (n + 1)) = 0 ∨ M (↑C a * X ^ (n + 1))

tactic: by_cases a0 : a = 0
state_before: case refine_3
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
⊢ natDegree (↑C a * X ^ (n + 1)) = 0 ∨ M (↑C a * X ^ (n + 1))

tactic: exact Or.inl (by rw [a0, C_0, zero_mul, natDegree_zero])
state_before: case pos
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
a0 : a = 0
⊢ natDegree (↑C a * X ^ (n + 1)) = 0 ∨ M (↑C a * X ^ (n + 1))

tactic: rw [a0, C_0, zero_mul, natDegree_zero]
state_before: R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
a0 : a = 0
⊢ natDegree (↑C a * X ^ (n + 1)) = 0

tactic: refine' Or.inr _
state_before: case neg
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
a0 : ¬a = 0
⊢ natDegree (↑C a * X ^ (n + 1)) = 0 ∨ M (↑C a * X ^ (n + 1))

tactic: rw [C_mul_X_pow_eq_monomial]
state_before: case neg
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
a0 : ¬a = 0
⊢ M (↑C a * X ^ (n + 1))

tactic: exact h_monomial a0 n.succ_ne_zero
state_before: case neg
R : Type u
S : Type v
T : Type w
A : Type z
a✝¹ b : R
n✝ : ℕ
inst✝ : Semiring R
p q : R[X]
M : R[X] → Prop
f : R[X]
f0 : natDegree f ≠ 0
h_C_add : ∀ {a : R} {p : R[X]}, M p → M (↑C a + p)
h_add : ∀ {p q : R[X]}, M p → M q → M (p + q)
h_monomial : ∀ {n : ℕ} {a : R}, a ≠ 0 → n ≠ 0 → M (↑(monomial n) a)
n : ℕ
a : R
a✝ : natDegree (↑C a * X ^ n) = 0 ∨ M (↑C a * X ^ n)
a0 : ¬a = 0
⊢ M (↑(monomial (n + 1)) a)