l3lab/ntp-mathlib huggingface dataset:
noncomputable instance : Lifting L₁ W₁ (Φ.functor ⋙ L₂) (Φ.localizedFunctor L₁ L₂) := by
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁷ : Category.{v₁, u₁} C₁
inst✝⁶ : Category.{v₂, u₂} C₂
inst✝⁵ : Category.{v₃, u₃} C₃
inst✝⁴ : Category.{v₄, u₄} D₁
inst✝³ : Category.{v₅, u₅} D₂
inst✝² : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝¹ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝ : Functor.IsLocalization L₂ W₂
⊢ Lifting L₁ W₁ (Φ.functor ⋙ L₂) (localizedFunctor Φ L₁ L₂)

Next tactic:
dsimp [localizedFunctor]
noncomputable instance : Lifting L₁ W₁ (Φ.functor ⋙ L₂) (Φ.localizedFunctor L₁ L₂) := by
  dsimp [localizedFunctor]
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁷ : Category.{v₁, u₁} C₁
inst✝⁶ : Category.{v₂, u₂} C₂
inst✝⁵ : Category.{v₃, u₃} C₃
inst✝⁴ : Category.{v₄, u₄} D₁
inst✝³ : Category.{v₅, u₅} D₂
inst✝² : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝¹ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝ : Functor.IsLocalization L₂ W₂
⊢ Lifting L₁ W₁ (Φ.functor ⋙ L₂) (lift (Φ.functor ⋙ L₂) (_ : MorphismProperty.IsInvertedBy W₁ (Φ.functor ⋙ L₂)) L₁)

Next tactic:
infer_instance
/-- If a localizer morphism induces an equivalence on some choice of localized categories,
it will be so for any choice of localized categoriees. -/
noncomputable def isEquivalence_imp [IsEquivalence G] :
  IsEquivalence G' := by
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹⁴ : Category.{v₁, u₁} C₁
inst✝¹³ : Category.{v₂, u₂} C₂
inst✝¹² : Category.{v₃, u₃} C₃
inst✝¹¹ : Category.{v₄, u₄} D₁
inst✝¹⁰ : Category.{v₅, u₅} D₂
inst✝⁹ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁸ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁷ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁶ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁵ : Category.{v₄', u₄'} D₁'
inst✝⁴ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝³ : Functor.IsLocalization L₁' W₁
inst✝² : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝¹ : CatCommSq Φ.functor L₁' L₂' G'
inst✝ : IsEquivalence G
⊢ IsEquivalence G'

Next tactic:
let E₁ := Localization.uniq L₁ L₁' W₁
/-- If a localizer morphism induces an equivalence on some choice of localized categories,
it will be so for any choice of localized categoriees. -/
noncomputable def isEquivalence_imp [IsEquivalence G] :
  IsEquivalence G' := by
    let E₁ := Localization.uniq L₁ L₁' W₁
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹⁴ : Category.{v₁, u₁} C₁
inst✝¹³ : Category.{v₂, u₂} C₂
inst✝¹² : Category.{v₃, u₃} C₃
inst✝¹¹ : Category.{v₄, u₄} D₁
inst✝¹⁰ : Category.{v₅, u₅} D₂
inst✝⁹ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁸ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁷ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁶ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁵ : Category.{v₄', u₄'} D₁'
inst✝⁴ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝³ : Functor.IsLocalization L₁' W₁
inst✝² : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝¹ : CatCommSq Φ.functor L₁' L₂' G'
inst✝ : IsEquivalence G
E₁ : D₁ ≌ D₁' := uniq L₁ L₁' W₁
⊢ IsEquivalence G'

