File: Mathlib/CategoryTheory/ChosenFiniteProducts.lean

full_name: CategoryTheory.ChosenFiniteProducts.terminal
code: /--
An instance of `ChosenFiniteProducts C` bundles an explicit choice of a binary
product of two objects of `C`, and a terminal object in `C`.

Users should use the monoidal notation: `X ⊗ Y` for the product and `𝟙_ C` for
the terminal object.
-/
class ChosenFiniteProducts (C : Type u) [Category.{v} C] where
  /-- A choice of a limit binary fan for any two objects of the category. -/
  product : (X Y : C) → Limits.LimitCone (Limits.pair X Y)
  /-- A choice of a terminal object. -/
  terminal : Limits.LimitCone (Functor.empty.{0} C)
goal: CategoryTheory.Limits.LimitCone (CategoryTheory.Functor.empty C)

full_name: CategoryTheory.ChosenFiniteProducts.product
code: /--
An instance of `ChosenFiniteProducts C` bundles an explicit choice of a binary
product of two objects of `C`, and a terminal object in `C`.

Users should use the monoidal notation: `X ⊗ Y` for the product and `𝟙_ C` for
the terminal object.
-/
class ChosenFiniteProducts (C : Type u) [Category.{v} C] where
  /-- A choice of a limit binary fan for any two objects of the category. -/
  product : (X Y : C) → Limits.LimitCone (Limits.pair X Y)
  /-- A choice of a terminal object. -/
  terminal : Limits.LimitCone (Functor.empty.{0} C)
goal: CategoryTheory.Limits.LimitCone (CategoryTheory.Limits.pair X Y)

full_name: CategoryTheory.ChosenFiniteProducts
code: /--
An instance of `ChosenFiniteProducts C` bundles an explicit choice of a binary
product of two objects of `C`, and a terminal object in `C`.

Users should use the monoidal notation: `X ⊗ Y` for the product and `𝟙_ C` for
the terminal object.
-/
class ChosenFiniteProducts (C : Type u) [Category.{v} C] where
  /-- A choice of a limit binary fan for any two objects of the category. -/
  product : (X Y : C) → Limits.LimitCone (Limits.pair X Y)
  /-- A choice of a terminal object. -/
  terminal : Limits.LimitCone (Functor.empty.{0} C)
goal: Type (max u v)

full_name: CategoryTheory.ChosenFiniteProducts.instMonoidalCategory
code: instance (priority := 100) (C : Type u) [Category.{v} C] [ChosenFiniteProducts C] :
    MonoidalCategory C 
goal: CategoryTheory.MonoidalCategory C

full_name: CategoryTheory.ChosenFiniteProducts.instSymmetricCategory
code: instance (priority := 100) (C : Type u) [Category.{v} C] [ChosenFiniteProducts C] :
    SymmetricCategory C 
goal: CategoryTheory.SymmetricCategory C

full_name: CategoryTheory.ChosenFiniteProducts.toUnit
code: /--
The unique map to the terminal object.
-/
def toUnit (X : C) : X ⟶ 𝟙_ C 
goal: X ⟶ 𝟙_ C

full_name: CategoryTheory.ChosenFiniteProducts.instUniqueHomTensorUnit
code: instance (X : C) : Unique (X ⟶ 𝟙_ C) 
goal: Unique (X ⟶ 𝟙_ C)

full_name: CategoryTheory.ChosenFiniteProducts.toUnit_unique
code: /--
This lemma follows from the preexisting `Unique` instance, but
it is often convenient to use it directly as `apply toUnit_unique` forcing
lean to do the necessary elaboration.
-/
lemma toUnit_unique {X : C} (f g : X ⟶ 𝟙_ _) : f = g 
goal: f = g

full_name: CategoryTheory.ChosenFiniteProducts.lift
code: /--
Construct a morphism to the product given its two components.
-/
def lift {T X Y : C} (f : T ⟶ X) (g : T ⟶ Y) : T ⟶ X ⊗ Y 
goal: T ⟶ CategoryTheory.MonoidalCategory.tensorObj X Y

full_name: CategoryTheory.ChosenFiniteProducts.fst
code: /--
The first projection from the product.
-/
def fst (X Y : C) : X ⊗ Y ⟶ X 
goal: CategoryTheory.MonoidalCategory.tensorObj X Y ⟶ X

