Theorem: AlgebraicGeometry.PresheafedSpace.pushforwardDiagramToColimit_map
File: Mathlib/Geometry/RingedSpace/PresheafedSpace/HasColimits.lean

Proof steps:
state_before: J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j : J
⊢ { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
          map := fun {j j'} f =>
            ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                  (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
      (𝟙 j) =
    𝟙
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
        j)
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j : J
⊢ (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        (𝟙 j)) =
    (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
      (𝟙
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
tactic: apply (opEquiv _ _).injective
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j : J
⊢ (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        (𝟙 j)) =
    (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
      (𝟙
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j))
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j : J
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                map := fun {j j'} f =>
                  ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                      (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                        (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
            (𝟙 j))).app
      U =
    ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))
          (𝟙
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))).app
      U
tactic: refine NatTrans.ext _ _ (funext fun U => ?_)
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j : J
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                map := fun {j j'} f =>
                  ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                      (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                        (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
            (𝟙 j))).app
      U =
    ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))
          (𝟙
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j))).app
      U
state_after: no goals
tactic: induction U with
    | h U =>
      simp [opEquiv]
      rfl
state_before: J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
⊢ { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
          map := fun {j j'} f =>
            ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                  (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
      (f ≫ g) =
    { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        f ≫
      { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        g
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
⊢ (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₁)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₃))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        (f ≫ g)) =
    (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₁)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₃))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
          f ≫
        { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
          g)
tactic: apply (opEquiv _ _).injective
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
⊢ (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₁)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₃))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
            map := fun {j j'} f =>
              ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                  (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                    (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
        (f ≫ g)) =
    (opEquiv
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₁)
        ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
          j₃))
      ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
          f ≫
        { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
              map := fun {j j'} f =>
                ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                    (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                      (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
          g)
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₁)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₃))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                map := fun {j j'} f =>
                  ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                      (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                        (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
            (f ≫ g))).app
      U =
    ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₁)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₃))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
              f ≫
            { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
              g)).app
      U
tactic: refine NatTrans.ext _ _ (funext fun U => ?_)
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₁)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₃))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                map := fun {j j'} f =>
                  ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                      (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                        (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
            (f ≫ g))).app
      U =
    ((opEquiv
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₁)
            ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.obj
              j₃))
          ({ obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
              f ≫
            { obj := fun j => op ((pushforward C (colimit.ι (F ⋙ forget C) j)).obj (F.obj j).presheaf),
                  map := fun {j j'} f =>
                    ((pushforward C (colimit.ι (F ⋙ forget C) j')).map (F.map f).c ≫
                        (Pushforward.comp ((F ⋙ forget C).map f) (colimit.ι (F ⋙ forget C) j') (F.obj j).presheaf).inv ≫
                          (pushforwardEq ⋯ (F.obj j).presheaf).hom).op }.map
              g)).app
      U
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ (F.map (f ≫ g)).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      𝟙
          ((F.obj j₁).presheaf.obj
            (op ((Opens.map (F.map (f ≫ g)).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
        (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U =
    ((F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
        𝟙
            ((F.obj j₂).presheaf.obj
              (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₂).presheaf).hom.app U) ≫
      (F.map f).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))) ≫
        𝟙
            ((F.obj j₁).presheaf.obj
              (op ((Opens.map (F.map f).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U
tactic: dsimp [opEquiv]
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
⊢ (F.map (f ≫ g)).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      𝟙
          ((F.obj j₁).presheaf.obj
            (op ((Opens.map (F.map (f ≫ g)).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
        (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U =
    ((F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
        𝟙
            ((F.obj j₂).presheaf.obj
              (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₂).presheaf).hom.app U) ≫
      (F.map f).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))) ≫
        𝟙
            ((F.obj j₁).presheaf.obj
              (op ((Opens.map (F.map f).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
this :
  op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) =
    op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))
⊢ (F.map (f ≫ g)).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      𝟙
          ((F.obj j₁).presheaf.obj
            (op ((Opens.map (F.map (f ≫ g)).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
        (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U =
    ((F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
        𝟙
            ((F.obj j₂).presheaf.obj
              (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₂).presheaf).hom.app U) ≫
      (F.map f).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))) ≫
        𝟙
            ((F.obj j₁).presheaf.obj
              (op ((Opens.map (F.map f).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U
tactic: have :
      op ((Opens.map (F.map g).base).obj
          ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj U.unop)) =
        op ((Opens.map (colimit.ι (F ⋙ PresheafedSpace.forget C) j₂)).obj (unop U)) := by
      apply unop_injective
      rw [← Opens.map_comp_obj]
      congr
      exact colimit.w (F ⋙ PresheafedSpace.forget C) g
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
this :
  op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) =
    op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))
⊢ (F.map (f ≫ g)).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      𝟙
          ((F.obj j₁).presheaf.obj
            (op ((Opens.map (F.map (f ≫ g)).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
        (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U =
    ((F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
        𝟙
            ((F.obj j₂).presheaf.obj
              (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₂).presheaf).hom.app U) ≫
      (F.map f).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))) ≫
        𝟙
            ((F.obj j₁).presheaf.obj
              (op ((Opens.map (F.map f).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))))) ≫
          (pushforwardEq ⋯ (F.obj j₁).presheaf).hom.app U
state_after: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
this :
  op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) =
    op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))
⊢ (F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      (F.map f).c.app (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U)))) ≫
        (F.obj j₁).presheaf.map (eqToHom ⋯) =
    (F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      (F.map f).c.app (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U)))) ≫
        (F.obj j₁).presheaf.map ((Opens.map (F.map f).base).map (eqToHom ⋯)).op ≫ (F.obj j₁).presheaf.map (eqToHom ⋯)
tactic: simp only [map_comp_c_app, pushforward_obj_obj, pushforward_map_app, comp_base,
      pushforwardEq_hom_app, op_obj, Opens.map_comp_obj, id_comp, assoc, eqToHom_map_comp,
      NatTrans.naturality_assoc, pushforward_obj_map, eqToHom_unop]
state_before: case a
J : Type u'
inst✝² : Category.{v', u'} J
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimitsOfShape J TopCat
F : J ⥤ PresheafedSpace C
j₁ j₂ j₃ : J
f : j₁ ⟶ j₂
g : j₂ ⟶ j₃
U : (Opens ↑(colimit (F ⋙ forget C)))ᵒᵖ
this :
  op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) =
    op ((Opens.map (colimit.ι (F ⋙ forget C) j₂)).obj (unop U))
⊢ (F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      (F.map f).c.app (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U)))) ≫
        (F.obj j₁).presheaf.map (eqToHom ⋯) =
    (F.map g).c.app (op ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U))) ≫
      (F.map f).c.app (op ((Opens.map (F.map g).base).obj ((Opens.map (colimit.ι (F ⋙ forget C) j₃)).obj (unop U)))) ≫
        (F.obj j₁).presheaf.map ((Opens.map (F.map f).base).map (eqToHom ⋯)).op ≫ (F.obj j₁).presheaf.map (eqToHom ⋯)
state_after: no goals
tactic: simp [NatTrans.congr (α := (F.map f).c) this]