Theorem: AddMonoidAlgebra.supDegree_prod_le
File: Mathlib/Algebra/MonoidAlgebra/Degree.lean

tactic: refine s.induction ?_ ?_
state_before: R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i)
state_after: case refine_1
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ supDegree D (∏ i ∈ ∅, f i) ≤ ∑ i ∈ ∅, supDegree D (f i)

case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ ∀ ⦃a : ι⦄ {s : Finset ι},
    a ∉ s →
      supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i) →
        supDegree D (∏ i ∈ insert a s, f i) ≤ ∑ i ∈ insert a s, supDegree D (f i)

tactic: rw [Finset.prod_empty, Finset.sum_empty, one_def, supDegree_single]
state_before: case refine_1
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ supDegree D (∏ i ∈ ∅, f i) ≤ ∑ i ∈ ∅, supDegree D (f i)
state_after: case refine_1
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ (if 1 = 0 then ⊥ else D 0) ≤ 0

tactic: split_ifs
state_before: case refine_1
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ (if 1 = 0 then ⊥ else D 0) ≤ 0
state_after: case pos
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
h✝ : 1 = 0
⊢ ⊥ ≤ 0

case neg
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
h✝ : ¬1 = 0
⊢ D 0 ≤ 0

tactic: exacts [bot_le, hzero.le]
state_before: case pos
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
h✝ : 1 = 0
⊢ ⊥ ≤ 0

case neg
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
h✝ : ¬1 = 0
⊢ D 0 ≤ 0
state_after: no goals

tactic: intro i s his ih
state_before: case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s : Finset ι
f : ι → R[A]
⊢ ∀ ⦃a : ι⦄ {s : Finset ι},
    a ∉ s →
      supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i) →
        supDegree D (∏ i ∈ insert a s, f i) ≤ ∑ i ∈ insert a s, supDegree D (f i)
state_after: case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s✝ : Finset ι
f : ι → R[A]
i : ι
s : Finset ι
his : i ∉ s
ih : supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i)
⊢ supDegree D (∏ i ∈ insert i s, f i) ≤ ∑ i ∈ insert i s, supDegree D (f i)

tactic: rw [Finset.prod_insert his, Finset.sum_insert his]
state_before: case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s✝ : Finset ι
f : ι → R[A]
i : ι
s : Finset ι
his : i ∉ s
ih : supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i)
⊢ supDegree D (∏ i ∈ insert i s, f i) ≤ ∑ i ∈ insert i s, supDegree D (f i)
state_after: case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s✝ : Finset ι
f : ι → R[A]
i : ι
s : Finset ι
his : i ∉ s
ih : supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i)
⊢ supDegree D (f i * ∏ x ∈ s, f x) ≤ supDegree D (f i) + ∑ x ∈ s, supDegree D (f x)

tactic: exact (supDegree_mul_le hadd).trans (add_le_add_left ih _)
state_before: case refine_2
R✝ : Type u_1
R' : Type u_2
A✝ : Type u_3
T : Type u_4
B✝ : Type u_5
ι✝ : Type u_6
inst✝¹² : Semiring R✝
inst✝¹¹ : Ring R'
inst✝¹⁰ : AddZeroClass A✝
inst✝⁹ : SemilatticeSup B✝
inst✝⁸ : Add B✝
inst✝⁷ : OrderBot B✝
D✝ : A✝ → B✝
p q : R✝[A✝]
hadd✝ : ∀ (a1 a2 : A✝), D✝ (a1 + a2) = D✝ a1 + D✝ a2
R : Type u_7
A : Type u_8
B : Type u_9
inst✝⁶ : CommSemiring R
inst✝⁵ : AddCommMonoid A
inst✝⁴ : AddCommMonoid B
inst✝³ : SemilatticeSup B
inst✝² : OrderBot B
inst✝¹ : CovariantClass B B (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass B B (Function.swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
D : A → B
hzero : D 0 = 0
hadd : ∀ (a1 a2 : A), D (a1 + a2) = D a1 + D a2
ι : Type u_10
s✝ : Finset ι
f : ι → R[A]
i : ι
s : Finset ι
his : i ∉ s
ih : supDegree D (∏ i ∈ s, f i) ≤ ∑ i ∈ s, supDegree D (f i)
⊢ supDegree D (f i * ∏ x ∈ s, f x) ≤ supDegree D (f i) + ∑ x ∈ s, supDegree D (f x)
state_after: no goals