full_name: CategoryTheory.ChosenFiniteProducts.snd
code: /--
The second projection from the product.
-/
def snd (X Y : C) : X ⊗ Y ⟶ Y 
goal: CategoryTheory.MonoidalCategory.tensorObj X Y ⟶ Y

full_name: CategoryTheory.ChosenFiniteProducts.lift_fst
code: @[reassoc (attr := simp)]
lemma lift_fst {T X Y : C} (f : T ⟶ X) (g : T ⟶ Y) : lift f g ≫ fst _ _ = f 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.lift f g)
    (CategoryTheory.ChosenFiniteProducts.fst X Y) =
  f

full_name: CategoryTheory.ChosenFiniteProducts.lift_snd
code: @[reassoc (attr := simp)]
lemma lift_snd {T X Y : C} (f : T ⟶ X) (g : T ⟶ Y) : lift f g ≫ snd _ _ = g 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.lift f g)
    (CategoryTheory.ChosenFiniteProducts.snd X Y) =
  g

full_name: CategoryTheory.ChosenFiniteProducts.hom_ext
code: @[ext 1050]
lemma hom_ext {T X Y : C} (f g : T ⟶ X ⊗ Y)
    (h_fst : f ≫ fst _ _ = g ≫ fst _ _)
    (h_snd : f ≫ snd _ _ = g ≫ snd _ _) :
    f = g 
goal: f = g

full_name: CategoryTheory.ChosenFiniteProducts.tensorHom_fst
code: @[reassoc (attr := simp)]
lemma tensorHom_fst {X₁ X₂ Y₁ Y₂ : C} (f : X₁ ⟶ X₂) (g : Y₁ ⟶ Y₂) :
    (f ⊗ g) ≫ fst _ _ = fst _ _ ≫ f 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.tensorHom f g)
    (CategoryTheory.ChosenFiniteProducts.fst X₂ Y₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.fst X₁ Y₁) f

full_name: CategoryTheory.ChosenFiniteProducts.tensorHom_snd
code: @[reassoc (attr := simp)]
lemma tensorHom_snd {X₁ X₂ Y₁ Y₂ : C} (f : X₁ ⟶ X₂) (g : Y₁ ⟶ Y₂) :
    (f ⊗ g) ≫ snd _ _ = snd _ _ ≫ g 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.tensorHom f g)
    (CategoryTheory.ChosenFiniteProducts.snd X₂ Y₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.snd X₁ Y₁) g

full_name: CategoryTheory.ChosenFiniteProducts.whiskerLeft_fst
code: @[reassoc (attr := simp)]
lemma whiskerLeft_fst (X : C) {Y₁ Y₂ : C} (g : Y₁ ⟶ Y₂) :
    (X ◁ g) ≫ fst _ _ = fst _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerLeft X g)
    (CategoryTheory.ChosenFiniteProducts.fst X Y₂) =
  CategoryTheory.ChosenFiniteProducts.fst X Y₁

full_name: CategoryTheory.ChosenFiniteProducts.whiskerLeft_snd
code: @[reassoc (attr := simp)]
lemma whiskerLeft_snd (X : C) {Y₁ Y₂ : C} (g : Y₁ ⟶ Y₂) :
    (X ◁ g) ≫ snd _ _ = snd _ _ ≫ g 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerLeft X g)
    (CategoryTheory.ChosenFiniteProducts.snd X Y₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.snd X Y₁) g

full_name: CategoryTheory.ChosenFiniteProducts.whiskerRight_fst
code: @[reassoc (attr := simp)]
lemma whiskerRight_fst {X₁ X₂ : C} (f : X₁ ⟶ X₂) (Y : C) :
    (f ▷ Y) ≫ fst _ _ = fst _ _ ≫ f 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerRight f Y)
    (CategoryTheory.ChosenFiniteProducts.fst X₂ Y) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ChosenFiniteProducts.fst X₁ Y) f

full_name: CategoryTheory.ChosenFiniteProducts.whiskerRight_snd
code: @[reassoc (attr := simp)]
lemma whiskerRight_snd {X₁ X₂ : C} (f : X₁ ⟶ X₂) (Y : C) :
    (f ▷ Y) ≫ snd _ _ = snd _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerRight f Y)
    (CategoryTheory.ChosenFiniteProducts.snd X₂ Y) =
  CategoryTheory.ChosenFiniteProducts.snd X₁ Y

