Theorem: Multiset.le_prod_of_submultiplicative_on_pred
File: Mathlib/Algebra/Order/BigOperators/Group/Multiset.lean

Proof steps:
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
s : Multiset α
hps : ∀ a ∈ s, p a
⊢ f s.prod ≤ (map f s).prod
state_after: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
⊢ ∀ (s : Multiset α), (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
tactic: revert s
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
⊢ ∀ (s : Multiset α), (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
state_after: case refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
⊢ (∀ a ∈ 0, p a) → f (prod 0) ≤ (map f 0).prod

case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
⊢ ∀ (a : α) (s : Multiset α),
    ((∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod) → (∀ a_2 ∈ a ::ₘ s, p a_2) → f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
tactic: refine Multiset.induction ?_ ?_
state_before: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
⊢ ∀ (a : α) (s : Multiset α),
    ((∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod) → (∀ a_2 ∈ a ::ₘ s, p a_2) → f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
state_after: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
tactic: intro a s hs hpsa
state_before: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
state_after: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
tactic: have hps : ∀ x, x ∈ s → p x := fun x hx => hpsa x (mem_cons_of_mem hx)
state_before: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
state_after: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
hp_prod : p s.prod
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
tactic: have hp_prod : p s.prod := prod_induction p s hp_mul hp_one hps
state_before: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
hp_prod : p s.prod
⊢ f (a ::ₘ s).prod ≤ (map f (a ::ₘ s)).prod
state_after: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
hp_prod : p s.prod
⊢ f (a * s.prod) ≤ f a * (map f s).prod
tactic: rw [prod_cons, map_cons, prod_cons]
state_before: case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : CommMonoid α
inst✝ : OrderedCommMonoid β
f : α → β
p : α → Prop
h_one : f 1 = 1
hp_one : p 1
h_mul : ∀ (a b : α), p a → p b → f (a * b) ≤ f a * f b
hp_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hs : (∀ a ∈ s, p a) → f s.prod ≤ (map f s).prod
hpsa : ∀ a_1 ∈ a ::ₘ s, p a_1
hps : ∀ x ∈ s, p x
hp_prod : p s.prod
⊢ f (a * s.prod) ≤ f a * (map f s).prod
state_after: no goals
tactic: exact (h_mul a s.prod (hpsa a (mem_cons_self a s)) hp_prod).trans (mul_le_mul_left' (hs hps) _)