Theorem: List.single_le_prod
File: Mathlib/Algebra/Order/BigOperators/Group/List.lean

Proof steps:
state_before: ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
l : List M
hl₁ : ∀ x ∈ l, 1 ≤ x
⊢ ∀ x ∈ l, x ≤ l.prod
state_after: case nil
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
hl₁ : ∀ x ∈ [], 1 ≤ x
⊢ ∀ x ∈ [], x ≤ [].prod

case cons
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : ∀ x ∈ head✝ :: tail✝, 1 ≤ x
⊢ ∀ x ∈ head✝ :: tail✝, x ≤ (head✝ :: tail✝).prod
tactic: induction l
state_before: case cons
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : ∀ x ∈ head✝ :: tail✝, 1 ≤ x
⊢ ∀ x ∈ head✝ :: tail✝, x ≤ (head✝ :: tail✝).prod
state_after: case cons
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ head✝ ≤ head✝ * tail✝.prod ∧ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
tactic: simp_rw [prod_cons, forall_mem_cons] at hl₁ ⊢
state_before: case cons
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ head✝ ≤ head✝ * tail✝.prod ∧ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
state_after: case cons.left
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ head✝ ≤ head✝ * tail✝.prod

case cons.right
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
tactic: constructor
state_before: case cons.left
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ head✝ ≤ head✝ * tail✝.prod

case cons.right
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
state_after: case cons.right
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
tactic: case cons.left => exact le_mul_of_one_le_right' (one_le_prod_of_one_le hl₁.2)
state_before: case cons.right
ι : Type u_1
α : Type u_2
M : Type u_3
N : Type u_4
P : Type u_5
M₀ : Type u_6
G : Type u_7
R : Type u_8
inst✝ : OrderedCommMonoid M
head✝ : M
tail✝ : List M
tail_ih✝ : (∀ x ∈ tail✝, 1 ≤ x) → ∀ x ∈ tail✝, x ≤ tail✝.prod
hl₁ : 1 ≤ head✝ ∧ ∀ x ∈ tail✝, 1 ≤ x
⊢ ∀ x ∈ tail✝, x ≤ head✝ * tail✝.prod
state_after: no goals
tactic: case cons.right hd tl ih => exact fun x H => le_mul_of_one_le_of_le hl₁.1 (ih hl₁.right x H)