Theorem: exists_multiset_prod_cons_le_and_prod_not_le
File: Mathlib/RingTheory/DedekindDomain/Ideal.lean

tactic: obtain ⟨Z₀, hZ₀⟩ := PrimeSpectrum.exists_primeSpectrum_prod_le_and_ne_bot_of_domain hNF hI0
state_before: R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: obtain ⟨Z, ⟨hZI, hprodZ⟩, h_eraseZ⟩ :=
  wellFounded_lt.has_min
    {Z | (Z.map PrimeSpectrum.asIdeal).prod ≤ I ∧ (Z.map PrimeSpectrum.asIdeal).prod ≠ ⊥}
    ⟨Z₀, hZ₀.1, hZ₀.2⟩
state_before: case intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: obtain ⟨_, hPZ', hPM⟩ := hM.isPrime.multiset_prod_le.mp (hZI.trans hIM)
state_before: case intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
w✝ : Ideal A
hPZ' : w✝ ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : w✝ ≤ M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: obtain ⟨P, hPZ, rfl⟩ := Multiset.mem_map.mp hPZ'
state_before: case intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
w✝ : Ideal A
hPZ' : w✝ ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : w✝ ≤ M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: have := Multiset.map_erase PrimeSpectrum.asIdeal PrimeSpectrum.ext P Z
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: obtain ⟨hP0, hZP0⟩ : P.asIdeal ≠ ⊥ ∧ ((Z.erase P).map PrimeSpectrum.asIdeal).prod ≠ ⊥ := by
  rwa [Ne, ← Multiset.cons_erase hPZ', Multiset.prod_cons, Ideal.mul_eq_bot, not_or, ←
    this] at hprodZ
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: have hPM' := (P.isPrime.isMaximal hP0).eq_of_le hM.ne_top hPM
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hPM' : P.asIdeal = M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: subst hPM'
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hPM' : P.asIdeal = M
⊢ ∃ Z, (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ∃ Z, (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I

tactic: refine ⟨Z.erase P, ?_, ?_⟩
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ∃ Z, (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ ¬(Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_1
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I

case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ¬(Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I

tactic: rwa [Ne, ← Multiset.cons_erase hPZ', Multiset.prod_cons, Ideal.mul_eq_bot, not_or, ←
  this] at hprodZ
state_before: R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : M.IsMaximal
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
⊢ P.asIdeal ≠ ⊥ ∧ (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
state_after: no goals

tactic: convert hZI
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_1
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I
state_after: case h.e'_3.h.e'_3
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = Multiset.map PrimeSpectrum.asIdeal Z

tactic: rw [this, Multiset.cons_erase hPZ']
state_before: case h.e'_3.h.e'_3
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = Multiset.map PrimeSpectrum.asIdeal Z
state_after: no goals

tactic: refine fun h => h_eraseZ (Z.erase P) ⟨h, ?_⟩ (Multiset.erase_lt.mpr hPZ)
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ¬(Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
h : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I
⊢ (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥

tactic: exact hZP0
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : Field K
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I : Ideal A
hI0 : I ≠ ⊥
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ : (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z₀).prod ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ x ∈ {Z | (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I ∧ (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥}, ¬x < Z
hZI : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≤ I
hprodZ : (Multiset.map PrimeSpectrum.asIdeal Z).prod ≠ ⊥
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this : Multiset.map PrimeSpectrum.asIdeal (Z.erase P) = (Multiset.map PrimeSpectrum.asIdeal Z).erase P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
hIM : I ≤ P.asIdeal
hM : P.asIdeal.IsMaximal
hPM : P.asIdeal ≤ P.asIdeal
h : (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≤ I
⊢ (Multiset.map PrimeSpectrum.asIdeal (Z.erase P)).prod ≠ ⊥
state_after: no goals