full_name: CategoryTheory.ChosenFiniteProducts.associator_hom_fst
code: @[reassoc (attr := simp)]
lemma associator_hom_fst (X Y Z : C) :
    (α_ X Y Z).hom ≫ fst _ _ = fst _ _ ≫ fst _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).hom
    (CategoryTheory.ChosenFiniteProducts.fst X (CategoryTheory.MonoidalCategory.tensorObj Y Z)) =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ChosenFiniteProducts.fst (CategoryTheory.MonoidalCategory.tensorObj X Y) Z)
    (CategoryTheory.ChosenFiniteProducts.fst X Y)

full_name: CategoryTheory.ChosenFiniteProducts.associator_hom_snd_fst
code: @[reassoc (attr := simp)]
lemma associator_hom_snd_fst (X Y Z : C) :
    (α_ X Y Z).hom ≫ snd _ _ ≫ fst _ _ = fst _ _ ≫ snd _ _  
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).hom
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ChosenFiniteProducts.snd X (CategoryTheory.MonoidalCategory.tensorObj Y Z))
      (CategoryTheory.ChosenFiniteProducts.fst Y Z)) =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ChosenFiniteProducts.fst (CategoryTheory.MonoidalCategory.tensorObj X Y) Z)
    (CategoryTheory.ChosenFiniteProducts.snd X Y)

full_name: CategoryTheory.ChosenFiniteProducts.associator_hom_snd_snd
code: @[reassoc (attr := simp)]
lemma associator_hom_snd_snd (X Y Z : C) :
    (α_ X Y Z).hom ≫ snd _ _ ≫ snd _ _ = snd _ _  
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).hom
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ChosenFiniteProducts.snd X (CategoryTheory.MonoidalCategory.tensorObj Y Z))
      (CategoryTheory.ChosenFiniteProducts.snd Y Z)) =
  CategoryTheory.ChosenFiniteProducts.snd (CategoryTheory.MonoidalCategory.tensorObj X Y) Z

full_name: CategoryTheory.ChosenFiniteProducts.associator_inv_fst
code: @[reassoc (attr := simp)]
lemma associator_inv_fst (X Y Z : C) :
    (α_ X Y Z).inv ≫ fst _ _ ≫ fst _ _ = fst _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).inv
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ChosenFiniteProducts.fst (CategoryTheory.MonoidalCategory.tensorObj X Y) Z)
      (CategoryTheory.ChosenFiniteProducts.fst X Y)) =
  CategoryTheory.ChosenFiniteProducts.fst X (CategoryTheory.MonoidalCategory.tensorObj Y Z)

full_name: CategoryTheory.ChosenFiniteProducts.associator_inv_fst_snd
code: @[reassoc (attr := simp)]
lemma associator_inv_fst_snd (X Y Z : C) :
    (α_ X Y Z).inv ≫ fst _ _ ≫ snd _ _ = snd _ _ ≫ fst _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).inv
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ChosenFiniteProducts.fst (CategoryTheory.MonoidalCategory.tensorObj X Y) Z)
      (CategoryTheory.ChosenFiniteProducts.snd X Y)) =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ChosenFiniteProducts.snd X (CategoryTheory.MonoidalCategory.tensorObj Y Z))
    (CategoryTheory.ChosenFiniteProducts.fst Y Z)

full_name: CategoryTheory.ChosenFiniteProducts.associator_inv_snd
code: @[reassoc (attr := simp)]
lemma associator_inv_snd (X Y Z : C) :
    (α_ X Y Z).inv ≫ snd _ _ = snd _ _ ≫ snd _ _ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.associator X Y Z).inv
    (CategoryTheory.ChosenFiniteProducts.snd (CategoryTheory.MonoidalCategory.tensorObj X Y) Z) =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ChosenFiniteProducts.snd X (CategoryTheory.MonoidalCategory.tensorObj Y Z))
    (CategoryTheory.ChosenFiniteProducts.snd Y Z)

full_name: CategoryTheory.ChosenFiniteProducts.ofFiniteProducts
code: /--
Construct an instance of `ChosenFiniteProducts C` given an instance of `HasFiniteProducts C`.
-/
noncomputable
def ofFiniteProducts
    (C : Type u) [Category.{v} C] [Limits.HasFiniteProducts C] :
    ChosenFiniteProducts C 
goal: CategoryTheory.ChosenFiniteProducts C

full_name: CategoryTheory.ChosenFiniteProducts.instHasFiniteProducts
code: instance (priority := 100) : Limits.HasFiniteProducts C 
goal: CategoryTheory.Limits.HasFiniteProducts C