l3lab/ntp-mathlib huggingface dataset:
lemma isIso_liftCycles_iff (K : CochainComplex C ℕ) {X : C} (φ : X ⟶ K.X 0)
    [K.HasHomology 0] (hφ : φ ≫ K.d 0 1 = 0) :
    IsIso (K.liftCycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.up ℕ).next 0 = i)
    (hφ : φ ≫ K.d 0 i = 0), IsIso (K.liftCycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : CochainComplex C ℕ
X : C
φ : X ⟶ HomologicalComplex.X K 0
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : φ ≫ HomologicalComplex.d K 0 1 = 0
hφ : φ ≫ HomologicalComplex.d K 0 (ComplexShape.next (ComplexShape.up ℕ) 0) = 0
⊢ 0 ≫ 0 = 0

Next tactic:
simp
lemma isIso_liftCycles_iff (K : CochainComplex C ℕ) {X : C} (φ : X ⟶ K.X 0)
    [K.HasHomology 0] (hφ : φ ≫ K.d 0 1 = 0) :
    IsIso (K.liftCycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.up ℕ).next 0 = i)
    (hφ : φ ≫ K.d 0 i = 0), IsIso (K.liftCycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) ⟶ K.sc 0 :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : CochainComplex C ℕ
X : C
φ : X ⟶ HomologicalComplex.X K 0
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : φ ≫ HomologicalComplex.d K 0 1 = 0
hφ : φ ≫ HomologicalComplex.d K 0 (ComplexShape.next (ComplexShape.up ℕ) 0) = 0
α : ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) ⟶ HomologicalComplex.sc K 0 := ShortComplex.Hom.mk 0 φ 0
⊢ IsIso
      (HomologicalComplex.liftCycles K φ (ComplexShape.next (ComplexShape.up ℕ) 0)
        (_ : ComplexShape.next (ComplexShape.up ℕ) 0 = ComplexShape.next (ComplexShape.up ℕ) 0) hφ) ↔
    ShortComplex.Exact (ShortComplex.mk φ (HomologicalComplex.d K 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) hφ) ∧
      Mono φ

Next tactic:
exact (ShortComplex.quasiIso_iff_isIso_liftCycles α rfl rfl (by simp)).symm.trans
    (ShortComplex.quasiIso_iff_of_zeros α rfl rfl (by simp))
