l3lab/ntp-mathlib huggingface dataset:
theorem idealFactorsFunOfQuotHom_comp {f : R ⧸ I →+* A ⧸ J} {g : A ⧸ J →+* B ⧸ L}
    (hf : Function.Surjective f) (hg : Function.Surjective g) :
    (idealFactorsFunOfQuotHom hg).comp (idealFactorsFunOfQuotHom hf) =
      idealFactorsFunOfQuotHom (show Function.Surjective (g.comp f) from hg.comp hf) := by
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Field K
inst✝⁴ : IsDomain A
inst✝³ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝² : CommRing B
inst✝¹ : IsDomain B
inst✝ : IsDedekindDomain B
L : Ideal B
f : R ⧸ I →+* A ⧸ J
g : A ⧸ J →+* B ⧸ L
hf : Function.Surjective ⇑f
hg : Function.Surjective ⇑g
⊢ OrderHom.comp (idealFactorsFunOfQuotHom hg) (idealFactorsFunOfQuotHom hf) =
    idealFactorsFunOfQuotHom (_ : Function.Surjective ⇑(RingHom.comp g f))

Next tactic:
refine OrderHom.ext _ _ (funext fun x => ?_)
theorem idealFactorsFunOfQuotHom_comp {f : R ⧸ I →+* A ⧸ J} {g : A ⧸ J →+* B ⧸ L}
    (hf : Function.Surjective f) (hg : Function.Surjective g) :
    (idealFactorsFunOfQuotHom hg).comp (idealFactorsFunOfQuotHom hf) =
      idealFactorsFunOfQuotHom (show Function.Surjective (g.comp f) from hg.comp hf) := by
  refine OrderHom.ext _ _ (funext fun x => ?_)
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : CommRing A
inst✝⁵ : Field K
inst✝⁴ : IsDomain A
inst✝³ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝² : CommRing B
inst✝¹ : IsDomain B
inst✝ : IsDedekindDomain B
L : Ideal B
f : R ⧸ I →+* A ⧸ J
g : A ⧸ J →+* B ⧸ L
hf : Function.Surjective ⇑f
hg : Function.Surjective ⇑g
x : { p // p ∣ I }
⊢ (OrderHom.comp (idealFactorsFunOfQuotHom hg) (idealFactorsFunOfQuotHom hf)) x =
    (idealFactorsFunOfQuotHom (_ : Function.Surjective ⇑(RingHom.comp g f))) x

Next tactic:
rw [idealFactorsFunOfQuotHom, idealFactorsFunOfQuotHom, OrderHom.comp_coe, OrderHom.coe_mk,
    OrderHom.coe_mk, Function.comp_apply, idealFactorsFunOfQuotHom, OrderHom.coe_mk,
    Subtype.mk_eq_mk, Subtype.coe_mk, map_comap_of_surjective (Ideal.Quotient.mk J)
    Quotient.mk_surjective, map_map]
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
⊢ ↑{p | p ∣ I} ≃o ↑{p | p ∣ J}

Next tactic:
have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
⊢ ↑{p | p ∣ I} ≃o ↑{p | p ∣ J}

Next tactic:
have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
⊢ ↑{p | p ∣ I} ≃o ↑{p | p ∣ J}

Next tactic:
refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · 

Proof state:
case refine_1
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom f_surj) ↑(idealFactorsFunOfQuotHom fsym_surj) = OrderHom.id

Next tactic:
have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
    

Proof state:
case refine_1
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
this :
  OrderHom.comp (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj) =
    idealFactorsFunOfQuotHom (_ : Function.Surjective ⇑(RingHom.comp ↑f ↑(RingEquiv.symm f)))
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom f_surj) ↑(idealFactorsFunOfQuotHom fsym_surj) = OrderHom.id

Next tactic:
simp only [RingEquiv.comp_symm, idealFactorsFunOfQuotHom_id] at this
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
    simp only [RingEquiv.comp_symm, idealFactorsFunOfQuotHom_id] at this
    

Proof state:
case refine_1
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
this : OrderHom.comp (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj) = OrderHom.id
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom f_surj) ↑(idealFactorsFunOfQuotHom fsym_surj) = OrderHom.id

Next tactic:
rw [← this, OrderHom.coe_eq, OrderHom.coe_eq]
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
    simp only [RingEquiv.comp_symm, idealFactorsFunOfQuotHom_id] at this
    rw [← this, OrderHom.coe_eq, OrderHom.coe_eq]
  · 

Proof state:
case refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom fsym_surj) ↑(idealFactorsFunOfQuotHom f_surj) = OrderHom.id

Next tactic:
have := idealFactorsFunOfQuotHom_comp f_surj fsym_surj
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
    simp only [RingEquiv.comp_symm, idealFactorsFunOfQuotHom_id] at this
    rw [← this, OrderHom.coe_eq, OrderHom.coe_eq]
  · have := idealFactorsFunOfQuotHom_comp f_surj fsym_surj
    

