-- Mathlib/CategoryTheory/Quotient.lean
theorem lift_spec : functor r ⋙ lift r F H = F

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ functor r ⋙ lift r F H = F

Tactic:
apply Functor.ext

Result:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ autoParam (∀ (X Y : C) (f : X ⟶ Y), (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯) _auto✝

case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ ∀ (X : C), (functor r ⋙ lift r F H).obj X = F.obj X

Proof state:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X Y : C
f : X ⟶ Y
⊢ (Quot.mk (CompClosure r) f).liftOn (fun f => F.map f) ⋯ = 𝟙 (F.obj X) ≫ F.map f ≫ 𝟙 (F.obj Y)

Tactic:
simp

Result:
no goals

Proof state:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ autoParam (∀ (X Y : C) (f : X ⟶ Y), (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯) _auto✝

case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ ∀ (X : C), (functor r ⋙ lift r F H).obj X = F.obj X

Tactic:
rotate_left

Result:
case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ ∀ (X : C), (functor r ⋙ lift r F H).obj X = F.obj X

case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ autoParam (∀ (X Y : C) (f : X ⟶ Y), (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯) _auto✝

Proof state:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X Y : C
f : X ⟶ Y
⊢ (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯

Tactic:
dsimp [lift, functor]

Result:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X Y : C
f : X ⟶ Y
⊢ (Quot.mk (CompClosure r) f).liftOn (fun f => F.map f) ⋯ = 𝟙 (F.obj X) ≫ F.map f ≫ 𝟙 (F.obj Y)

Proof state:
case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X : C
⊢ (functor r ⋙ lift r F H).obj X = F.obj X

Tactic:
rfl

Result:
no goals

Proof state:
case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ ∀ (X : C), (functor r ⋙ lift r F H).obj X = F.obj X

Tactic:
rintro X

Result:
case h_obj
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X : C
⊢ (functor r ⋙ lift r F H).obj X = F.obj X

Proof state:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
⊢ autoParam (∀ (X Y : C) (f : X ⟶ Y), (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯) _auto✝

Tactic:
rintro X Y f

Result:
case h_map
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
r : HomRel C
D : Type u_3
inst✝ : Category.{u_4, u_3} D
F : C ⥤ D
H : ∀ (x y : C) (f₁ f₂ : x ⟶ y), r f₁ f₂ → F.map f₁ = F.map f₂
X Y : C
f : X ⟶ Y
⊢ (functor r ⋙ lift r F H).map f = eqToHom ⋯ ≫ F.map f ≫ eqToHom ⋯