Next tactic:
let E₂ := Localization.uniq L₂ L₂' W₂
/-- If a localizer morphism induces an equivalence on some choice of localized categories,
it will be so for any choice of localized categoriees. -/
noncomputable def isEquivalence_imp [IsEquivalence G] :
  IsEquivalence G' := by
    let E₁ := Localization.uniq L₁ L₁' W₁
    let E₂ := Localization.uniq L₂ L₂' W₂
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹⁴ : Category.{v₁, u₁} C₁
inst✝¹³ : Category.{v₂, u₂} C₂
inst✝¹² : Category.{v₃, u₃} C₃
inst✝¹¹ : Category.{v₄, u₄} D₁
inst✝¹⁰ : Category.{v₅, u₅} D₂
inst✝⁹ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁸ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁷ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁶ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁵ : Category.{v₄', u₄'} D₁'
inst✝⁴ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝³ : Functor.IsLocalization L₁' W₁
inst✝² : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝¹ : CatCommSq Φ.functor L₁' L₂' G'
inst✝ : IsEquivalence G
E₁ : D₁ ≌ D₁' := uniq L₁ L₁' W₁
E₂ : D₂ ≌ D₂' := uniq L₂ L₂' W₂
⊢ IsEquivalence G'

Next tactic:
let e : L₁ ⋙ G ⋙ E₂.functor ≅ L₁ ⋙ E₁.functor ⋙ G' :=
      calc
        L₁ ⋙ G ⋙ E₂.functor ≅ Φ.functor ⋙ L₂ ⋙ E₂.functor :=
            (Functor.associator _ _ _).symm ≪≫
              isoWhiskerRight (CatCommSq.iso Φ.functor L₁ L₂ G).symm E₂.functor ≪≫
              Functor.associator _ _ _
        _ ≅ Φ.functor ⋙ L₂' := isoWhiskerLeft Φ.functor (compUniqFunctor L₂ L₂' W₂)
        _ ≅ L₁' ⋙ G' := CatCommSq.iso Φ.functor L₁' L₂' G'
        _ ≅ L₁ ⋙ E₁.functor ⋙ G' :=
              isoWhiskerRight (compUniqFunctor L₁ L₁' W₁).symm G' ≪≫ Functor.associator _ _ _
/-- If a localizer morphism induces an equivalence on some choice of localized categories,
it will be so for any choice of localized categoriees. -/
noncomputable def isEquivalence_imp [IsEquivalence G] :
  IsEquivalence G' := by
    let E₁ := Localization.uniq L₁ L₁' W₁
    let E₂ := Localization.uniq L₂ L₂' W₂
    let e : L₁ ⋙ G ⋙ E₂.functor ≅ L₁ ⋙ E₁.functor ⋙ G' :=
      calc
        L₁ ⋙ G ⋙ E₂.functor ≅ Φ.functor ⋙ L₂ ⋙ E₂.functor :=
            (Functor.associator _ _ _).symm ≪≫
              isoWhiskerRight (CatCommSq.iso Φ.functor L₁ L₂ G).symm E₂.functor ≪≫
              Functor.associator _ _ _
        _ ≅ Φ.functor ⋙ L₂' := isoWhiskerLeft Φ.functor (compUniqFunctor L₂ L₂' W₂)
        _ ≅ L₁' ⋙ G' := CatCommSq.iso Φ.functor L₁' L₂' G'
        _ ≅ L₁ ⋙ E₁.functor ⋙ G' :=
              isoWhiskerRight (compUniqFunctor L₁ L₁' W₁).symm G' ≪≫ Functor.associator _ _ _
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹⁴ : Category.{v₁, u₁} C₁
inst✝¹³ : Category.{v₂, u₂} C₂
inst✝¹² : Category.{v₃, u₃} C₃
inst✝¹¹ : Category.{v₄, u₄} D₁
inst✝¹⁰ : Category.{v₅, u₅} D₂
inst✝⁹ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁸ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁷ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁶ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁵ : Category.{v₄', u₄'} D₁'
inst✝⁴ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝³ : Functor.IsLocalization L₁' W₁
inst✝² : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝¹ : CatCommSq Φ.functor L₁' L₂' G'
inst✝ : IsEquivalence G
E₁ : D₁ ≌ D₁' := uniq L₁ L₁' W₁
E₂ : D₂ ≌ D₂' := uniq L₂ L₂' W₂
e : L₁ ⋙ G ⋙ E₂.functor ≅ L₁ ⋙ E₁.functor ⋙ G' :=
  Trans.trans
    (Trans.trans
      (Trans.trans
        ((Functor.associator L₁ G E₂.functor).symm ≪≫
          isoWhiskerRight (CatCommSq.iso Φ.functor L₁ L₂ G).symm E₂.functor ≪≫
            Functor.associator Φ.functor L₂ E₂.functor)
        (isoWhiskerLeft Φ.functor (compUniqFunctor L₂ L₂' W₂)))
      (CatCommSq.iso Φ.functor L₁' L₂' G'))
    (isoWhiskerRight (compUniqFunctor L₁ L₁' W₁).symm G' ≪≫ Functor.associator L₁ (uniq L₁ L₁' W₁).functor G')
⊢ IsEquivalence G'

Next tactic:
exact IsEquivalence.cancelCompLeft E₁.functor G' inferInstance
      (IsEquivalence.ofIso
        (liftNatIso L₁ W₁ _ _ (G ⋙ E₂.functor) (E₁.functor ⋙ G') e) inferInstance)
lemma nonempty_isEquivalence_iff : Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G') := by
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹³ : Category.{v₁, u₁} C₁
inst✝¹² : Category.{v₂, u₂} C₂
inst✝¹¹ : Category.{v₃, u₃} C₃
inst✝¹⁰ : Category.{v₄, u₄} D₁
inst✝⁹ : Category.{v₅, u₅} D₂
inst✝⁸ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁷ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁶ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁵ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁴ : Category.{v₄', u₄'} D₁'
inst✝³ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝² : Functor.IsLocalization L₁' W₁
inst✝¹ : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝ : CatCommSq Φ.functor L₁' L₂' G'
⊢ Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G')

Next tactic:
constructor
lemma nonempty_isEquivalence_iff : Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G') := by
  constructor
  · 

Proof state:
case mp
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹³ : Category.{v₁, u₁} C₁
inst✝¹² : Category.{v₂, u₂} C₂
inst✝¹¹ : Category.{v₃, u₃} C₃
inst✝¹⁰ : Category.{v₄, u₄} D₁
inst✝⁹ : Category.{v₅, u₅} D₂
inst✝⁸ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁷ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁶ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁵ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁴ : Category.{v₄', u₄'} D₁'
inst✝³ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝² : Functor.IsLocalization L₁' W₁
inst✝¹ : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝ : CatCommSq Φ.functor L₁' L₂' G'
⊢ Nonempty (IsEquivalence G) → Nonempty (IsEquivalence G')

Next tactic:
rintro ⟨e⟩
lemma nonempty_isEquivalence_iff : Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G') := by
  constructor
  · rintro ⟨e⟩
    

Proof state:
case mp.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹³ : Category.{v₁, u₁} C₁
inst✝¹² : Category.{v₂, u₂} C₂
inst✝¹¹ : Category.{v₃, u₃} C₃
inst✝¹⁰ : Category.{v₄, u₄} D₁
inst✝⁹ : Category.{v₅, u₅} D₂
inst✝⁸ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁷ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁶ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁵ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁴ : Category.{v₄', u₄'} D₁'
inst✝³ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝² : Functor.IsLocalization L₁' W₁
inst✝¹ : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝ : CatCommSq Φ.functor L₁' L₂' G'
e : IsEquivalence G
⊢ Nonempty (IsEquivalence G')

Next tactic:
exact ⟨Φ.isEquivalence_imp L₁ L₂ G L₁' L₂' G'⟩
lemma nonempty_isEquivalence_iff : Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G') := by
  constructor
  · rintro ⟨e⟩
    exact ⟨Φ.isEquivalence_imp L₁ L₂ G L₁' L₂' G'⟩
  · 

Proof state:
case mpr
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹³ : Category.{v₁, u₁} C₁
inst✝¹² : Category.{v₂, u₂} C₂
inst✝¹¹ : Category.{v₃, u₃} C₃
inst✝¹⁰ : Category.{v₄, u₄} D₁
inst✝⁹ : Category.{v₅, u₅} D₂
inst✝⁸ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁷ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁶ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁵ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁴ : Category.{v₄', u₄'} D₁'
inst✝³ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝² : Functor.IsLocalization L₁' W₁
inst✝¹ : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝ : CatCommSq Φ.functor L₁' L₂' G'
⊢ Nonempty (IsEquivalence G') → Nonempty (IsEquivalence G)

Next tactic:
rintro ⟨e'⟩
lemma nonempty_isEquivalence_iff : Nonempty (IsEquivalence G) ↔ Nonempty (IsEquivalence G') := by
  constructor
  · rintro ⟨e⟩
    exact ⟨Φ.isEquivalence_imp L₁ L₂ G L₁' L₂' G'⟩
  · rintro ⟨e'⟩
    

Proof state:
case mpr.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝¹³ : Category.{v₁, u₁} C₁
inst✝¹² : Category.{v₂, u₂} C₂
inst✝¹¹ : Category.{v₃, u₃} C₃
inst✝¹⁰ : Category.{v₄, u₄} D₁
inst✝⁹ : Category.{v₅, u₅} D₂
inst✝⁸ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝⁷ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝⁶ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝⁵ : CatCommSq Φ.functor L₁ L₂ G
D₁' : Type u₄'
D₂' : Type u₅'
inst✝⁴ : Category.{v₄', u₄'} D₁'
inst✝³ : Category.{v₅', u₅'} D₂'
L₁' : C₁ ⥤ D₁'
L₂' : C₂ ⥤ D₂'
inst✝² : Functor.IsLocalization L₁' W₁
inst✝¹ : Functor.IsLocalization L₂' W₂
G' : D₁' ⥤ D₂'
inst✝ : CatCommSq Φ.functor L₁' L₂' G'
e' : IsEquivalence G'
⊢ Nonempty (IsEquivalence G)

Next tactic:
exact ⟨Φ.isEquivalence_imp L₁' L₂' G' L₁ L₂ G⟩
lemma IsLocalizedEquivalence.mk' [CatCommSq Φ.functor L₁ L₂ G] [IsEquivalence G] :
    Φ.IsLocalizedEquivalence where
  nonempty_isEquivalence := by
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁹ : Category.{v₁, u₁} C₁
inst✝⁸ : Category.{v₂, u₂} C₂
inst✝⁷ : Category.{v₃, u₃} C₃
inst✝⁶ : Category.{v₄, u₄} D₁
inst✝⁵ : Category.{v₅, u₅} D₂
inst✝⁴ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝³ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝² : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝¹ : CatCommSq Φ.functor L₁ L₂ G
inst✝ : IsEquivalence G
⊢ Nonempty (IsEquivalence (localizedFunctor Φ (MorphismProperty.Q W₁) (MorphismProperty.Q W₂)))

Next tactic:
rw [Φ.nonempty_isEquivalence_iff W₁.Q W₂.Q (Φ.localizedFunctor W₁.Q W₂.Q) L₁ L₂ G]
lemma IsLocalizedEquivalence.mk' [CatCommSq Φ.functor L₁ L₂ G] [IsEquivalence G] :
    Φ.IsLocalizedEquivalence where
  nonempty_isEquivalence := by
    rw [Φ.nonempty_isEquivalence_iff W₁.Q W₂.Q (Φ.localizedFunctor W₁.Q W₂.Q) L₁ L₂ G]
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁹ : Category.{v₁, u₁} C₁
inst✝⁸ : Category.{v₂, u₂} C₂
inst✝⁷ : Category.{v₃, u₃} C₃
inst✝⁶ : Category.{v₄, u₄} D₁
inst✝⁵ : Category.{v₅, u₅} D₂
inst✝⁴ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝³ : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝² : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝¹ : CatCommSq Φ.functor L₁ L₂ G
inst✝ : IsEquivalence G
⊢ Nonempty (IsEquivalence G)

Next tactic:
exact ⟨inferInstance⟩
/-- If a `LocalizerMorphism` is a localized equivalence, then any compatible functor
between the localized categories is an equivalence. -/
noncomputable def isEquivalence [h : Φ.IsLocalizedEquivalence] [CatCommSq Φ.functor L₁ L₂ G] :
    IsEquivalence G := Nonempty.some (by
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
h : IsLocalizedEquivalence Φ
inst✝ : CatCommSq Φ.functor L₁ L₂ G
⊢ Nonempty (IsEquivalence G)

Next tactic:
rw [Φ.nonempty_isEquivalence_iff L₁ L₂ G W₁.Q W₂.Q (Φ.localizedFunctor W₁.Q W₂.Q)]
/-- If a `LocalizerMorphism` is a localized equivalence, then any compatible functor
between the localized categories is an equivalence. -/
noncomputable def isEquivalence [h : Φ.IsLocalizedEquivalence] [CatCommSq Φ.functor L₁ L₂ G] :
    IsEquivalence G := Nonempty.some (by
  rw [Φ.nonempty_isEquivalence_iff L₁ L₂ G W₁.Q W₂.Q (Φ.localizedFunctor W₁.Q W₂.Q)]
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
h : IsLocalizedEquivalence Φ
inst✝ : CatCommSq Φ.functor L₁ L₂ G
⊢ Nonempty (IsEquivalence (localizedFunctor Φ (MorphismProperty.Q W₁) (MorphismProperty.Q W₂)))

Next tactic:
exact h.nonempty_isEquivalence
/-- When `Φ : LocalizerMorphism W₁ W₂`, if the composition `Φ.functor ⋙ L₂` is a
localization functor for `W₁`, then `Φ` is a localized equivalence. -/
lemma IsLocalizedEquivalence.of_isLocalization_of_isLocalization
    [(Φ.functor ⋙ L₂).IsLocalization W₁] :
    IsLocalizedEquivalence Φ := by
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝ : Functor.IsLocalization (Φ.functor ⋙ L₂) W₁
⊢ IsLocalizedEquivalence Φ

Next tactic:
have : CatCommSq Φ.functor (Φ.functor ⋙ L₂) L₂ (𝟭 D₂) :=
    CatCommSq.mk (Functor.rightUnitor _).symm
/-- When `Φ : LocalizerMorphism W₁ W₂`, if the composition `Φ.functor ⋙ L₂` is a
localization functor for `W₁`, then `Φ` is a localized equivalence. -/
lemma IsLocalizedEquivalence.of_isLocalization_of_isLocalization
    [(Φ.functor ⋙ L₂).IsLocalization W₁] :
    IsLocalizedEquivalence Φ := by
  have : CatCommSq Φ.functor (Φ.functor ⋙ L₂) L₂ (𝟭 D₂) :=
    CatCommSq.mk (Functor.rightUnitor _).symm
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝ : Functor.IsLocalization (Φ.functor ⋙ L₂) W₁
this : CatCommSq Φ.functor (Φ.functor ⋙ L₂) L₂ (𝟭 D₂)
⊢ IsLocalizedEquivalence Φ

Next tactic:
exact IsLocalizedEquivalence.mk' Φ (Φ.functor ⋙ L₂) L₂ (𝟭 D₂)
/-- When the underlying functor `Φ.functor` of `Φ : LocalizerMorphism W₁ W₂` is
an equivalence of categories and that `W₁` and `W₂` essentially correspond to each
other via this equivalence, then `Φ` is a localized equivalence. -/
lemma IsLocalizedEquivalence.of_equivalence [IsEquivalence Φ.functor]
    (h : W₂ ⊆ W₁.map Φ.functor) : IsLocalizedEquivalence Φ := by
  

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝ : IsEquivalence Φ.functor
h : W₂ ⊆ MorphismProperty.map W₁ Φ.functor
⊢ IsLocalizedEquivalence Φ

Next tactic:
haveI : Functor.IsLocalization (Φ.functor ⋙ MorphismProperty.Q W₂) W₁ := by
    refine' Functor.IsLocalization.of_equivalence_source W₂.Q W₂ (Φ.functor ⋙ W₂.Q) W₁
      (Functor.asEquivalence Φ.functor).symm _ (Φ.inverts W₂.Q)
      ((Functor.associator _ _ _).symm ≪≫ isoWhiskerRight ((Equivalence.unitIso _).symm) _ ≪≫
        Functor.leftUnitor _)
    erw [W₁.isoClosure.inverseImage_equivalence_functor_eq_map_inverse
      W₁.isoClosure_respectsIso Φ.functor.asEquivalence]
    rw [MorphismProperty.map_isoClosure]
    exact h
/-- When the underlying functor `Φ.functor` of `Φ : LocalizerMorphism W₁ W₂` is
an equivalence of categories and that `W₁` and `W₂` essentially correspond to each
other via this equivalence, then `Φ` is a localized equivalence. -/
lemma IsLocalizedEquivalence.of_equivalence [IsEquivalence Φ.functor]
    (h : W₂ ⊆ W₁.map Φ.functor) : IsLocalizedEquivalence Φ := by
  haveI : Functor.IsLocalization (Φ.functor ⋙ MorphismProperty.Q W₂) W₁ := by
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝ : IsEquivalence Φ.functor
h : W₂ ⊆ MorphismProperty.map W₁ Φ.functor
⊢ Functor.IsLocalization (Φ.functor ⋙ MorphismProperty.Q W₂) W₁

Next tactic:
refine' Functor.IsLocalization.of_equivalence_source W₂.Q W₂ (Φ.functor ⋙ W₂.Q) W₁
      (Functor.asEquivalence Φ.functor).symm _ (Φ.inverts W₂.Q)
      ((Functor.associator _ _ _).symm ≪≫ isoWhiskerRight ((Equivalence.unitIso _).symm) _ ≪≫
        Functor.leftUnitor _)
/-- When the underlying functor `Φ.functor` of `Φ : LocalizerMorphism W₁ W₂` is
an equivalence of categories and that `W₁` and `W₂` essentially correspond to each
other via this equivalence, then `Φ` is a localized equivalence. -/
lemma IsLocalizedEquivalence.of_equivalence [IsEquivalence Φ.functor]
    (h : W₂ ⊆ W₁.map Φ.functor) : IsLocalizedEquivalence Φ := by
  haveI : Functor.IsLocalization (Φ.functor ⋙ MorphismProperty.Q W₂) W₁ := by
    refine' Functor.IsLocalization.of_equivalence_source W₂.Q W₂ (Φ.functor ⋙ W₂.Q) W₁
      (Functor.asEquivalence Φ.functor).symm _ (Φ.inverts W₂.Q)
      ((Functor.associator _ _ _).symm ≪≫ isoWhiskerRight ((Equivalence.unitIso _).symm) _ ≪≫
        Functor.leftUnitor _)
    

Proof state:
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
D₁ : Type u₄
D₂ : Type u₅
D₃ : Type u₆
inst✝⁸ : Category.{v₁, u₁} C₁
inst✝⁷ : Category.{v₂, u₂} C₂
inst✝⁶ : Category.{v₃, u₃} C₃
inst✝⁵ : Category.{v₄, u₄} D₁
inst✝⁴ : Category.{v₅, u₅} D₂
inst✝³ : Category.{v₆, u₅} D₂
W₁ : MorphismProperty C₁
W₂ : MorphismProperty C₂
W₃ : MorphismProperty C₃
Φ : LocalizerMorphism W₁ W₂
L₁ : C₁ ⥤ D₁
inst✝² : Functor.IsLocalization L₁ W₁
L₂ : C₂ ⥤ D₂
inst✝¹ : Functor.IsLocalization L₂ W₂
G : D₁ ⥤ D₂
inst✝ : IsEquivalence Φ.functor
h : W₂ ⊆ MorphismProperty.map W₁ Φ.functor
⊢ W₂ ⊆ MorphismProperty.inverseImage (MorphismProperty.isoClosure W₁) (Functor.asEquivalence Φ.functor).symm.functor

Next tactic:
erw [W₁.isoClosure.inverseImage_equivalence_functor_eq_map_inverse
      W₁.isoClosure_respectsIso Φ.functor.asEquivalence]