Proof state:
case refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
this :
  OrderHom.comp (idealFactorsFunOfQuotHom fsym_surj) (idealFactorsFunOfQuotHom f_surj) =
    idealFactorsFunOfQuotHom (_ : Function.Surjective ⇑(RingHom.comp ↑(RingEquiv.symm f) ↑f))
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom fsym_surj) ↑(idealFactorsFunOfQuotHom f_surj) = OrderHom.id

Next tactic:
simp only [RingEquiv.symm_comp, idealFactorsFunOfQuotHom_id] at this
/-- The bijection between ideals of `R` dividing `I` and the ideals of `A` dividing `J` induced by
  an isomorphism `f : R/I ≅ A/J`. -/
-- @[simps] -- Porting note: simpNF complains about the lemmas generated by simps
def idealFactorsEquivOfQuotEquiv : { p : Ideal R | p ∣ I } ≃o { p : Ideal A | p ∣ J } := by
  have f_surj : Function.Surjective (f : R ⧸ I →+* A ⧸ J) := f.surjective
  have fsym_surj : Function.Surjective (f.symm : A ⧸ J →+* R ⧸ I) := f.symm.surjective
  refine OrderIso.ofHomInv (idealFactorsFunOfQuotHom f_surj) (idealFactorsFunOfQuotHom fsym_surj)
    ?_ ?_
  · have := idealFactorsFunOfQuotHom_comp fsym_surj f_surj
    simp only [RingEquiv.comp_symm, idealFactorsFunOfQuotHom_id] at this
    rw [← this, OrderHom.coe_eq, OrderHom.coe_eq]
  · have := idealFactorsFunOfQuotHom_comp f_surj fsym_surj
    simp only [RingEquiv.symm_comp, idealFactorsFunOfQuotHom_id] at this
    

Proof state:
case refine_2
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
f_surj : Function.Surjective ⇑↑f
fsym_surj : Function.Surjective ⇑↑(RingEquiv.symm f)
this : OrderHom.comp (idealFactorsFunOfQuotHom fsym_surj) (idealFactorsFunOfQuotHom f_surj) = OrderHom.id
⊢ OrderHom.comp ↑(idealFactorsFunOfQuotHom fsym_surj) ↑(idealFactorsFunOfQuotHom f_surj) = OrderHom.id

Next tactic:
rw [← this, OrderHom.coe_eq, OrderHom.coe_eq]
theorem idealFactorsEquivOfQuotEquiv_is_dvd_iso {L M : Ideal R} (hL : L ∣ I) (hM : M ∣ I) :
    (idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ : Ideal A) ∣ idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ↔
      L ∣ M := by
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L✝ : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
L M : Ideal R
hL : L ∣ I
hM : M ∣ I
⊢ ↑((idealFactorsEquivOfQuotEquiv f) { val := L, property := hL }) ∣
      ↑((idealFactorsEquivOfQuotEquiv f) { val := M, property := hM }) ↔
    L ∣ M

Next tactic:
suffices
    idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ≤ idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ ↔
      (⟨M, hM⟩ : { p : Ideal R | p ∣ I }) ≤ ⟨L, hL⟩
    by rw [dvd_iff_le, dvd_iff_le, Subtype.coe_le_coe, this, Subtype.mk_le_mk]
theorem idealFactorsEquivOfQuotEquiv_is_dvd_iso {L M : Ideal R} (hL : L ∣ I) (hM : M ∣ I) :
    (idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ : Ideal A) ∣ idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ↔
      L ∣ M := by
  suffices
    idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ≤ idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ ↔
      (⟨M, hM⟩ : { p : Ideal R | p ∣ I }) ≤ ⟨L, hL⟩
    by 

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L✝ : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
L M : Ideal R
hL : L ∣ I
hM : M ∣ I
this :
  (idealFactorsEquivOfQuotEquiv f) { val := M, property := hM } ≤
      (idealFactorsEquivOfQuotEquiv f) { val := L, property := hL } ↔
    { val := M, property := hM } ≤ { val := L, property := hL }
⊢ ↑((idealFactorsEquivOfQuotEquiv f) { val := L, property := hL }) ∣
      ↑((idealFactorsEquivOfQuotEquiv f) { val := M, property := hM }) ↔
    L ∣ M

Next tactic:
rw [dvd_iff_le, dvd_iff_le, Subtype.coe_le_coe, this, Subtype.mk_le_mk]
theorem idealFactorsEquivOfQuotEquiv_is_dvd_iso {L M : Ideal R} (hL : L ∣ I) (hM : M ∣ I) :
    (idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ : Ideal A) ∣ idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ↔
      L ∣ M := by
  suffices
    idealFactorsEquivOfQuotEquiv f ⟨M, hM⟩ ≤ idealFactorsEquivOfQuotEquiv f ⟨L, hL⟩ ↔
      (⟨M, hM⟩ : { p : Ideal R | p ∣ I }) ≤ ⟨L, hL⟩
    by rw [dvd_iff_le, dvd_iff_le, Subtype.coe_le_coe, this, Subtype.mk_le_mk]
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝⁹ : CommRing R
inst✝⁸ : CommRing A
inst✝⁷ : Field K
inst✝⁶ : IsDomain A
inst✝⁵ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁴ : CommRing B
inst✝³ : IsDomain B
inst✝² : IsDedekindDomain B
L✝ : Ideal B
inst✝¹ : IsDomain R
inst✝ : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
L M : Ideal R
hL : L ∣ I
hM : M ∣ I
⊢ (idealFactorsEquivOfQuotEquiv f) { val := M, property := hM } ≤
      (idealFactorsEquivOfQuotEquiv f) { val := L, property := hL } ↔
    { val := M, property := hM } ≤ { val := L, property := hL }

