Theorem: Ideal.IsPrime.multiset_prod_le
File: Mathlib/RingTheory/Ideal/Operations.lean

tactic: suffices s.prod ≤ P → ∃ I ∈ s, I ≤ P from
  ⟨this, fun ⟨i, his, hip⟩ => le_trans multiset_prod_le_inf <| le_trans (Multiset.inf_le his) hip⟩
state_before: R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L : Ideal R
s : Multiset (Ideal R)
P : Ideal R
hp : IsPrime P
hne : s ≠ 0
⊢ Multiset.prod s ≤ P ↔ ∃ I, I ∈ s ∧ I ≤ P

tactic: obtain ⟨b, hb⟩ : ∃ b, b ∈ s := Multiset.exists_mem_of_ne_zero hne
state_before: R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L : Ideal R
s : Multiset (Ideal R)
P : Ideal R
hp : IsPrime P
hne : s ≠ 0
⊢ Multiset.prod s ≤ P → ∃ I, I ∈ s ∧ I ≤ P

tactic: obtain ⟨t, rfl⟩ : ∃ t, s = b ::ₘ t
state_before: case intro
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L : Ideal R
s : Multiset (Ideal R)
P : Ideal R
hp : IsPrime P
hne : s ≠ 0
b : Ideal R
hb : b ∈ s
⊢ Multiset.prod s ≤ P → ∃ I, I ∈ s ∧ I ≤ P

tactic: exact ⟨s.erase b, (Multiset.cons_erase hb).symm⟩
state_before: R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L : Ideal R
s : Multiset (Ideal R)
P : Ideal R
hp : IsPrime P
hne : s ≠ 0
b : Ideal R
hb : b ∈ s
⊢ ∃ t, s = b ::ₘ t

case intro.intro
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
⊢ Multiset.prod (b ::ₘ t) ≤ P → ∃ I, I ∈ b ::ₘ t ∧ I ≤ P

tactic: refine' t.induction_on _ _
state_before: case intro.intro
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
⊢ Multiset.prod (b ::ₘ t) ≤ P → ∃ I, I ∈ b ::ₘ t ∧ I ≤ P

tactic: intro a s ih h
state_before: case intro.intro.refine'_2
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
⊢ ∀ ⦃a : Ideal R⦄ {s : Multiset (Ideal R)},
    (Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P) →
      Multiset.prod (b ::ₘ a ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ a ::ₘ s ∧ I ≤ P

tactic: rw [Multiset.cons_swap, Multiset.prod_cons, hp.mul_le] at h
state_before: case intro.intro.refine'_2
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : Multiset.prod (b ::ₘ a ::ₘ s) ≤ P
⊢ ∃ I, I ∈ b ::ₘ a ::ₘ s ∧ I ≤ P

tactic: rw [Multiset.cons_swap]
state_before: case intro.intro.refine'_2
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : a ≤ P ∨ Multiset.prod (b ::ₘ s) ≤ P
⊢ ∃ I, I ∈ b ::ₘ a ::ₘ s ∧ I ≤ P

tactic: cases' h with h h
state_before: case intro.intro.refine'_2
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : a ≤ P ∨ Multiset.prod (b ::ₘ s) ≤ P
⊢ ∃ I, I ∈ a ::ₘ b ::ₘ s ∧ I ≤ P

tactic: obtain ⟨I, hI, ih⟩ : ∃ I ∈ b ::ₘ s, I ≤ P := ih h
state_before: case intro.intro.refine'_2.inr
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : Multiset.prod (b ::ₘ s) ≤ P
⊢ ∃ I, I ∈ a ::ₘ b ::ₘ s ∧ I ≤ P

tactic: exact ⟨I, Multiset.mem_cons_of_mem hI, ih⟩
state_before: case intro.intro.refine'_2.inr.intro.intro
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I✝ J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih✝ : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : Multiset.prod (b ::ₘ s) ≤ P
I : Ideal R
hI : I ∈ b ::ₘ s
ih : I ≤ P
⊢ ∃ I, I ∈ a ::ₘ b ::ₘ s ∧ I ≤ P

tactic: simp only [exists_prop, Multiset.cons_zero, Multiset.prod_singleton, Multiset.mem_singleton,
  exists_eq_left, imp_self]
state_before: case intro.intro.refine'_1
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
⊢ Multiset.prod (b ::ₘ 0) ≤ P → ∃ I, I ∈ b ::ₘ 0 ∧ I ≤ P

tactic: exact ⟨a, Multiset.mem_cons_self a _, h⟩
state_before: case intro.intro.refine'_2.inl
R : Type u
ι : Type ?u.344408
inst✝ : CommSemiring R
I J K L P : Ideal R
hp : IsPrime P
b : Ideal R
t : Multiset (Ideal R)
hne : b ::ₘ t ≠ 0
hb : b ∈ b ::ₘ t
a : Ideal R
s : Multiset (Ideal R)
ih : Multiset.prod (b ::ₘ s) ≤ P → ∃ I, I ∈ b ::ₘ s ∧ I ≤ P
h : a ≤ P
⊢ ∃ I, I ∈ a ::ₘ b ::ₘ s ∧ I ≤ P