Theorem: CategoryTheory.Functor.pointwiseRightKanExtension_obj
File: Mathlib/CategoryTheory/Functor/KanExtension/Pointwise.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ : D
f : Y₁ ⟶ Y₂
g₁ g₂ : StructuredArrow Y₂ L
φ : g₁ ⟶ g₂
⊢ ((const (StructuredArrow Y₂ L)).obj (limit (StructuredArrow.proj Y₁ L ⋙ F))).map φ ≫
      (fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g)) g₂ =
    (fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g)) g₁ ≫
      (StructuredArrow.proj Y₂ L ⋙ F).map φ
state_after: no goals
tactic: simpa using (limit.w (StructuredArrow.proj Y₁ L ⋙ F)
              ((StructuredArrow.map f).map φ)).symm
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ { obj := fun Y => limit (StructuredArrow.proj Y L ⋙ F),
            map := fun {Y₁ Y₂} f =>
              limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
                { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
                  π :=
                    { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                      naturality := ⋯ } } }.map
        (𝟙 Y) ≫
      limit.π (StructuredArrow.proj Y L ⋙ F) j =
    𝟙
        ({ obj := fun Y => limit (StructuredArrow.proj Y L ⋙ F),
              map := fun {Y₁ Y₂} f =>
                limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
                  { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
                    π :=
                      { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                        naturality := ⋯ } } }.obj
          Y) ≫
      limit.π (StructuredArrow.proj Y L ⋙ F) j
state_after: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ limit.lift (StructuredArrow.proj Y L ⋙ F)
        { pt := limit (StructuredArrow.proj Y L ⋙ F),
          π :=
            { app := fun g => limit.π (StructuredArrow.proj Y L ⋙ F) ((StructuredArrow.map (𝟙 Y)).obj g),
              naturality := ⋯ } } ≫
      limit.π (StructuredArrow.proj Y L ⋙ F) j =
    𝟙 (limit (StructuredArrow.proj Y L ⋙ F)) ≫ limit.π (StructuredArrow.proj Y L ⋙ F) j
tactic: dsimp
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ limit.lift (StructuredArrow.proj Y L ⋙ F)
        { pt := limit (StructuredArrow.proj Y L ⋙ F),
          π :=
            { app := fun g => limit.π (StructuredArrow.proj Y L ⋙ F) ((StructuredArrow.map (𝟙 Y)).obj g),
              naturality := ⋯ } } ≫
      limit.π (StructuredArrow.proj Y L ⋙ F) j =
    𝟙 (limit (StructuredArrow.proj Y L ⋙ F)) ≫ limit.π (StructuredArrow.proj Y L ⋙ F) j
state_after: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ limit.π (StructuredArrow.proj Y L ⋙ F) ((StructuredArrow.map (𝟙 Y)).obj j) = limit.π (StructuredArrow.proj Y L ⋙ F) j
tactic: simp only [limit.lift_π, id_comp]
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ limit.π (StructuredArrow.proj Y L ⋙ F) ((StructuredArrow.map (𝟙 Y)).obj j) = limit.π (StructuredArrow.proj Y L ⋙ F) j
state_after: case h.e_7.h
C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ (StructuredArrow.map (𝟙 Y)).obj j = j
tactic: congr
state_before: case h.e_7.h
C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y : D
j : StructuredArrow Y L
⊢ (StructuredArrow.map (𝟙 Y)).obj j = j
state_after: no goals
tactic: apply StructuredArrow.map_id
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ { obj := fun Y => limit (StructuredArrow.proj Y L ⋙ F),
            map := fun {Y₁ Y₂} f =>
              limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
                { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
                  π :=
                    { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                      naturality := ⋯ } } }.map
        (f ≫ f') ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j =
    ({ obj := fun Y => limit (StructuredArrow.proj Y L ⋙ F),
              map := fun {Y₁ Y₂} f =>
                limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
                  { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
                    π :=
                      { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                        naturality := ⋯ } } }.map
          f ≫
        { obj := fun Y => limit (StructuredArrow.proj Y L ⋙ F),
              map := fun {Y₁ Y₂} f =>
                limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
                  { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
                    π :=
                      { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                        naturality := ⋯ } } }.map
          f') ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j
state_after: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ limit.lift (StructuredArrow.proj Y₃ L ⋙ F)
        { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
          π :=
            { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map (f ≫ f')).obj g),
              naturality := ⋯ } } ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j =
    (limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
          { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
            π :=
              { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                naturality := ⋯ } } ≫
        limit.lift (StructuredArrow.proj Y₃ L ⋙ F)
          { pt := limit (StructuredArrow.proj Y₂ L ⋙ F),
            π :=
              { app := fun g => limit.π (StructuredArrow.proj Y₂ L ⋙ F) ((StructuredArrow.map f').obj g),
                naturality := ⋯ } }) ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j
tactic: dsimp
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ limit.lift (StructuredArrow.proj Y₃ L ⋙ F)
        { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
          π :=
            { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map (f ≫ f')).obj g),
              naturality := ⋯ } } ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j =
    (limit.lift (StructuredArrow.proj Y₂ L ⋙ F)
          { pt := limit (StructuredArrow.proj Y₁ L ⋙ F),
            π :=
              { app := fun g => limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj g),
                naturality := ⋯ } } ≫
        limit.lift (StructuredArrow.proj Y₃ L ⋙ F)
          { pt := limit (StructuredArrow.proj Y₂ L ⋙ F),
            π :=
              { app := fun g => limit.π (StructuredArrow.proj Y₂ L ⋙ F) ((StructuredArrow.map f').obj g),
                naturality := ⋯ } }) ≫
      limit.π (StructuredArrow.proj Y₃ L ⋙ F) j
state_after: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map (f ≫ f')).obj j) =
    limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj ((StructuredArrow.map f').obj j))
tactic: simp only [limit.lift_π, assoc]
state_before: C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map (f ≫ f')).obj j) =
    limit.π (StructuredArrow.proj Y₁ L ⋙ F) ((StructuredArrow.map f).obj ((StructuredArrow.map f').obj j))
state_after: case h.e_7.h
C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ (StructuredArrow.map (f ≫ f')).obj j = (StructuredArrow.map f).obj ((StructuredArrow.map f').obj j)
tactic: congr 1
state_before: case h.e_7.h
C : Type u_1
D : Type u_2
H : Type u_3
inst✝³ : Category.{?u.123995, u_1} C
inst✝² : Category.{?u.123999, u_2} D
inst✝¹ : Category.{?u.124003, u_3} H
L : C ⥤ D
F : C ⥤ H
inst✝ : L.HasPointwiseRightKanExtension F
Y₁ Y₂ Y₃ : D
f : Y₁ ⟶ Y₂
f' : Y₂ ⟶ Y₃
j : StructuredArrow Y₃ L
⊢ (StructuredArrow.map (f ≫ f')).obj j = (StructuredArrow.map f).obj ((StructuredArrow.map f').obj j)
state_after: no goals
tactic: apply StructuredArrow.map_comp