Documentation

Mathlib.CategoryTheory.Products.Basic

Cartesian products of categories #

We define the category instance on C × D when C and D are categories.

We define:

We further define evaluation : C ⥤ (C ⥤ D) ⥤ D and evaluationUncurried : C × (C ⥤ D) ⥤ D, and products of functors and natural transformations, written F.prod G and α.prod β.

@[simp]
theorem CategoryTheory.prod_comp_fst (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ Z✝ : C × D} (f : X✝ Y✝) (g : Y✝ Z✝) :
@[simp]
theorem CategoryTheory.prod_comp_snd (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ Z✝ : C × D} (f : X✝ Y✝) (g : Y✝ Z✝) :
@[simp]
theorem CategoryTheory.prod_Hom (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X Y : C × D) :
(X Y) = ((X.1 Y.1) × (X.2 Y.2))
theorem CategoryTheory.prod.hom_ext (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X Y : C × D} {f g : X Y} (h₁ : f.1 = g.1) (h₂ : f.2 = g.2) :
f = g
@[simp]

Two rfl lemmas that cannot be generated by @[simps].

@[simp]
theorem CategoryTheory.prod_comp (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {P Q R : C} {S T U : D} (f : (P, S) (Q, T)) (g : (Q, T) (R, U)) :
theorem CategoryTheory.isIso_prod_iff (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {P Q : C} {S T : D} {f : (P, S) (Q, T)} :
IsIso f IsIso f.1 IsIso f.2
def CategoryTheory.prod.etaIso {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (X : C × D) :
(X.1, X.2) X

The isomorphism between (X.1, X.2) and X.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    @[simp]
    theorem CategoryTheory.prod.etaIso_hom {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (X : C × D) :
    (etaIso X).hom = (CategoryStruct.id (X.1, X.2).1, CategoryStruct.id (X.1, X.2).2)
    def CategoryTheory.Iso.prod {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {P Q : C} {S T : D} (f : P Q) (g : S T) :
    (P, S) (Q, T)

    Construct an isomorphism in C × D out of two isomorphisms in C and D.

    Equations
    • f.prod g = { hom := (f.hom, g.hom), inv := (f.inv, g.inv), hom_inv_id := , inv_hom_id := }
    Instances For
      @[simp]
      theorem CategoryTheory.Iso.prod_hom {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {P Q : C} {S T : D} (f : P Q) (g : S T) :
      (f.prod g).hom = (f.hom, g.hom)
      @[simp]
      theorem CategoryTheory.Iso.prod_inv {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {P Q : C} {S T : D} (f : P Q) (g : S T) :
      (f.prod g).inv = (f.inv, g.inv)

      Category.uniformProd C D is an additional instance specialised so both factors have the same universe levels. This helps typeclass resolution.

      Equations
      def CategoryTheory.Prod.sectL (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) :
      Functor C (C × D)

      sectL C Z is the functor C ⥤ C × D given by X ↦ (X, Z).

      Equations
      Instances For
        @[simp]
        theorem CategoryTheory.Prod.sectL_obj (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) (X : C) :
        (sectL C Z).obj X = (X, Z)
        @[simp]
        theorem CategoryTheory.Prod.sectL_map (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) {X✝ Y✝ : C} (f : X✝ Y✝) :
        (sectL C Z).map f = (f, CategoryStruct.id Z)
        def CategoryTheory.Prod.sectR {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] :
        Functor D (C × D)

        sectR Z D is the functor D ⥤ C × D given by Y ↦ (Z, Y) .

        Equations
        Instances For
          @[simp]
          theorem CategoryTheory.Prod.sectR_obj {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] (X : D) :
          (sectR Z D).obj X = (Z, X)
          @[simp]
          theorem CategoryTheory.Prod.sectR_map {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ : D} (f : X✝ Y✝) :
          (sectR Z D).map f = (CategoryStruct.id Z, f)
          @[deprecated CategoryTheory.Prod.sectL (since := "2024-11-12")]
          def CategoryTheory.Prod.sectl (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) :
          Functor C (C × D)

          Alias of CategoryTheory.Prod.sectL.


          sectL C Z is the functor C ⥤ C × D given by X ↦ (X, Z).

          Equations
          Instances For
            @[deprecated CategoryTheory.Prod.sectR (since := "2024-11-12")]
            def CategoryTheory.Prod.sectr {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] :
            Functor D (C × D)

            Alias of CategoryTheory.Prod.sectR.


            sectR Z D is the functor D ⥤ C × D given by Y ↦ (Z, Y) .

            Equations
            Instances For
              @[deprecated CategoryTheory.Prod.sectL_obj (since := "2024-11-12")]
              theorem CategoryTheory.Prod.sectl_obj (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) (X : C) :
              (sectL C Z).obj X = (X, Z)

              Alias of CategoryTheory.Prod.sectL_obj.

              @[deprecated CategoryTheory.Prod.sectR_obj (since := "2024-11-12")]
              theorem CategoryTheory.Prod.sectr_obj {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] (X : D) :
              (sectR Z D).obj X = (Z, X)

              Alias of CategoryTheory.Prod.sectR_obj.

              @[deprecated CategoryTheory.Prod.sectL_map (since := "2024-11-12")]
              theorem CategoryTheory.Prod.sectl_map (C : Type u₁) [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (Z : D) {X✝ Y✝ : C} (f : X✝ Y✝) :
              (sectL C Z).map f = (f, CategoryStruct.id Z)

              Alias of CategoryTheory.Prod.sectL_map.

              @[deprecated CategoryTheory.Prod.sectR_map (since := "2024-11-12")]
              theorem CategoryTheory.Prod.sectr_map {C : Type u₁} [Category.{v₁, u₁} C] (Z : C) (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ : D} (f : X✝ Y✝) :
              (sectR Z D).map f = (CategoryStruct.id Z, f)

              Alias of CategoryTheory.Prod.sectR_map.

              fst is the functor (X, Y) ↦ X.

              Equations
              Instances For
                @[simp]
                theorem CategoryTheory.Prod.fst_map (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ : C × D} (f : X✝ Y✝) :
                (fst C D).map f = f.1
                @[simp]
                theorem CategoryTheory.Prod.fst_obj (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X : C × D) :
                (fst C D).obj X = X.1

                snd is the functor (X, Y) ↦ Y.

                Equations
                Instances For
                  @[simp]
                  theorem CategoryTheory.Prod.snd_obj (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X : C × D) :
                  (snd C D).obj X = X.2
                  @[simp]
                  theorem CategoryTheory.Prod.snd_map (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ : C × D} (f : X✝ Y✝) :
                  (snd C D).map f = f.2

                  The functor swapping the factors of a cartesian product of categories, C × D ⥤ D × C.

                  Equations
                  Instances For
                    @[simp]
                    theorem CategoryTheory.Prod.swap_map (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {X✝ Y✝ : C × D} (f : X✝ Y✝) :
                    (swap C D).map f = (f.2, f.1)
                    @[simp]
                    theorem CategoryTheory.Prod.swap_obj (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X : C × D) :
                    (swap C D).obj X = (X.2, X.1)

                    Swapping the factors of a cartesian product of categories twice is naturally isomorphic to the identity functor.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      @[simp]
                      @[simp]

                      The equivalence, given by swapping factors, between C × D and D × C.

                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        @[simp]
                        @[simp]
                        theorem CategoryTheory.Prod.braiding_counitIso (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] :
                        (braiding C D).counitIso = Iso.refl ((swap D C).comp (swap C D))
                        @[simp]
                        instance CategoryTheory.Prod.swapIsEquivalence (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] :
                        (swap C D).IsEquivalence

                        The "evaluation at X" functor, such that (evaluation.obj X).obj F = F.obj X, which is functorial in both X and F.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          @[simp]
                          theorem CategoryTheory.evaluation_map_app (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {x✝ x✝¹ : C} (f : x✝ x✝¹) (F : Functor C D) :
                          ((evaluation C D).map f).app F = F.map f
                          @[simp]
                          theorem CategoryTheory.evaluation_obj_obj (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X : C) (F : Functor C D) :
                          ((evaluation C D).obj X).obj F = F.obj X
                          @[simp]
                          theorem CategoryTheory.evaluation_obj_map (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (X : C) {X✝ Y✝ : Functor C D} (α : X✝ Y✝) :
                          ((evaluation C D).obj X).map α = α.app X

                          The "evaluation of F at X" functor, as a functor C × (C ⥤ D) ⥤ D.

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            @[simp]
                            theorem CategoryTheory.evaluationUncurried_map (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] {x y : C × Functor C D} (f : x y) :
                            (evaluationUncurried C D).map f = CategoryStruct.comp (x.2.map f.1) (f.2.app y.1)
                            @[simp]
                            theorem CategoryTheory.evaluationUncurried_obj (C : Type u₁) [Category.{v₁, u₁} C] (D : Type u₂) [Category.{v₂, u₂} D] (p : C × Functor C D) :
                            (evaluationUncurried C D).obj p = p.2.obj p.1

                            The constant functor followed by the evaluation functor is just the identity.

                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For
                              def CategoryTheory.Functor.prod {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (F : Functor A B) (G : Functor C D) :
                              Functor (A × C) (B × D)

                              The cartesian product of two functors.

                              Equations
                              • F.prod G = { obj := fun (X : A × C) => (F.obj X.1, G.obj X.2), map := fun {X Y : A × C} (f : X Y) => (F.map f.1, G.map f.2), map_id := , map_comp := }
                              Instances For
                                @[simp]
                                theorem CategoryTheory.Functor.prod_map {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (F : Functor A B) (G : Functor C D) {X✝ Y✝ : A × C} (f : X✝ Y✝) :
                                (F.prod G).map f = (F.map f.1, G.map f.2)
                                @[simp]
                                theorem CategoryTheory.Functor.prod_obj {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (F : Functor A B) (G : Functor C D) (X : A × C) :
                                (F.prod G).obj X = (F.obj X.1, G.obj X.2)
                                def CategoryTheory.Functor.prod' {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) :
                                Functor A (B × C)

                                Similar to prod, but both functors start from the same category A

                                Equations
                                • F.prod' G = { obj := fun (a : A) => (F.obj a, G.obj a), map := fun {X Y : A} (f : X Y) => (F.map f, G.map f), map_id := , map_comp := }
                                Instances For
                                  @[simp]
                                  theorem CategoryTheory.Functor.prod'_obj {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) (a : A) :
                                  (F.prod' G).obj a = (F.obj a, G.obj a)
                                  @[simp]
                                  theorem CategoryTheory.Functor.prod'_map {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) {X✝ Y✝ : A} (f : X✝ Y✝) :
                                  (F.prod' G).map f = (F.map f, G.map f)
                                  def CategoryTheory.Functor.prod'CompFst {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) :
                                  (F.prod' G).comp (Prod.fst B C) F

                                  The product F.prod' G followed by projection on the first component is isomorphic to F

                                  Equations
                                  Instances For
                                    @[simp]
                                    theorem CategoryTheory.Functor.prod'CompFst_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) (X : A) :
                                    (F.prod'CompFst G).hom.app X = CategoryStruct.id (F.obj X)
                                    @[simp]
                                    theorem CategoryTheory.Functor.prod'CompFst_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) (X : A) :
                                    (F.prod'CompFst G).inv.app X = CategoryStruct.id (F.obj X)
                                    def CategoryTheory.Functor.prod'CompSnd {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) :
                                    (F.prod' G).comp (Prod.snd B C) G

                                    The product F.prod' G followed by projection on the second component is isomorphic to G

                                    Equations
                                    Instances For
                                      @[simp]
                                      theorem CategoryTheory.Functor.prod'CompSnd_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) (X : A) :
                                      (F.prod'CompSnd G).hom.app X = CategoryStruct.id (G.obj X)
                                      @[simp]
                                      theorem CategoryTheory.Functor.prod'CompSnd_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (G : Functor A C) (X : A) :
                                      (F.prod'CompSnd G).inv.app X = CategoryStruct.id (G.obj X)
                                      @[simp]
                                      theorem CategoryTheory.Functor.diag_obj (C : Type u₃) [Category.{v₃, u₃} C] (X : C) :
                                      (diag C).obj X = (X, X)
                                      @[simp]
                                      theorem CategoryTheory.Functor.diag_map (C : Type u₃) [Category.{v₃, u₃} C] {X Y : C} (f : X Y) :
                                      (diag C).map f = (f, f)
                                      def CategoryTheory.NatTrans.prod {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F G : Functor A B} {H I : Functor C D} (α : F G) (β : H I) :
                                      F.prod H G.prod I

                                      The cartesian product of two natural transformations.

                                      Equations
                                      Instances For
                                        @[simp]
                                        theorem CategoryTheory.NatTrans.prod_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F G : Functor A B} {H I : Functor C D} (α : F G) (β : H I) (X : A × C) :
                                        (prod α β).app X = (α.app X.1, β.app X.2)
                                        def CategoryTheory.NatTrans.prod' {A : Type u₁} [Category.{v₁, u₁} A] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F G : Functor A C} {H K : Functor A D} (α : F G) (β : H K) :
                                        F.prod' H G.prod' K

                                        The cartesian product of two natural transformations.

                                        Equations
                                        Instances For
                                          @[simp]
                                          theorem CategoryTheory.NatTrans.prod'_app_fst {A : Type u₁} [Category.{v₁, u₁} A] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F G : Functor A C} {H K : Functor A D} (α : F G) (β : H K) (X : A) :
                                          ((prod' α β).app X).1 = α.app X
                                          @[simp]
                                          theorem CategoryTheory.NatTrans.prod'_app_snd {A : Type u₁} [Category.{v₁, u₁} A] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F G : Functor A C} {H K : Functor A D} (α : F G) (β : H K) (X : A) :
                                          ((prod' α β).app X).2 = β.app X

                                          The cartesian product functor between functor categories

                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For
                                            @[simp]
                                            theorem CategoryTheory.prodFunctor_obj {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (FG : Functor A B × Functor C D) :
                                            prodFunctor.obj FG = FG.1.prod FG.2
                                            @[simp]
                                            theorem CategoryTheory.prodFunctor_map {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {X✝ Y✝ : Functor A B × Functor C D} (nm : X✝ Y✝) :
                                            prodFunctor.map nm = NatTrans.prod nm.1 nm.2
                                            def CategoryTheory.NatIso.prod {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F F' : Functor A B} {G G' : Functor C D} (e₁ : F F') (e₂ : G G') :
                                            F.prod G F'.prod G'

                                            The cartesian product of two natural isomorphisms.

                                            Equations
                                            Instances For
                                              @[simp]
                                              theorem CategoryTheory.NatIso.prod_hom {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F F' : Functor A B} {G G' : Functor C D} (e₁ : F F') (e₂ : G G') :
                                              (prod e₁ e₂).hom = NatTrans.prod e₁.hom e₂.hom
                                              @[simp]
                                              theorem CategoryTheory.NatIso.prod_inv {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {F F' : Functor A B} {G G' : Functor C D} (e₁ : F F') (e₂ : G G') :
                                              (prod e₁ e₂).inv = NatTrans.prod e₁.inv e₂.inv
                                              def CategoryTheory.Equivalence.prod {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (E₁ : A B) (E₂ : C D) :
                                              A × C B × D

                                              The cartesian product of two equivalences of categories.

                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For
                                                @[simp]
                                                theorem CategoryTheory.Equivalence.prod_functor {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (E₁ : A B) (E₂ : C D) :
                                                (E₁.prod E₂).functor = E₁.functor.prod E₂.functor
                                                @[simp]
                                                theorem CategoryTheory.Equivalence.prod_inverse {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (E₁ : A B) (E₂ : C D) :
                                                (E₁.prod E₂).inverse = E₁.inverse.prod E₂.inverse
                                                @[simp]
                                                theorem CategoryTheory.Equivalence.prod_unitIso {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (E₁ : A B) (E₂ : C D) :
                                                (E₁.prod E₂).unitIso = NatIso.prod E₁.unitIso E₂.unitIso
                                                @[simp]
                                                theorem CategoryTheory.Equivalence.prod_counitIso {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (E₁ : A B) (E₂ : C D) :
                                                (E₁.prod E₂).counitIso = NatIso.prod E₁.counitIso E₂.counitIso
                                                def CategoryTheory.flipCompEvaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (a : A) :
                                                F.flip.comp ((evaluation A C).obj a) F.obj a

                                                F.flip composed with evaluation is the same as evaluating F.

                                                Equations
                                                Instances For
                                                  @[simp]
                                                  theorem CategoryTheory.flipCompEvaluation_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (a : A) (X : B) :
                                                  (flipCompEvaluation F a).hom.app X = CategoryStruct.id ((F.obj a).obj X)
                                                  @[simp]
                                                  theorem CategoryTheory.flipCompEvaluation_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (a : A) (X : B) :
                                                  (flipCompEvaluation F a).inv.app X = CategoryStruct.id ((F.obj a).obj X)
                                                  theorem CategoryTheory.flip_comp_evaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (a : A) :
                                                  F.flip.comp ((evaluation A C).obj a) = F.obj a
                                                  def CategoryTheory.compEvaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (b : B) :
                                                  F.comp ((evaluation B C).obj b) F.flip.obj b

                                                  F composed with evaluation is the same as evaluating F.flip.

                                                  Equations
                                                  Instances For
                                                    @[simp]
                                                    theorem CategoryTheory.compEvaluation_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (b : B) (X : A) :
                                                    (compEvaluation F b).hom.app X = CategoryStruct.id ((F.obj X).obj b)
                                                    @[simp]
                                                    theorem CategoryTheory.compEvaluation_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (b : B) (X : A) :
                                                    (compEvaluation F b).inv.app X = CategoryStruct.id ((F.obj X).obj b)
                                                    theorem CategoryTheory.comp_evaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A (Functor B C)) (b : B) :
                                                    F.comp ((evaluation B C).obj b) = F.flip.obj b
                                                    def CategoryTheory.whiskeringLeftCompEvaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (a : A) :
                                                    ((whiskeringLeft A B C).obj F).comp ((evaluation A C).obj a) (evaluation B C).obj (F.obj a)

                                                    Whiskering by F and then evaluating at a is the same as evaluating at F.obj a.

                                                    Equations
                                                    Instances For
                                                      @[simp]
                                                      theorem CategoryTheory.whiskeringLeftCompEvaluation_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (a : A) (X : Functor B C) :
                                                      (whiskeringLeftCompEvaluation F a).hom.app X = CategoryStruct.id (X.obj (F.obj a))
                                                      @[simp]
                                                      theorem CategoryTheory.whiskeringLeftCompEvaluation_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (a : A) (X : Functor B C) :
                                                      (whiskeringLeftCompEvaluation F a).inv.app X = CategoryStruct.id (X.obj (F.obj a))
                                                      @[simp]
                                                      theorem CategoryTheory.whiskeringLeft_comp_evaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor A B) (a : A) :
                                                      ((whiskeringLeft A B C).obj F).comp ((evaluation A C).obj a) = (evaluation B C).obj (F.obj a)

                                                      Whiskering by F and then evaluating at a is the same as evaluating at F.obj a.

                                                      def CategoryTheory.whiskeringRightCompEvaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor B C) (a : A) :
                                                      ((whiskeringRight A B C).obj F).comp ((evaluation A C).obj a) ((evaluation A B).obj a).comp F

                                                      Whiskering by F and then evaluating at a is the same as evaluating at F and then applying F.

                                                      Equations
                                                      Instances For
                                                        @[simp]
                                                        theorem CategoryTheory.whiskeringRightCompEvaluation_hom_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor B C) (a : A) (X : Functor A B) :
                                                        (whiskeringRightCompEvaluation F a).hom.app X = CategoryStruct.id (F.obj (X.obj a))
                                                        @[simp]
                                                        theorem CategoryTheory.whiskeringRightCompEvaluation_inv_app {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor B C) (a : A) (X : Functor A B) :
                                                        (whiskeringRightCompEvaluation F a).inv.app X = CategoryStruct.id (F.obj (X.obj a))
                                                        @[simp]
                                                        theorem CategoryTheory.whiskeringRight_comp_evaluation {A : Type u₁} [Category.{v₁, u₁} A] {B : Type u₂} [Category.{v₂, u₂} B] {C : Type u₃} [Category.{v₃, u₃} C] (F : Functor B C) (a : A) :
                                                        ((whiskeringRight A B C).obj F).comp ((evaluation A C).obj a) = ((evaluation A B).obj a).comp F

                                                        Whiskering by F and then evaluating at a is the same as evaluating at F and then applying F.

                                                        The forward direction for functorProdFunctorEquiv

                                                        Equations
                                                        • One or more equations did not get rendered due to their size.
                                                        Instances For
                                                          @[simp]
                                                          theorem CategoryTheory.prodFunctorToFunctorProd_map_app (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] {X✝ Y✝ : Functor A B × Functor A C} (f : X✝ Y✝) (X : A) :
                                                          ((prodFunctorToFunctorProd A B C).map f).app X = (f.1.app X, f.2.app X)
                                                          @[simp]
                                                          theorem CategoryTheory.prodFunctorToFunctorProd_obj (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (F : Functor A B × Functor A C) :
                                                          (prodFunctorToFunctorProd A B C).obj F = F.1.prod' F.2

                                                          The backward direction for functorProdFunctorEquiv

                                                          Equations
                                                          • One or more equations did not get rendered due to their size.
                                                          Instances For
                                                            @[simp]
                                                            theorem CategoryTheory.functorProdToProdFunctor_obj (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (F : Functor A (B × C)) :
                                                            (functorProdToProdFunctor A B C).obj F = (F.comp (Prod.fst B C), F.comp (Prod.snd B C))
                                                            @[simp]
                                                            theorem CategoryTheory.functorProdToProdFunctor_map (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] {X✝ Y✝ : Functor A (B × C)} (α : X✝ Y✝) :
                                                            (functorProdToProdFunctor A B C).map α = ({ app := fun (X : A) => (α.app X).1, naturality := }, { app := fun (X : A) => (α.app X).2, naturality := })

                                                            The unit isomorphism for functorProdFunctorEquiv

                                                            Equations
                                                            • One or more equations did not get rendered due to their size.
                                                            Instances For
                                                              @[simp]
                                                              theorem CategoryTheory.functorProdFunctorEquivUnitIso_inv_app (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (X : Functor A B × Functor A C) :
                                                              (functorProdFunctorEquivUnitIso A B C).inv.app X = ((X.1.prod'CompFst X.2).hom, (X.1.prod'CompSnd X.2).hom)
                                                              @[simp]
                                                              theorem CategoryTheory.functorProdFunctorEquivUnitIso_hom_app (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (X : Functor A B × Functor A C) :
                                                              (functorProdFunctorEquivUnitIso A B C).hom.app X = ((X.1.prod'CompFst X.2).inv, (X.1.prod'CompSnd X.2).inv)

                                                              The counit isomorphism for functorProdFunctorEquiv

                                                              Equations
                                                              • One or more equations did not get rendered due to their size.
                                                              Instances For
                                                                @[simp]
                                                                theorem CategoryTheory.functorProdFunctorEquivCounitIso_hom_app_app (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (X : Functor A (B × C)) (X✝ : A) :
                                                                ((functorProdFunctorEquivCounitIso A B C).hom.app X).app X✝ = (CategoryStruct.id (X.obj X✝).1, CategoryStruct.id (X.obj X✝).2)
                                                                @[simp]
                                                                theorem CategoryTheory.functorProdFunctorEquivCounitIso_inv_app_app (A : Type u₁) [Category.{v₁, u₁} A] (B : Type u₂) [Category.{v₂, u₂} B] (C : Type u₃) [Category.{v₃, u₃} C] (X : Functor A (B × C)) (X✝ : A) :
                                                                ((functorProdFunctorEquivCounitIso A B C).inv.app X).app X✝ = (CategoryStruct.id (X.obj X✝).1, CategoryStruct.id (X.obj X✝).2)

                                                                The equivalence of categories between (A ⥤ B) × (A ⥤ C) and A ⥤ (B × C)

                                                                Equations
                                                                • One or more equations did not get rendered due to their size.
                                                                Instances For

                                                                  The equivalence between the opposite of a product and the product of the opposites.

                                                                  Equations
                                                                  • One or more equations did not get rendered due to their size.
                                                                  Instances For
                                                                    @[simp]
                                                                    theorem CategoryTheory.prodOpEquiv_inverse_obj (C : Type u₃) [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] (x✝ : Cᵒᵖ × Dᵒᵖ) :
                                                                    (prodOpEquiv C).inverse.obj x✝ = match x✝ with | (X, Y) => Opposite.op (Opposite.unop X, Opposite.unop Y)
                                                                    @[simp]
                                                                    theorem CategoryTheory.prodOpEquiv_inverse_map (C : Type u₃) [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {X✝ Y✝ : Cᵒᵖ × Dᵒᵖ} (x✝ : X✝ Y✝) :
                                                                    (prodOpEquiv C).inverse.map x✝ = match x✝ with | (f, g) => Opposite.op (f.unop, g.unop)
                                                                    @[simp]
                                                                    theorem CategoryTheory.prodOpEquiv_counitIso (C : Type u₃) [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] :
                                                                    (prodOpEquiv C).counitIso = Iso.refl ({ obj := fun (x : Cᵒᵖ × Dᵒᵖ) => match x with | (X, Y) => Opposite.op (Opposite.unop X, Opposite.unop Y), map := fun {X Y : Cᵒᵖ × Dᵒᵖ} (x : X Y) => match x with | (f, g) => Opposite.op (f.unop, g.unop), map_id := , map_comp := }.comp { obj := fun (X : (C × D)ᵒᵖ) => (Opposite.op (Opposite.unop X).1, Opposite.op (Opposite.unop X).2), map := fun {X Y : (C × D)ᵒᵖ} (f : X Y) => (f.unop.1.op, f.unop.2.op), map_id := , map_comp := })
                                                                    @[simp]
                                                                    theorem CategoryTheory.prodOpEquiv_functor_map (C : Type u₃) [Category.{v₃, u₃} C] {D : Type u₄} [Category.{v₄, u₄} D] {X✝ Y✝ : (C × D)ᵒᵖ} (f : X✝ Y✝) :
                                                                    (prodOpEquiv C).functor.map f = (f.unop.1.op, f.unop.2.op)