lemma isIso_liftCycles_iff (K : CochainComplex C ℕ) {X : C} (φ : X ⟶ K.X 0)
    [K.HasHomology 0] (hφ : φ ≫ K.d 0 1 = 0) :
    IsIso (K.liftCycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.up ℕ).next 0 = i)
    (hφ : φ ≫ K.d 0 i = 0), IsIso (K.liftCycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) ⟶ K.sc 0 :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  exact (ShortComplex.quasiIso_iff_isIso_liftCycles α rfl rfl (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : CochainComplex C ℕ
X : C
φ : X ⟶ HomologicalComplex.X K 0
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : φ ≫ HomologicalComplex.d K 0 1 = 0
hφ : φ ≫ HomologicalComplex.d K 0 (ComplexShape.next (ComplexShape.up ℕ) 0) = 0
α : ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) ⟶ HomologicalComplex.sc K 0 := ShortComplex.Hom.mk 0 φ 0
⊢ (HomologicalComplex.sc K 0).f = 0

Next tactic:
simp
lemma isIso_liftCycles_iff (K : CochainComplex C ℕ) {X : C} (φ : X ⟶ K.X 0)
    [K.HasHomology 0] (hφ : φ ≫ K.d 0 1 = 0) :
    IsIso (K.liftCycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.up ℕ).next 0 = i)
    (hφ : φ ≫ K.d 0 i = 0), IsIso (K.liftCycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Mono φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) ⟶ K.sc 0 :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  exact (ShortComplex.quasiIso_iff_isIso_liftCycles α rfl rfl (by simp)).symm.trans
    (ShortComplex.quasiIso_iff_of_zeros α rfl rfl (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : CochainComplex C ℕ
X : C
φ : X ⟶ HomologicalComplex.X K 0
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : φ ≫ HomologicalComplex.d K 0 1 = 0
hφ : φ ≫ HomologicalComplex.d K 0 (ComplexShape.next (ComplexShape.up ℕ) 0) = 0
α : ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) ⟶ HomologicalComplex.sc K 0 := ShortComplex.Hom.mk 0 φ 0
⊢ (HomologicalComplex.sc K 0).f = 0

Next tactic:
simp
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by 

Proof state:
C : Type u_1
inst✝² : Category.{?u.181426, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ : HomologicalComplex.d K 1 0 ≫ φ = 0
⊢ ComplexShape.prev (ComplexShape.down ℕ) 0 = 1

Next tactic:
simp
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ : HomologicalComplex.d K 1 0 ≫ φ = 0
⊢ IsIso (HomologicalComplex.descOpcycles K φ 1 (_ : ComplexShape.prev (ComplexShape.down ℕ) 0 = 1) hφ) ↔
    ShortComplex.Exact (ShortComplex.mk (HomologicalComplex.d K 1 0) φ hφ) ∧ Epi φ

Next tactic:
suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ : HomologicalComplex.d K 1 0 ≫ φ = 0
this :
  ∀ (i : ℕ) (hx : ComplexShape.prev (ComplexShape.down ℕ) 0 = i) (hφ : HomologicalComplex.d K i 0 ≫ φ = 0),
    IsIso (HomologicalComplex.descOpcycles K φ i hx hφ) ↔
      ShortComplex.Exact (ShortComplex.mk (HomologicalComplex.d K i 0) φ hφ) ∧ Epi φ
⊢ ComplexShape.prev (ComplexShape.down ℕ) 0 = 1

Next tactic:
simp
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ : HomologicalComplex.d K 1 0 ≫ φ = 0
⊢ ∀ (i : ℕ) (hx : ComplexShape.prev (ComplexShape.down ℕ) 0 = i) (hφ : HomologicalComplex.d K i 0 ≫ φ = 0),
    IsIso (HomologicalComplex.descOpcycles K φ i hx hφ) ↔
      ShortComplex.Exact (ShortComplex.mk (HomologicalComplex.d K i 0) φ hφ) ∧ Epi φ

Next tactic:
rintro _ rfl hφ
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : HomologicalComplex.d K 1 0 ≫ φ = 0
hφ : HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0 ≫ φ = 0
⊢ IsIso
      (HomologicalComplex.descOpcycles K φ (ComplexShape.prev (ComplexShape.down ℕ) 0)
        (_ : ComplexShape.prev (ComplexShape.down ℕ) 0 = ComplexShape.prev (ComplexShape.down ℕ) 0) hφ) ↔
    ShortComplex.Exact (ShortComplex.mk (HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) φ hφ) ∧
      Epi φ

Next tactic:
let α : K.sc 0 ⟶ ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : K.sc 0 ⟶ ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : HomologicalComplex.d K 1 0 ≫ φ = 0
hφ : HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0 ≫ φ = 0
⊢ 0 ≫ 0 = 0

Next tactic:
simp
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : K.sc 0 ⟶ ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : HomologicalComplex.d K 1 0 ≫ φ = 0
hφ : HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0 ≫ φ = 0
α : HomologicalComplex.sc K 0 ⟶ ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) := ShortComplex.Hom.mk 0 φ 0
⊢ IsIso
      (HomologicalComplex.descOpcycles K φ (ComplexShape.prev (ComplexShape.down ℕ) 0)
        (_ : ComplexShape.prev (ComplexShape.down ℕ) 0 = ComplexShape.prev (ComplexShape.down ℕ) 0) hφ) ↔
    ShortComplex.Exact (ShortComplex.mk (HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) φ hφ) ∧
      Epi φ

Next tactic:
exact (ShortComplex.quasiIso_iff_isIso_descOpcycles α (by simp) rfl rfl).symm.trans
    (ShortComplex.quasiIso_iff_of_zeros' α (by simp) rfl rfl)
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : K.sc 0 ⟶ ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  exact (ShortComplex.quasiIso_iff_isIso_descOpcycles α (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : HomologicalComplex.d K 1 0 ≫ φ = 0
hφ : HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0 ≫ φ = 0
α : HomologicalComplex.sc K 0 ⟶ ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) := ShortComplex.Hom.mk 0 φ 0
⊢ (HomologicalComplex.sc K 0).g = 0

Next tactic:
simp
lemma isIso_descOpcycles_iff (K : ChainComplex C ℕ) {X : C} (φ : K.X 0 ⟶ X)
    [K.HasHomology 0] (hφ : K.d 1 0 ≫ φ = 0) :
    IsIso (K.descOpcycles φ 1 (by simp) hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ := by
  suffices ∀ (i : ℕ) (hx : (ComplexShape.down ℕ).prev 0 = i)
    (hφ : K.d i 0 ≫ φ = 0), IsIso (K.descOpcycles φ i hx hφ) ↔
      (ShortComplex.mk _ _ hφ).Exact ∧ Epi φ from this 1 (by simp) hφ
  rintro _ rfl hφ
  let α : K.sc 0 ⟶ ShortComplex.mk (0 : X ⟶ X) (0 : X ⟶ X) (by simp) :=
    { τ₁ := 0
      τ₂ := φ
      τ₃ := 0 }
  exact (ShortComplex.quasiIso_iff_isIso_descOpcycles α (by simp) rfl rfl).symm.trans
    (ShortComplex.quasiIso_iff_of_zeros' α (by 

Proof state:
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : Abelian C
K : ChainComplex C ℕ
X : C
φ : HomologicalComplex.X K 0 ⟶ X
inst✝ : HomologicalComplex.HasHomology K 0
hφ✝ : HomologicalComplex.d K 1 0 ≫ φ = 0
hφ : HomologicalComplex.d K (ComplexShape.prev (ComplexShape.down ℕ) 0) 0 ≫ φ = 0
α : HomologicalComplex.sc K 0 ⟶ ShortComplex.mk 0 0 (_ : 0 ≫ 0 = 0) := ShortComplex.Hom.mk 0 φ 0
⊢ (HomologicalComplex.sc K 0).g = 0

Next tactic:
simp
@[simp]
theorem map_eq_top_iff [LE α] [OrderTop α] [PartialOrder β] [OrderTop β] [OrderIsoClass F α β]
    (f : F) {a : α} : f a = ⊤ ↔ a = ⊤ := by
  

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁴ : LE α
inst✝³ : OrderTop α
inst✝² : PartialOrder β
inst✝¹ : OrderTop β
inst✝ : OrderIsoClass F α β
f : F
a : α
⊢ f a = ⊤ ↔ a = ⊤

Next tactic:
letI : TopHomClass F α β := OrderIsoClass.toTopHomClass
@[simp]
theorem map_eq_top_iff [LE α] [OrderTop α] [PartialOrder β] [OrderTop β] [OrderIsoClass F α β]
    (f : F) {a : α} : f a = ⊤ ↔ a = ⊤ := by
  letI : TopHomClass F α β := OrderIsoClass.toTopHomClass
  

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁴ : LE α
inst✝³ : OrderTop α
inst✝² : PartialOrder β
inst✝¹ : OrderTop β
inst✝ : OrderIsoClass F α β
f : F
a : α
this : TopHomClass F α β := OrderIsoClass.toTopHomClass
⊢ f a = ⊤ ↔ a = ⊤

Next tactic:
rw [← map_top f, (EquivLike.injective f).eq_iff]
@[simp]
theorem map_eq_bot_iff [LE α] [OrderBot α] [PartialOrder β] [OrderBot β] [OrderIsoClass F α β]
    (f : F) {a : α} : f a = ⊥ ↔ a = ⊥ := by
  

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁴ : LE α
inst✝³ : OrderBot α
inst✝² : PartialOrder β
inst✝¹ : OrderBot β
inst✝ : OrderIsoClass F α β
f : F
a : α
⊢ f a = ⊥ ↔ a = ⊥

Next tactic:
letI : BotHomClass F α β := OrderIsoClass.toBotHomClass
@[simp]
theorem map_eq_bot_iff [LE α] [OrderBot α] [PartialOrder β] [OrderBot β] [OrderIsoClass F α β]
    (f : F) {a : α} : f a = ⊥ ↔ a = ⊥ := by
  letI : BotHomClass F α β := OrderIsoClass.toBotHomClass
  

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁴ : LE α
inst✝³ : OrderBot α
inst✝² : PartialOrder β
inst✝¹ : OrderBot β
inst✝ : OrderIsoClass F α β
f : F
a : α
this : BotHomClass F α β := OrderIsoClass.toBotHomClass
⊢ f a = ⊥ ↔ a = ⊥

Next tactic:
rw [← map_bot f, (EquivLike.injective f).eq_iff]
instance : TopHomClass (TopHom α β) α
      β where
  coe := TopHom.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Top α
inst✝² : Top β
inst✝¹ : Top γ
inst✝ : Top δ
f g : TopHom α β
h : f.toFun = g.toFun
⊢ f = g

Next tactic:
cases f
instance : TopHomClass (TopHom α β) α
      β where
  coe := TopHom.toFun
  coe_injective' f g h := by cases f; 

Proof state:
case mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Top α
inst✝² : Top β
inst✝¹ : Top γ
inst✝ : Top δ
g : TopHom α β
toFun✝ : α → β
map_top'✝ : toFun✝ ⊤ = ⊤
h : { toFun := toFun✝, map_top' := map_top'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, map_top' := map_top'✝ } = g

Next tactic:
cases g
instance : TopHomClass (TopHom α β) α
      β where
  coe := TopHom.toFun
  coe_injective' f g h := by cases f; cases g; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Top α
inst✝² : Top β
inst✝¹ : Top γ
inst✝ : Top δ
toFun✝¹ : α → β
map_top'✝¹ : toFun✝¹ ⊤ = ⊤
toFun✝ : α → β
map_top'✝ : toFun✝ ⊤ = ⊤
h : { toFun := toFun✝¹, map_top' := map_top'✝¹ }.toFun = { toFun := toFun✝, map_top' := map_top'✝ }.toFun
⊢ { toFun := toFun✝¹, map_top' := map_top'✝¹ } = { toFun := toFun✝, map_top' := map_top'✝ }

Next tactic:
congr
/-- Composition of `TopHom`s as a `TopHom`. -/
def comp (f : TopHom β γ) (g : TopHom α β) :
    TopHom α γ where
  toFun := f ∘ g
  map_top' := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Top α
inst✝² : Top β
inst✝¹ : Top γ
inst✝ : Top δ
f : TopHom β γ
g : TopHom α β
⊢ (⇑f ∘ ⇑g) ⊤ = ⊤

Next tactic:
rw [comp_apply, map_top, map_top]
@[simp]
theorem cancel_left {g : TopHom β γ} {f₁ f₂ : TopHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => TopHom.ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Top α
inst✝² : Top β
inst✝¹ : Top γ
inst✝ : Top δ
g : TopHom β γ
f₁ f₂ : TopHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← TopHom.comp_apply, h, TopHom.comp_apply]
instance : Inf (TopHom α β) :=
  ⟨fun f g => ⟨f ⊓ g, by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝² : Top α
inst✝¹ : SemilatticeInf β
inst✝ : OrderTop β
f✝ g✝ f g : TopHom α β
⊢ (⇑f ⊓ ⇑g) ⊤ = ⊤

Next tactic:
rw [Pi.inf_apply, map_top, map_top, inf_top_eq]
instance : Sup (TopHom α β) :=
  ⟨fun f g => ⟨f ⊔ g, by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝² : Top α
inst✝¹ : SemilatticeSup β
inst✝ : OrderTop β
f✝ g✝ f g : TopHom α β
⊢ (⇑f ⊔ ⇑g) ⊤ = ⊤

Next tactic:
rw [Pi.sup_apply, map_top, map_top, sup_top_eq]
instance : BotHomClass (BotHom α β) α
      β where
  coe := BotHom.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Bot α
inst✝² : Bot β
inst✝¹ : Bot γ
inst✝ : Bot δ
f g : BotHom α β
h : f.toFun = g.toFun
⊢ f = g

Next tactic:
cases f
instance : BotHomClass (BotHom α β) α
      β where
  coe := BotHom.toFun
  coe_injective' f g h := by cases f; 

Proof state:
case mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Bot α
inst✝² : Bot β
inst✝¹ : Bot γ
inst✝ : Bot δ
g : BotHom α β
toFun✝ : α → β
map_bot'✝ : toFun✝ ⊥ = ⊥
h : { toFun := toFun✝, map_bot' := map_bot'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, map_bot' := map_bot'✝ } = g

Next tactic:
cases g
instance : BotHomClass (BotHom α β) α
      β where
  coe := BotHom.toFun
  coe_injective' f g h := by cases f; cases g; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Bot α
inst✝² : Bot β
inst✝¹ : Bot γ
inst✝ : Bot δ
toFun✝¹ : α → β
map_bot'✝¹ : toFun✝¹ ⊥ = ⊥
toFun✝ : α → β
map_bot'✝ : toFun✝ ⊥ = ⊥
h : { toFun := toFun✝¹, map_bot' := map_bot'✝¹ }.toFun = { toFun := toFun✝, map_bot' := map_bot'✝ }.toFun
⊢ { toFun := toFun✝¹, map_bot' := map_bot'✝¹ } = { toFun := toFun✝, map_bot' := map_bot'✝ }

Next tactic:
congr
/-- Composition of `BotHom`s as a `BotHom`. -/
def comp (f : BotHom β γ) (g : BotHom α β) :
    BotHom α γ where
  toFun := f ∘ g
  map_bot' := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Bot α
inst✝² : Bot β
inst✝¹ : Bot γ
inst✝ : Bot δ
f : BotHom β γ
g : BotHom α β
⊢ (⇑f ∘ ⇑g) ⊥ = ⊥

Next tactic:
rw [comp_apply, map_bot, map_bot]
@[simp]
theorem cancel_left {g : BotHom β γ} {f₁ f₂ : BotHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h => BotHom.ext fun a => hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝³ : Bot α
inst✝² : Bot β
inst✝¹ : Bot γ
inst✝ : Bot δ
g : BotHom β γ
f₁ f₂ : BotHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← BotHom.comp_apply, h, BotHom.comp_apply]
instance : Inf (BotHom α β) :=
  ⟨fun f g => ⟨f ⊓ g, by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝² : Bot α
inst✝¹ : SemilatticeInf β
inst✝ : OrderBot β
f✝ g✝ f g : BotHom α β
⊢ (⇑f ⊓ ⇑g) ⊥ = ⊥

Next tactic:
rw [Pi.inf_apply, map_bot, map_bot, inf_bot_eq]
instance : Sup (BotHom α β) :=
  ⟨fun f g => ⟨f ⊔ g, by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝² : Bot α
inst✝¹ : SemilatticeSup β
inst✝ : OrderBot β
f✝ g✝ f g : BotHom α β
⊢ (⇑f ⊔ ⇑g) ⊥ = ⊥

Next tactic:
rw [Pi.sup_apply, map_bot, map_bot, sup_bot_eq]
instance : BoundedOrderHomClass (BoundedOrderHom α β) α
      β where
  coe f := f.toFun
  coe_injective' f g h := by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁷ : Preorder α
inst✝⁶ : Preorder β
inst✝⁵ : Preorder γ
inst✝⁴ : Preorder δ
inst✝³ : BoundedOrder α
inst✝² : BoundedOrder β
inst✝¹ : BoundedOrder γ
inst✝ : BoundedOrder δ
f g : BoundedOrderHom α β
h : (fun f => f.toFun) f = (fun f => f.toFun) g
⊢ f = g

Next tactic:
obtain ⟨⟨_, _⟩, _⟩ := f
instance : BoundedOrderHomClass (BoundedOrderHom α β) α
      β where
  coe f := f.toFun
  coe_injective' f g h := by obtain ⟨⟨_, _⟩, _⟩ := f; 

Proof state:
case mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁷ : Preorder α
inst✝⁶ : Preorder β
inst✝⁵ : Preorder γ
inst✝⁴ : Preorder δ
inst✝³ : BoundedOrder α
inst✝² : BoundedOrder β
inst✝¹ : BoundedOrder γ
inst✝ : BoundedOrder δ
g : BoundedOrderHom α β
toFun✝ : α → β
monotone'✝ : Monotone toFun✝
map_top'✝ : OrderHom.toFun { toFun := toFun✝, monotone' := monotone'✝ } ⊤ = ⊤
map_bot'✝ : OrderHom.toFun { toFun := toFun✝, monotone' := monotone'✝ } ⊥ = ⊥
h :
  (fun f => f.toFun)
      { toOrderHom := { toFun := toFun✝, monotone' := monotone'✝ }, map_top' := map_top'✝, map_bot' := map_bot'✝ } =
    (fun f => f.toFun) g
⊢ { toOrderHom := { toFun := toFun✝, monotone' := monotone'✝ }, map_top' := map_top'✝, map_bot' := map_bot'✝ } = g

Next tactic:
obtain ⟨⟨_, _⟩, _⟩ := g
instance : BoundedOrderHomClass (BoundedOrderHom α β) α
      β where
  coe f := f.toFun
  coe_injective' f g h := by obtain ⟨⟨_, _⟩, _⟩ := f; obtain ⟨⟨_, _⟩, _⟩ := g; 

Proof state:
case mk.mk.mk.mk
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁷ : Preorder α
inst✝⁶ : Preorder β
inst✝⁵ : Preorder γ
inst✝⁴ : Preorder δ
inst✝³ : BoundedOrder α
inst✝² : BoundedOrder β
inst✝¹ : BoundedOrder γ
inst✝ : BoundedOrder δ
toFun✝¹ : α → β
monotone'✝¹ : Monotone toFun✝¹
map_top'✝¹ : OrderHom.toFun { toFun := toFun✝¹, monotone' := monotone'✝¹ } ⊤ = ⊤
map_bot'✝¹ : OrderHom.toFun { toFun := toFun✝¹, monotone' := monotone'✝¹ } ⊥ = ⊥
toFun✝ : α → β
monotone'✝ : Monotone toFun✝
map_top'✝ : OrderHom.toFun { toFun := toFun✝, monotone' := monotone'✝ } ⊤ = ⊤
map_bot'✝ : OrderHom.toFun { toFun := toFun✝, monotone' := monotone'✝ } ⊥ = ⊥
h :
  (fun f => f.toFun)
      { toOrderHom := { toFun := toFun✝¹, monotone' := monotone'✝¹ }, map_top' := map_top'✝¹, map_bot' := map_bot'✝¹ } =
    (fun f => f.toFun)
      { toOrderHom := { toFun := toFun✝, monotone' := monotone'✝ }, map_top' := map_top'✝, map_bot' := map_bot'✝ }
⊢ { toOrderHom := { toFun := toFun✝¹, monotone' := monotone'✝¹ }, map_top' := map_top'✝¹, map_bot' := map_bot'✝¹ } =
    { toOrderHom := { toFun := toFun✝, monotone' := monotone'✝ }, map_top' := map_top'✝, map_bot' := map_bot'✝ }

Next tactic:
congr
@[simp]
theorem cancel_left {g : BoundedOrderHom β γ} {f₁ f₂ : BoundedOrderHom α β} (hg : Injective g) :
    g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ :=
  ⟨fun h =>
    BoundedOrderHom.ext fun a =>
      hg <| by 

Proof state:
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
δ : Type u_5
inst✝⁷ : Preorder α
inst✝⁶ : Preorder β
inst✝⁵ : Preorder γ
inst✝⁴ : Preorder δ
inst✝³ : BoundedOrder α
inst✝² : BoundedOrder β
inst✝¹ : BoundedOrder γ
inst✝ : BoundedOrder δ
g : BoundedOrderHom β γ
f₁ f₂ : BoundedOrderHom α β
hg : Injective ⇑g
h : comp g f₁ = comp g f₂
a : α
⊢ g (f₁ a) = g (f₂ a)

Next tactic:
rw [← BoundedOrderHom.comp_apply, h, BoundedOrderHom.comp_apply]