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

tactic: have H : normalizedFactors (normalizedFactors I ∩ normalizedFactors J).prod =
    normalizedFactors I ∩ normalizedFactors J := by
  apply normalizedFactors_prod_of_prime
  intro p hp
  rw [mem_inter] at hp
  exact prime_of_normalized_factor p hp.left
state_before: R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
⊢ I ⊔ J = Multiset.prod (normalizedFactors I ∩ normalizedFactors J)

tactic: have := Multiset.prod_ne_zero_of_prime (normalizedFactors I ∩ normalizedFactors J) fun _ h =>
    prime_of_normalized_factor _ (Multiset.mem_inter.1 h).1
state_before: R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
⊢ I ⊔ J = Multiset.prod (normalizedFactors I ∩ normalizedFactors J)

tactic: apply le_antisymm
state_before: R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ I ⊔ J = Multiset.prod (normalizedFactors I ∩ normalizedFactors J)

tactic: apply normalizedFactors_prod_of_prime
state_before: R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
⊢ normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J

tactic: intro p hp
state_before: case h
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
⊢ ∀ (p : Ideal T), p ∈ normalizedFactors I ∩ normalizedFactors J → Prime p

tactic: rw [mem_inter] at hp
state_before: case h
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
p : Ideal T
hp : p ∈ normalizedFactors I ∩ normalizedFactors J
⊢ Prime p

tactic: exact prime_of_normalized_factor p hp.left
state_before: case h
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
p : Ideal T
hp : p ∈ normalizedFactors I ∧ p ∈ normalizedFactors J
⊢ Prime p

tactic: rw [sup_le_iff, ← dvd_iff_le, ← dvd_iff_le]
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ I ⊔ J ≤ Multiset.prod (normalizedFactors I ∩ normalizedFactors J)

tactic: constructor
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ∣ I ∧
    Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ∣ J

tactic: rw [dvd_iff_normalizedFactors_le_normalizedFactors this hI, H]
state_before: case a.left
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ∣ I

tactic: exact inf_le_left
state_before: case a.left
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ normalizedFactors I ∩ normalizedFactors J ≤ normalizedFactors I

tactic: rw [dvd_iff_normalizedFactors_le_normalizedFactors this hJ, H]
state_before: case a.right
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ∣ J

tactic: exact inf_le_right
state_before: case a.right
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ normalizedFactors I ∩ normalizedFactors J ≤ normalizedFactors J

tactic: rw [← dvd_iff_le, dvd_iff_normalizedFactors_le_normalizedFactors,
  normalizedFactors_prod_of_prime, le_iff_count]
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≤ I ⊔ J

tactic: intro a
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ ∀ (a : Ideal T), count a (normalizedFactors (I ⊔ J)) ≤ count a (normalizedFactors I ∩ normalizedFactors J)

tactic: rw [Multiset.count_inter]
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
a : Ideal T
⊢ count a (normalizedFactors (I ⊔ J)) ≤ count a (normalizedFactors I ∩ normalizedFactors J)

tactic: exact le_min (count_le_of_ideal_ge le_sup_left hI a) (count_le_of_ideal_ge le_sup_right hJ a)
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
a : Ideal T
⊢ count a (normalizedFactors (I ⊔ J)) ≤ min (count a (normalizedFactors I)) (count a (normalizedFactors J))

tactic: intro p hp
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ ∀ (p : Ideal T), p ∈ normalizedFactors I ∩ normalizedFactors J → Prime p

tactic: rw [mem_inter] at hp
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
p : Ideal T
hp : p ∈ normalizedFactors I ∩ normalizedFactors J
⊢ Prime p

tactic: exact prime_of_normalized_factor p hp.left
state_before: case a
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
p : Ideal T
hp : p ∈ normalizedFactors I ∧ p ∈ normalizedFactors J
⊢ Prime p

tactic: exact ne_bot_of_le_ne_bot hI le_sup_left
state_before: case a.hx
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ I ⊔ J ≠ 0

tactic: exact this
state_before: case a.hy
R : Type ?u.906300
A : Type ?u.906303
K : Type ?u.906306
inst✝⁶ : CommRing R
inst✝⁵ : CommRing A
inst✝⁴ : Field K
inst✝³ : IsDomain A
T : Type u_1
inst✝² : CommRing T
inst✝¹ : IsDomain T
inst✝ : IsDedekindDomain T
I J : Ideal T
hI : I ≠ ⊥
hJ : J ≠ ⊥
H :
  normalizedFactors (Multiset.prod (normalizedFactors I ∩ normalizedFactors J)) =
    normalizedFactors I ∩ normalizedFactors J
this : Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0
⊢ Multiset.prod (normalizedFactors I ∩ normalizedFactors J) ≠ 0