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.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: obtain ⟨Z, ⟨hZI, hprodZ⟩, h_eraseZ⟩ :=
  Multiset.wellFounded_lt.has_min
    (fun Z => (Z.map PrimeSpectrum.asIdeal).prod ≤ I ∧ (Z.map PrimeSpectrum.asIdeal).prod ≠ ⊥)
    ⟨Z₀, hZ₀⟩
state_before: case intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: have hZM : Multiset.prod (Z.map PrimeSpectrum.asIdeal) ≤ M := le_trans hZI hIM
state_before: case intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: have hZ0 : Z ≠ 0 := by rintro rfl; simp [hM.ne_top] at hZM
state_before: case intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: obtain ⟨_, hPZ', hPM⟩ := (hM.isPrime.multiset_prod_le (mt Multiset.map_eq_zero.mp hZ0)).mp hZM
state_before: case intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: obtain ⟨P, hPZ, rfl⟩ := Multiset.mem_map.mp hPZ'
state_before: case intro.intro.intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
w✝ : Ideal A
hPZ' : w✝ ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : w✝ ≤ M
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: rintro rfl
state_before: R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
⊢ Z ≠ 0

tactic: simp [hM.ne_top] at hZM
state_before: R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < 0
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal 0) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal 0) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal 0) ≤ M
⊢ False

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.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: obtain ⟨hP0, hZP0⟩ : P.asIdeal ≠ ⊥ ∧ ((Z.erase P).map PrimeSpectrum.asIdeal).prod ≠ ⊥ := by
  rwa [Ne.def, ← 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.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: have hPM' := (IsDedekindDomain.dimensionLEOne _ hP0 P.IsPrime).eq_of_le hM.ne_top hPM
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: subst hPM'
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hPM' : P.asIdeal = M
⊢ ∃ Z,
    Multiset.prod (M ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: refine ⟨Z.erase P, ?_, ?_⟩
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
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.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hIM : I ≤ P.asIdeal
hM : Ideal.IsMaximal P.asIdeal
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ P.asIdeal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ∃ Z,
    Multiset.prod (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
      ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I

tactic: rwa [Ne.def, ← Multiset.cons_erase hPZ', Multiset.prod_cons, Ideal.mul_eq_bot, not_or, ←
  this] at hprodZ
state_before: R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
inst✝² : Algebra A K
inst✝¹ : IsFractionRing A K
inst✝ : IsDedekindDomain A
hNF : ¬IsField A
I M : Ideal A
hI0 : I ≠ ⊥
hIM : I ≤ M
hM : Ideal.IsMaximal M
Z₀ : Multiset (PrimeSpectrum A)
hZ₀ :
  Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ M
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
hPM : P.asIdeal ≤ M
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
⊢ P.asIdeal ≠ ⊥ ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥

tactic: convert hZI
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_1
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
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.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hIM : I ≤ P.asIdeal
hM : Ideal.IsMaximal P.asIdeal
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ P.asIdeal
hPM : P.asIdeal ≤ P.asIdeal
⊢ Multiset.prod (P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≤ I

tactic: rw [this, Multiset.cons_erase hPZ']
state_before: case h.e'_3.h.e'_3
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
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.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hIM : I ≤ P.asIdeal
hM : Ideal.IsMaximal P.asIdeal
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ P.asIdeal
hPM : P.asIdeal ≤ P.asIdeal
⊢ P.asIdeal ::ₘ Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) = Multiset.map PrimeSpectrum.asIdeal Z

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.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
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.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hIM : I ≤ P.asIdeal
hM : Ideal.IsMaximal P.asIdeal
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ P.asIdeal
hPM : P.asIdeal ≤ P.asIdeal
⊢ ¬Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≤ I

tactic: exact hZP0
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.refine_2
R : Type ?u.147404
A : Type u_1
K : Type ?u.147410
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
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.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≤ I ∧ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z₀) ≠ ⊥
Z : Multiset (PrimeSpectrum A)
h_eraseZ :
  ∀ (x : Multiset (PrimeSpectrum A)),
    (x ∈ fun Z =>
        Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I ∧
          Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥) →
      ¬x < Z
hZI : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ I
hprodZ : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≠ ⊥
hZ0 : Z ≠ 0
P : PrimeSpectrum A
hPZ : P ∈ Z
hPZ' : P.asIdeal ∈ Multiset.map PrimeSpectrum.asIdeal Z
this :
  Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P) =
    Multiset.erase (Multiset.map PrimeSpectrum.asIdeal Z) P.asIdeal
hP0 : P.asIdeal ≠ ⊥
hZP0 : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥
hIM : I ≤ P.asIdeal
hM : Ideal.IsMaximal P.asIdeal
hZM : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal Z) ≤ P.asIdeal
hPM : P.asIdeal ≤ P.asIdeal
h : Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≤ I
⊢ Multiset.prod (Multiset.map PrimeSpectrum.asIdeal (Multiset.erase Z P)) ≠ ⊥