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

tactic: induction' l with i l ihl
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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
l : List ι
f g : ι → M
h₁ : ∀ i ∈ l, f i ≤ g i
h₂ : ∃ i ∈ l, f i < g i
⊢ (map f l).prod < (map g 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
h₁ : ∀ i ∈ [], f i ≤ g i
h₂ : ∃ i ∈ [], f i < g i
⊢ (map f []).prod < (map g []).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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : ∀ i_1 ∈ i :: l, f i_1 ≤ g i_1
h₂ : ∃ i_1 ∈ i :: l, f i_1 < g i_1
⊢ (map f (i :: l)).prod < (map g (i :: l)).prod

tactic: simp only [forall_mem_cons, map_cons, prod_cons] at h₁ ⊢
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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : ∀ i_1 ∈ i :: l, f i_1 ≤ g i_1
h₂ : ∃ i_1 ∈ i :: l, f i_1 < g i_1
⊢ (map f (i :: l)).prod < (map g (i :: l)).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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₂ : ∃ i_1 ∈ i :: l, f i_1 < g i_1
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
⊢ f i * (map f l).prod < g i * (map g l).prod

tactic: simp only [mem_cons, exists_eq_or_imp] at h₂
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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₂ : ∃ i_1 ∈ i :: l, f i_1 < g i_1
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
⊢ f i * (map f l).prod < g i * (map g l).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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h₂ : f i < g i ∨ ∃ a ∈ l, f a < g a
⊢ f i * (map f l).prod < g i * (map g l).prod

tactic: cases h₂
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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h₂ : f i < g i ∨ ∃ a ∈ l, f a < g a
⊢ f i * (map f l).prod < g i * (map g l).prod
state_after: case cons.inl
ι : 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h✝ : f i < g i
⊢ f i * (map f l).prod < g i * (map g l).prod

case cons.inr
ι : 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h✝ : ∃ a ∈ l, f a < g a
⊢ f i * (map f l).prod < g i * (map g l).prod

tactic: rcases h₂ with ⟨_, ⟨⟩, _⟩
state_before: 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
h₁ : ∀ i ∈ [], f i ≤ g i
h₂ : ∃ i ∈ [], f i < g i
⊢ (map f []).prod < (map g []).prod
state_after: no goals

tactic: exact mul_lt_mul_of_lt_of_le ‹_› (prod_le_prod' h₁.2)
state_before: case cons.inl
ι : 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h✝ : f i < g i
⊢ f i * (map f l).prod < g i * (map g l).prod
state_after: no goals

tactic: exact mul_lt_mul_of_le_of_lt h₁.1 <| ihl h₁.2 ‹_›
state_before: case cons.inr
ι : 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✝⁵ : Monoid M
inst✝⁴ : Preorder M
inst✝³ : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝² : CovariantClass M M (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝¹ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass M M (Function.swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
f g : ι → M
i : ι
l : List ι
ihl : (∀ i ∈ l, f i ≤ g i) → (∃ i ∈ l, f i < g i) → (map f l).prod < (map g l).prod
h₁ : f i ≤ g i ∧ ∀ x ∈ l, f x ≤ g x
h✝ : ∃ a ∈ l, f a < g a
⊢ f i * (map f l).prod < g i * (map g l).prod
state_after: no goals