Next tactic:
exact (idealFactorsEquivOfQuotEquiv f).le_iff_le
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
⊢ ↑((idealFactorsEquivOfQuotEquiv f) { val := L, property := (_ : L ∣ I) }) ∈ normalizedFactors J

Next tactic:
have hI : I ≠ ⊥
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · 

Proof state:
case hI
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
⊢ I ≠ ⊥

Next tactic:
intro hI
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · intro hI
    

Proof state:
case hI
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
hI : I = ⊥
⊢ False

Next tactic:
rw [hI, bot_eq_zero, normalizedFactors_zero, ← Multiset.empty_eq_zero] at hL
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · intro hI
    rw [hI, bot_eq_zero, normalizedFactors_zero, ← Multiset.empty_eq_zero] at hL
    

Proof state:
case hI
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ ∅
hI : I = ⊥
⊢ False

Next tactic:
exact Finset.not_mem_empty _ hL
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · intro hI
    rw [hI, bot_eq_zero, normalizedFactors_zero, ← Multiset.empty_eq_zero] at hL
    exact Finset.not_mem_empty _ hL
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
hI : I ≠ ⊥
⊢ ↑((idealFactorsEquivOfQuotEquiv f) { val := L, property := (_ : L ∣ I) }) ∈ normalizedFactors J

Next tactic:
refine mem_normalizedFactors_factor_dvd_iso_of_mem_normalizedFactors hI hJ hL
    (d := (idealFactorsEquivOfQuotEquiv f).toEquiv) ?_
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · intro hI
    rw [hI, bot_eq_zero, normalizedFactors_zero, ← Multiset.empty_eq_zero] at hL
    exact Finset.not_mem_empty _ hL
  refine mem_normalizedFactors_factor_dvd_iso_of_mem_normalizedFactors hI hJ hL
    (d := (idealFactorsEquivOfQuotEquiv f).toEquiv) ?_
  

Proof state:
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
hI : I ≠ ⊥
⊢ ∀ (l l' : { l // l ∣ I }),
    ↑((idealFactorsEquivOfQuotEquiv f).toEquiv l) ∣ ↑((idealFactorsEquivOfQuotEquiv f).toEquiv l') ↔ ↑l ∣ ↑l'

Next tactic:
rintro ⟨l, hl⟩ ⟨l', hl'⟩
theorem idealFactorsEquivOfQuotEquiv_mem_normalizedFactors_of_mem_normalizedFactors (hJ : J ≠ ⊥)
    {L : Ideal R} (hL : L ∈ normalizedFactors I) :
    ↑(idealFactorsEquivOfQuotEquiv f ⟨L, dvd_of_mem_normalizedFactors hL⟩)
      ∈ normalizedFactors J := by
  have hI : I ≠ ⊥
  · intro hI
    rw [hI, bot_eq_zero, normalizedFactors_zero, ← Multiset.empty_eq_zero] at hL
    exact Finset.not_mem_empty _ hL
  refine mem_normalizedFactors_factor_dvd_iso_of_mem_normalizedFactors hI hJ hL
    (d := (idealFactorsEquivOfQuotEquiv f).toEquiv) ?_
  rintro ⟨l, hl⟩ ⟨l', hl'⟩
  

Proof state:
case mk.mk
R : Type u_1
A : Type u_2
K : Type u_3
inst✝¹¹ : CommRing R
inst✝¹⁰ : CommRing A
inst✝⁹ : Field K
inst✝⁸ : IsDomain A
inst✝⁷ : IsDedekindDomain A
I : Ideal R
J : Ideal A
B : Type u_4
inst✝⁶ : CommRing B
inst✝⁵ : IsDomain B
inst✝⁴ : IsDedekindDomain B
L✝ : Ideal B
inst✝³ : IsDomain R
inst✝² : IsDedekindDomain R
f : R ⧸ I ≃+* A ⧸ J
inst✝¹ : DecidableEq (Ideal R)
inst✝ : DecidableEq (Ideal A)
hJ : J ≠ ⊥
L : Ideal R
hL : L ∈ normalizedFactors I
hI : I ≠ ⊥
l : Ideal R
hl : l ∣ I
l' : Ideal R
hl' : l' ∣ I
⊢ ↑((idealFactorsEquivOfQuotEquiv f).toEquiv { val := l, property := hl }) ∣
      ↑((idealFactorsEquivOfQuotEquiv f).toEquiv { val := l', property := hl' }) ↔
    ↑{ val := l, property := hl } ∣ ↑{ val := l', property := hl' }

Next tactic:
rw [Subtype.coe_mk, Subtype.coe_mk]