Theorem: CategoryTheory.Faithful.div_comp
File: Mathlib/CategoryTheory/Functor/FullyFaithful.lean

tactic: cases' F with F_pre _ _
state_before: C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F✝ F' : C ⥤ D
G✝ : D ⥤ E
F : C ⥤ E
inst✝¹ : Faithful F
G : D ⥤ E
inst✝ : Faithful G
obj : C → D
h_obj : ∀ (X : C), G.obj (obj X) = F.obj X
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
h_map : ∀ {X Y : C} {f : X ⟶ Y}, HEq (G.map (map f)) (F.map f)
⊢ Faithful.div F G obj h_obj map h_map ⋙ G = F

tactic: cases' G with G_pre _ _
state_before: case mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G✝ G : D ⥤ E
inst✝¹ : Faithful G
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
F_pre : C ⥤q E
map_id✝ : ∀ (X : C), F_pre.map (𝟙 X) = 𝟙 (F_pre.obj X)
map_comp✝ : ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z), F_pre.map (f ≫ g) = F_pre.map f ≫ F_pre.map g
inst✝ : Faithful (Functor.mk F_pre)
h_obj : ∀ (X : C), G.obj (obj X) = (Functor.mk F_pre).obj X
h_map : ∀ {X Y : C} {f : X ⟶ Y}, HEq (G.map (map f)) ((Functor.mk F_pre).map f)
⊢ Faithful.div (Functor.mk F_pre) G obj h_obj map h_map ⋙ G = Functor.mk F_pre

tactic: cases' F_pre with F_obj _
state_before: case mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
F_pre : C ⥤q E
map_id✝¹ : ∀ (X : C), F_pre.map (𝟙 X) = 𝟙 (F_pre.obj X)
map_comp✝¹ : ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z), F_pre.map (f ≫ g) = F_pre.map f ≫ F_pre.map g
inst✝¹ : Faithful (Functor.mk F_pre)
G_pre : D ⥤q E
map_id✝ : ∀ (X : D), G_pre.map (𝟙 X) = 𝟙 (G_pre.obj X)
map_comp✝ : ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z), G_pre.map (f ≫ g) = G_pre.map f ≫ G_pre.map g
inst✝ : Faithful (Functor.mk G_pre)
h_obj : ∀ (X : C), (Functor.mk G_pre).obj (obj X) = (Functor.mk F_pre).obj X
h_map : ∀ {X Y : C} {f : X ⟶ Y}, HEq ((Functor.mk G_pre).map (map f)) ((Functor.mk F_pre).map f)
⊢ Faithful.div (Functor.mk F_pre) (Functor.mk G_pre) obj h_obj map h_map ⋙ Functor.mk G_pre = Functor.mk F_pre

tactic: cases' G_pre with G_obj _
state_before: case mk.mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
G_pre : D ⥤q E
map_id✝¹ : ∀ (X : D), G_pre.map (𝟙 X) = 𝟙 (G_pre.obj X)
map_comp✝¹ : ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z), G_pre.map (f ≫ g) = G_pre.map f ≫ G_pre.map g
inst✝¹ : Faithful (Functor.mk G_pre)
F_obj : C → E
map✝ : {X Y : C} → (X ⟶ Y) → (F_obj X ⟶ F_obj Y)
map_id✝ : ∀ (X : C), { obj := F_obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := F_obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := F_obj, map := map✝ }.map (f ≫ g) =
      { obj := F_obj, map := map✝ }.map f ≫ { obj := F_obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := F_obj, map := map✝ })
h_obj : ∀ (X : C), (Functor.mk G_pre).obj (obj X) = (Functor.mk { obj := F_obj, map := map✝ }).obj X
h_map : ∀ {X Y : C} {f : X ⟶ Y}, HEq ((Functor.mk G_pre).map (map f)) ((Functor.mk { obj := F_obj, map := map✝ }).map f)
⊢ Faithful.div (Functor.mk { obj := F_obj, map := map✝ }) (Functor.mk G_pre) obj h_obj map h_map ⋙ Functor.mk G_pre =
    Functor.mk { obj := F_obj, map := map✝ }

tactic: unfold Faithful.div Functor.comp
state_before: case mk.mk.mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
F_obj : C → E
map✝¹ : {X Y : C} → (X ⟶ Y) → (F_obj X ⟶ F_obj Y)
map_id✝¹ : ∀ (X : C), { obj := F_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := F_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := F_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := F_obj, map := map✝¹ }.map f ≫ { obj := F_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := F_obj, map := map✝¹ })
G_obj : D → E
map✝ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝ : ∀ (X : D), { obj := G_obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj, map := map✝ }.map f ≫ { obj := G_obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj, map := map✝ })
h_obj :
  ∀ (X : C), (Functor.mk { obj := G_obj, map := map✝ }).obj (obj X) = (Functor.mk { obj := F_obj, map := map✝¹ }).obj X
h_map :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝ }).map (map f)) ((Functor.mk { obj := F_obj, map := map✝¹ }).map f)
⊢ Faithful.div (Functor.mk { obj := F_obj, map := map✝¹ }) (Functor.mk { obj := G_obj, map := map✝ }) obj h_obj map
        h_map ⋙
      Functor.mk { obj := G_obj, map := map✝ } =
    Functor.mk { obj := F_obj, map := map✝¹ }

tactic: have : F_obj = G_obj ∘ obj := (funext h_obj).symm
state_before: case mk.mk.mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
F_obj : C → E
map✝¹ : {X Y : C} → (X ⟶ Y) → (F_obj X ⟶ F_obj Y)
map_id✝¹ : ∀ (X : C), { obj := F_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := F_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := F_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := F_obj, map := map✝¹ }.map f ≫ { obj := F_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := F_obj, map := map✝¹ })
G_obj : D → E
map✝ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝ : ∀ (X : D), { obj := G_obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj, map := map✝ }.map f ≫ { obj := G_obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj, map := map✝ })
h_obj :
  ∀ (X : C), (Functor.mk { obj := G_obj, map := map✝ }).obj (obj X) = (Functor.mk { obj := F_obj, map := map✝¹ }).obj X
h_map :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝ }).map (map f)) ((Functor.mk { obj := F_obj, map := map✝¹ }).map f)
⊢ Functor.mk
      { obj := fun X => (Functor.mk { obj := G_obj, map := map✝ }).obj ((Functor.mk { obj := obj, map := map }).obj X),
        map := fun {X Y} f =>
          (Functor.mk { obj := G_obj, map := map✝ }).map ((Functor.mk { obj := obj, map := map }).map f) } =
    Functor.mk { obj := F_obj, map := map✝¹ }

tactic: subst this
state_before: case mk.mk.mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
F_obj : C → E
map✝¹ : {X Y : C} → (X ⟶ Y) → (F_obj X ⟶ F_obj Y)
map_id✝¹ : ∀ (X : C), { obj := F_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := F_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := F_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := F_obj, map := map✝¹ }.map f ≫ { obj := F_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := F_obj, map := map✝¹ })
G_obj : D → E
map✝ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝ : ∀ (X : D), { obj := G_obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj, map := map✝ }.map f ≫ { obj := G_obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj, map := map✝ })
h_obj :
  ∀ (X : C), (Functor.mk { obj := G_obj, map := map✝ }).obj (obj X) = (Functor.mk { obj := F_obj, map := map✝¹ }).obj X
h_map :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝ }).map (map f)) ((Functor.mk { obj := F_obj, map := map✝¹ }).map f)
this : F_obj = G_obj ∘ obj
⊢ Functor.mk
      { obj := fun X => (Functor.mk { obj := G_obj, map := map✝ }).obj ((Functor.mk { obj := obj, map := map }).obj X),
        map := fun {X Y} f =>
          (Functor.mk { obj := G_obj, map := map✝ }).map ((Functor.mk { obj := obj, map := map }).map f) } =
    Functor.mk { obj := F_obj, map := map✝¹ }

tactic: congr
state_before: case mk.mk.mk.mk
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
G_obj : D → E
map✝¹ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝¹ : ∀ (X : D), { obj := G_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := G_obj, map := map✝¹ }.map f ≫ { obj := G_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := G_obj, map := map✝¹ })
map✝ : {X Y : C} → (X ⟶ Y) → ((G_obj ∘ obj) X ⟶ (G_obj ∘ obj) Y)
map_id✝ : ∀ (X : C), { obj := G_obj ∘ obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj ∘ obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj ∘ obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj ∘ obj, map := map✝ }.map f ≫ { obj := G_obj ∘ obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj ∘ obj, map := map✝ })
h_obj :
  ∀ (X : C),
    (Functor.mk { obj := G_obj, map := map✝¹ }).obj (obj X) = (Functor.mk { obj := G_obj ∘ obj, map := map✝ }).obj X
h_map :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝¹ }).map (map f))
      ((Functor.mk { obj := G_obj ∘ obj, map := map✝ }).map f)
⊢ Functor.mk
      { obj := fun X => (Functor.mk { obj := G_obj, map := map✝¹ }).obj ((Functor.mk { obj := obj, map := map }).obj X),
        map := fun {X Y} f =>
          (Functor.mk { obj := G_obj, map := map✝¹ }).map ((Functor.mk { obj := obj, map := map }).map f) } =
    Functor.mk { obj := G_obj ∘ obj, map := map✝ }

tactic: simp only [Function.comp_apply, heq_eq_eq] at h_map
state_before: case mk.mk.mk.mk.e_toPrefunctor.e_map
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
G_obj : D → E
map✝¹ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝¹ : ∀ (X : D), { obj := G_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := G_obj, map := map✝¹ }.map f ≫ { obj := G_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := G_obj, map := map✝¹ })
map✝ : {X Y : C} → (X ⟶ Y) → ((G_obj ∘ obj) X ⟶ (G_obj ∘ obj) Y)
map_id✝ : ∀ (X : C), { obj := G_obj ∘ obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj ∘ obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj ∘ obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj ∘ obj, map := map✝ }.map f ≫ { obj := G_obj ∘ obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj ∘ obj, map := map✝ })
h_obj :
  ∀ (X : C),
    (Functor.mk { obj := G_obj, map := map✝¹ }).obj (obj X) = (Functor.mk { obj := G_obj ∘ obj, map := map✝ }).obj X
h_map :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝¹ }).map (map f))
      ((Functor.mk { obj := G_obj ∘ obj, map := map✝ }).map f)
⊢ (fun {X Y} f => (Functor.mk { obj := G_obj, map := map✝¹ }).map ((Functor.mk { obj := obj, map := map }).map f)) =
    map✝

tactic: ext
state_before: case mk.mk.mk.mk.e_toPrefunctor.e_map
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
G_obj : D → E
map✝¹ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝¹ : ∀ (X : D), { obj := G_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := G_obj, map := map✝¹ }.map f ≫ { obj := G_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := G_obj, map := map✝¹ })
map✝ : {X Y : C} → (X ⟶ Y) → ((G_obj ∘ obj) X ⟶ (G_obj ∘ obj) Y)
map_id✝ : ∀ (X : C), { obj := G_obj ∘ obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj ∘ obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj ∘ obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj ∘ obj, map := map✝ }.map f ≫ { obj := G_obj ∘ obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj ∘ obj, map := map✝ })
h_obj :
  ∀ (X : C),
    (Functor.mk { obj := G_obj, map := map✝¹ }).obj (obj X) = (Functor.mk { obj := G_obj ∘ obj, map := map✝ }).obj X
h_map✝ :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝¹ }).map (map f))
      ((Functor.mk { obj := G_obj ∘ obj, map := map✝ }).map f)
h_map : ∀ {X Y : C} {f : X ⟶ Y}, map✝¹ (map f) = map✝ f
⊢ (fun {X Y} f => (Functor.mk { obj := G_obj, map := map✝¹ }).map ((Functor.mk { obj := obj, map := map }).map f)) =
    map✝

tactic: exact h_map
state_before: case mk.mk.mk.mk.e_toPrefunctor.e_map.h.h.h
C : Type u₁
inst✝⁴ : Category C
D : Type u₂
inst✝³ : Category D
E : Type u₃
inst✝² : Category E
F F' : C ⥤ D
G : D ⥤ E
obj : C → D
map : {X Y : C} → (X ⟶ Y) → (obj X ⟶ obj Y)
G_obj : D → E
map✝¹ : {X Y : D} → (X ⟶ Y) → (G_obj X ⟶ G_obj Y)
map_id✝¹ : ∀ (X : D), { obj := G_obj, map := map✝¹ }.map (𝟙 X) = 𝟙 ({ obj := G_obj, map := map✝¹ }.obj X)
map_comp✝¹ :
  ∀ {X Y Z : D} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj, map := map✝¹ }.map (f ≫ g) =
      { obj := G_obj, map := map✝¹ }.map f ≫ { obj := G_obj, map := map✝¹ }.map g
inst✝¹ : Faithful (Functor.mk { obj := G_obj, map := map✝¹ })
map✝ : {X Y : C} → (X ⟶ Y) → ((G_obj ∘ obj) X ⟶ (G_obj ∘ obj) Y)
map_id✝ : ∀ (X : C), { obj := G_obj ∘ obj, map := map✝ }.map (𝟙 X) = 𝟙 ({ obj := G_obj ∘ obj, map := map✝ }.obj X)
map_comp✝ :
  ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := G_obj ∘ obj, map := map✝ }.map (f ≫ g) =
      { obj := G_obj ∘ obj, map := map✝ }.map f ≫ { obj := G_obj ∘ obj, map := map✝ }.map g
inst✝ : Faithful (Functor.mk { obj := G_obj ∘ obj, map := map✝ })
h_obj :
  ∀ (X : C),
    (Functor.mk { obj := G_obj, map := map✝¹ }).obj (obj X) = (Functor.mk { obj := G_obj ∘ obj, map := map✝ }).obj X
h_map✝ :
  ∀ {X Y : C} {f : X ⟶ Y},
    HEq ((Functor.mk { obj := G_obj, map := map✝¹ }).map (map f))
      ((Functor.mk { obj := G_obj ∘ obj, map := map✝ }).map f)
h_map : ∀ {X Y : C} {f : X ⟶ Y}, map✝¹ (map f) = map✝ f
x✝² x✝¹ : C
x✝ : x✝² ⟶ x✝¹
⊢ (Functor.mk { obj := G_obj, map := map✝¹ }).map ((Functor.mk { obj := obj, map := map }).map x✝) = map✝ x✝