category_theory.products.basic
⟷
Mathlib.CategoryTheory.Products.Basic
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -204,8 +204,8 @@ def braiding : C × D ≌ D × C :=
-/
#print CategoryTheory.Prod.swapIsEquivalence /-
-instance swapIsEquivalence : IsEquivalence (swap C D) :=
- (by infer_instance : IsEquivalence (braiding C D).Functor)
+instance swapIsEquivalence : CategoryTheory.Functor.IsEquivalence (swap C D) :=
+ (by infer_instance : CategoryTheory.Functor.IsEquivalence (braiding C D).Functor)
#align category_theory.prod.swap_is_equivalence CategoryTheory.Prod.swapIsEquivalence
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -75,12 +75,12 @@ theorem isIso_prod_iff {P Q : C} {S T : D} {f : (P, S) ⟶ (Q, T)} :
IsIso f ↔ IsIso f.1 ∧ IsIso f.2 := by
constructor
· rintro ⟨g, hfg, hgf⟩
- simp at hfg hgf
+ simp at hfg hgf
rcases hfg with ⟨hfg₁, hfg₂⟩
rcases hgf with ⟨hgf₁, hgf₂⟩
exact ⟨⟨⟨g.1, hfg₁, hgf₁⟩⟩, ⟨⟨g.2, hfg₂, hgf₂⟩⟩⟩
· rintro ⟨⟨g₁, hfg₁, hgf₁⟩, ⟨g₂, hfg₂, hgf₂⟩⟩
- dsimp at hfg₁ hgf₁ hfg₂ hgf₂
+ dsimp at hfg₁ hgf₁ hfg₂ hgf₂
refine' ⟨⟨(g₁, g₂), _, _⟩⟩ <;> · simp <;> constructor <;> assumption
#align category_theory.is_iso_prod_iff CategoryTheory.isIso_prod_iff
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2017 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Stephen Morgan, Scott Morrison
-/
-import Mathbin.CategoryTheory.EqToHom
-import Mathbin.CategoryTheory.Functor.Const
-import Mathbin.Data.Prod.Basic
+import CategoryTheory.EqToHom
+import CategoryTheory.Functor.Const
+import Data.Prod.Basic
#align_import category_theory.products.basic from "leanprover-community/mathlib"@"1ead22342e1a078bd44744ace999f85756555d35"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2017 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Stephen Morgan, Scott Morrison
-
-! This file was ported from Lean 3 source module category_theory.products.basic
-! leanprover-community/mathlib commit 1ead22342e1a078bd44744ace999f85756555d35
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.CategoryTheory.EqToHom
import Mathbin.CategoryTheory.Functor.Const
import Mathbin.Data.Prod.Basic
+#align_import category_theory.products.basic from "leanprover-community/mathlib"@"1ead22342e1a078bd44744ace999f85756555d35"
+
/-!
# Cartesian products of categories
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -196,6 +196,7 @@ def symmetry : swap C D ⋙ swap D C ≅ 𝟭 (C × D)
#align category_theory.prod.symmetry CategoryTheory.Prod.symmetry
-/
+#print CategoryTheory.Prod.braiding /-
/-- The equivalence, given by swapping factors, between `C × D` and `D × C`.
-/
@[simps]
@@ -203,6 +204,7 @@ def braiding : C × D ≌ D × C :=
Equivalence.mk (swap C D) (swap D C) (NatIso.ofComponents (fun X => eqToIso (by simp)) (by tidy))
(NatIso.ofComponents (fun X => eqToIso (by simp)) (by tidy))
#align category_theory.prod.braiding CategoryTheory.Prod.braiding
+-/
#print CategoryTheory.Prod.swapIsEquivalence /-
instance swapIsEquivalence : IsEquivalence (swap C D) :=
@@ -252,11 +254,13 @@ def evaluationUncurried : C × (C ⥤ D) ⥤ D
variable {C}
+#print CategoryTheory.Functor.constCompEvaluationObj /-
/-- The constant functor followed by the evalutation functor is just the identity. -/
@[simps]
def Functor.constCompEvaluationObj (X : C) : Functor.const C ⋙ (evaluation C D).obj X ≅ 𝟭 D :=
NatIso.ofComponents (fun Y => Iso.refl _) fun Y Z f => by simp
#align category_theory.functor.const_comp_evaluation_obj CategoryTheory.Functor.constCompEvaluationObj
+-/
end
@@ -314,15 +318,19 @@ def diag : C ⥤ C × C :=
#align category_theory.functor.diag CategoryTheory.Functor.diag
-/
+#print CategoryTheory.Functor.diag_obj /-
@[simp]
theorem diag_obj (X : C) : (diag C).obj X = (X, X) :=
rfl
#align category_theory.functor.diag_obj CategoryTheory.Functor.diag_obj
+-/
+#print CategoryTheory.Functor.diag_map /-
@[simp]
theorem diag_map {X Y : C} (f : X ⟶ Y) : (diag C).map f = (f, f) :=
rfl
#align category_theory.functor.diag_map CategoryTheory.Functor.diag_map
+-/
end
@@ -347,11 +355,13 @@ def prod {F G : A ⥤ B} {H I : C ⥤ D} (α : F ⟶ G) (β : H ⟶ I) : F.Prod
use instead `α.prod β` or `nat_trans.prod α β`. -/
end NatTrans
+#print CategoryTheory.flipCompEvaluation /-
/-- `F.flip` composed with evaluation is the same as evaluating `F`. -/
@[simps]
def flipCompEvaluation (F : A ⥤ B ⥤ C) (a) : F.flip ⋙ (evaluation _ _).obj a ≅ F.obj a :=
(NatIso.ofComponents fun b => eqToIso rfl) <| by tidy
#align category_theory.flip_comp_evaluation CategoryTheory.flipCompEvaluation
+-/
variable (A B C)
@@ -403,6 +413,7 @@ def functorProdFunctorEquivCounitIso :
#align category_theory.functor_prod_functor_equiv_counit_iso CategoryTheory.functorProdFunctorEquivCounitIso
-/
+#print CategoryTheory.functorProdFunctorEquiv /-
/-- The equivalence of categories between `(A ⥤ B) × (A ⥤ C)` and `A ⥤ (B × C)` -/
@[simps]
def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C
@@ -412,6 +423,7 @@ def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C
unitIso := functorProdFunctorEquivUnitIso A B C
counitIso := functorProdFunctorEquivCounitIso A B C
#align category_theory.functor_prod_functor_equiv CategoryTheory.functorProdFunctorEquiv
+-/
end CategoryTheory
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -78,12 +78,12 @@ theorem isIso_prod_iff {P Q : C} {S T : D} {f : (P, S) ⟶ (Q, T)} :
IsIso f ↔ IsIso f.1 ∧ IsIso f.2 := by
constructor
· rintro ⟨g, hfg, hgf⟩
- simp at hfg hgf
+ simp at hfg hgf
rcases hfg with ⟨hfg₁, hfg₂⟩
rcases hgf with ⟨hgf₁, hgf₂⟩
exact ⟨⟨⟨g.1, hfg₁, hgf₁⟩⟩, ⟨⟨g.2, hfg₂, hgf₂⟩⟩⟩
· rintro ⟨⟨g₁, hfg₁, hgf₁⟩, ⟨g₂, hfg₂, hgf₂⟩⟩
- dsimp at hfg₁ hgf₁ hfg₂ hgf₂
+ dsimp at hfg₁ hgf₁ hfg₂ hgf₂
refine' ⟨⟨(g₁, g₂), _, _⟩⟩ <;> · simp <;> constructor <;> assumption
#align category_theory.is_iso_prod_iff CategoryTheory.isIso_prod_iff
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -196,12 +196,6 @@ def symmetry : swap C D ⋙ swap D C ≅ 𝟭 (C × D)
#align category_theory.prod.symmetry CategoryTheory.Prod.symmetry
-/
-/- warning: category_theory.prod.braiding -> CategoryTheory.Prod.braiding is a dubious translation:
-lean 3 declaration is
- forall (C : Type.{u3}) [_inst_1 : CategoryTheory.Category.{u1, u3} C] (D : Type.{u4}) [_inst_2 : CategoryTheory.Category.{u2, u4} D], CategoryTheory.Equivalence.{max u1 u2, max u2 u1, max u3 u4, max u4 u3} (Prod.{u3, u4} C D) (CategoryTheory.prod.{u1, u2, u3, u4} C _inst_1 D _inst_2) (Prod.{u4, u3} D C) (CategoryTheory.prod.{u2, u1, u4, u3} D _inst_2 C _inst_1)
-but is expected to have type
- forall (C : Type.{u3}) [_inst_1 : CategoryTheory.Category.{u1, u3} C] (D : Type.{u4}) [_inst_2 : CategoryTheory.Category.{u2, u4} D], CategoryTheory.Equivalence.{max u1 u2, max u1 u2, max u4 u3, max u3 u4} (Prod.{u3, u4} C D) (Prod.{u4, u3} D C) (CategoryTheory.prod.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.prod.{u2, u1, u4, u3} D _inst_2 C _inst_1)
-Case conversion may be inaccurate. Consider using '#align category_theory.prod.braiding CategoryTheory.Prod.braidingₓ'. -/
/-- The equivalence, given by swapping factors, between `C × D` and `D × C`.
-/
@[simps]
@@ -258,12 +252,6 @@ def evaluationUncurried : C × (C ⥤ D) ⥤ D
variable {C}
-/- warning: category_theory.functor.const_comp_evaluation_obj -> CategoryTheory.Functor.constCompEvaluationObj is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] (D : Type.{u4}) [_inst_2 : CategoryTheory.Category.{u2, u4} D] (X : C), CategoryTheory.Iso.{max u4 u2, max u2 u4} (CategoryTheory.Functor.{u2, u2, u4, u4} D _inst_2 D _inst_2) (CategoryTheory.Functor.category.{u2, u2, u4, u4} D _inst_2 D _inst_2) (CategoryTheory.Functor.comp.{u2, max u3 u2, u2, u4, max u1 u2 u3 u4, u4} D _inst_2 (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2 (CategoryTheory.Functor.const.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.obj.{u1, max (max u1 u2 u3 u4) u2, u3, max (max u3 u2) u2 (max u1 u2 u3 u4) u4} C _inst_1 (CategoryTheory.Functor.{max u3 u2, u2, max u1 u2 u3 u4, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.Functor.category.{max u3 u2, u2, max u1 u2 u3 u4, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.evaluation.{u1, u2, u3, u4} C _inst_1 D _inst_2) X)) (CategoryTheory.Functor.id.{u2, u4} D _inst_2)
-but is expected to have type
- forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] (D : Type.{u4}) [_inst_2 : CategoryTheory.Category.{u2, u4} D] (X : C), CategoryTheory.Iso.{max u4 u2, max u4 u2} (CategoryTheory.Functor.{u2, u2, u4, u4} D _inst_2 D _inst_2) (CategoryTheory.Functor.category.{u2, u2, u4, u4} D _inst_2 D _inst_2) (CategoryTheory.Functor.comp.{u2, max u3 u2, u2, u4, max (max (max u3 u1) u4) u2, u4} D _inst_2 (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2 (CategoryTheory.Functor.const.{u1, u2, u3, u4} C _inst_1 D _inst_2) (Prefunctor.obj.{succ u1, max (max (max (succ u3) (succ u4)) (succ u1)) (succ u2), u3, max (max (max u3 u4) u1) u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} C (CategoryTheory.Category.toCategoryStruct.{u1, u3} C _inst_1)) (CategoryTheory.Functor.{max u3 u2, u2, max (max (max u4 u3) u2) u1, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.CategoryStruct.toQuiver.{max (max (max u3 u4) u1) u2, max (max (max u3 u4) u1) u2} (CategoryTheory.Functor.{max u3 u2, u2, max (max (max u4 u3) u2) u1, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.Category.toCategoryStruct.{max (max (max u3 u4) u1) u2, max (max (max u3 u4) u1) u2} (CategoryTheory.Functor.{max u3 u2, u2, max (max (max u4 u3) u2) u1, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.Functor.category.{max u3 u2, u2, max (max (max u3 u4) u1) u2, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2))) (CategoryTheory.Functor.toPrefunctor.{u1, max (max (max u3 u4) u1) u2, u3, max (max (max u3 u4) u1) u2} C _inst_1 (CategoryTheory.Functor.{max u3 u2, u2, max (max (max u4 u3) u2) u1, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.Functor.category.{max u3 u2, u2, max (max (max u3 u4) u1) u2, u4} (CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2) (CategoryTheory.Functor.category.{u1, u2, u3, u4} C _inst_1 D _inst_2) D _inst_2) (CategoryTheory.evaluation.{u1, u2, u3, u4} C _inst_1 D _inst_2)) X)) (CategoryTheory.Functor.id.{u2, u4} D _inst_2)
-Case conversion may be inaccurate. Consider using '#align category_theory.functor.const_comp_evaluation_obj CategoryTheory.Functor.constCompEvaluationObjₓ'. -/
/-- The constant functor followed by the evalutation functor is just the identity. -/
@[simps]
def Functor.constCompEvaluationObj (X : C) : Functor.const C ⋙ (evaluation C D).obj X ≅ 𝟭 D :=
@@ -326,23 +314,11 @@ def diag : C ⥤ C × C :=
#align category_theory.functor.diag CategoryTheory.Functor.diag
-/
-/- warning: category_theory.functor.diag_obj -> CategoryTheory.Functor.diag_obj is a dubious translation:
-lean 3 declaration is
- forall (C : Type.{u2}) [_inst_3 : CategoryTheory.Category.{u1, u2} C] (X : C), Eq.{succ u2} (Prod.{u2, u2} C C) (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) X) (Prod.mk.{u2, u2} C C X X)
-but is expected to have type
- forall (C : Type.{u2}) [_inst_3 : CategoryTheory.Category.{u1, u2} C] (X : C), Eq.{succ u2} (Prod.{u2, u2} C C) (Prefunctor.obj.{succ u1, succ u1, u2, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3)) X) (Prod.mk.{u2, u2} C C X X)
-Case conversion may be inaccurate. Consider using '#align category_theory.functor.diag_obj CategoryTheory.Functor.diag_objₓ'. -/
@[simp]
theorem diag_obj (X : C) : (diag C).obj X = (X, X) :=
rfl
#align category_theory.functor.diag_obj CategoryTheory.Functor.diag_obj
-/- warning: category_theory.functor.diag_map -> CategoryTheory.Functor.diag_map is a dubious translation:
-lean 3 declaration is
- forall (C : Type.{u2}) [_inst_3 : CategoryTheory.Category.{u1, u2} C] {X : C} {Y : C} (f : Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) X Y), Eq.{succ u1} (Quiver.Hom.{succ u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) X) (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) Y)) (CategoryTheory.Functor.map.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) X Y f) (Prod.mk.{u1, u1} (Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.fst.{u2, u2} C C (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) X)) (Prod.fst.{u2, u2} C C (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) Y))) (Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.snd.{u2, u2} C C (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) X)) (Prod.snd.{u2, u2} C C (CategoryTheory.Functor.obj.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3) Y))) f f)
-but is expected to have type
- forall (C : Type.{u2}) [_inst_3 : CategoryTheory.Category.{u1, u2} C] {X : C} {Y : C} (f : Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) X Y), Eq.{succ u1} (Quiver.Hom.{succ u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (Prefunctor.obj.{succ u1, succ u1, u2, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3)) X) (Prefunctor.obj.{succ u1, succ u1, u2, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3)) Y)) (Prefunctor.map.{succ u1, succ u1, u2, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) (Prod.{u2, u2} C C) (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.Category.toCategoryStruct.{u1, u2} (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, u1, u2, u2} C _inst_3 (Prod.{u2, u2} C C) (CategoryTheory.uniformProd.{u1, u2} C _inst_3 C _inst_3) (CategoryTheory.Functor.diag.{u1, u2} C _inst_3)) X Y f) (Prod.mk.{u1, u1} (Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) X Y) (Quiver.Hom.{succ u1, u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_3)) X Y) f f)
-Case conversion may be inaccurate. Consider using '#align category_theory.functor.diag_map CategoryTheory.Functor.diag_mapₓ'. -/
@[simp]
theorem diag_map {X Y : C} (f : X ⟶ Y) : (diag C).map f = (f, f) :=
rfl
@@ -371,12 +347,6 @@ def prod {F G : A ⥤ B} {H I : C ⥤ D} (α : F ⟶ G) (β : H ⟶ I) : F.Prod
use instead `α.prod β` or `nat_trans.prod α β`. -/
end NatTrans
-/- warning: category_theory.flip_comp_evaluation -> CategoryTheory.flipCompEvaluation is a dubious translation:
-lean 3 declaration is
- forall {A : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u1, u4} A] {B : Type.{u5}} [_inst_2 : CategoryTheory.Category.{u2, u5} B] {C : Type.{u6}} [_inst_3 : CategoryTheory.Category.{u3, u6} C] (F : CategoryTheory.Functor.{u1, max u5 u3, u4, max u2 u3 u5 u6} A _inst_1 (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3)) (a : A), CategoryTheory.Iso.{max u5 u3, max u2 u3 u5 u6} (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.comp.{u2, max u4 u3, u3, u5, max u1 u3 u4 u6, u6} B _inst_2 (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3 (CategoryTheory.Functor.flip.{u1, u2, u3, u4, u5, u6} A _inst_1 B _inst_2 C _inst_3 F) (CategoryTheory.Functor.obj.{u1, max (max u1 u3 u4 u6) u3, u4, max (max u4 u3) u3 (max u1 u3 u4 u6) u6} A _inst_1 (CategoryTheory.Functor.{max u4 u3, u3, max u1 u3 u4 u6, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.Functor.category.{max u4 u3, u3, max u1 u3 u4 u6, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.evaluation.{u1, u3, u4, u6} A _inst_1 C _inst_3) a)) (CategoryTheory.Functor.obj.{u1, max u5 u3, u4, max u2 u3 u5 u6} A _inst_1 (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3) F a)
-but is expected to have type
- forall {A : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u1, u4} A] {B : Type.{u5}} [_inst_2 : CategoryTheory.Category.{u2, u5} B] {C : Type.{u6}} [_inst_3 : CategoryTheory.Category.{u3, u6} C] (F : CategoryTheory.Functor.{u1, max u5 u3, u4, max (max (max u6 u5) u3) u2} A _inst_1 (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3)) (a : A), CategoryTheory.Iso.{max u5 u3, max (max (max u6 u5) u3) u2} (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.comp.{u2, max u4 u3, u3, u5, max (max (max u4 u6) u1) u3, u6} B _inst_2 (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3 (CategoryTheory.Functor.flip.{u1, u2, u3, u4, u5, u6} A _inst_1 B _inst_2 C _inst_3 F) (Prefunctor.obj.{succ u1, max (max (max (succ u6) (succ u3)) (succ u1)) (succ u4), u4, max (max (max u6 u3) u1) u4} A (CategoryTheory.CategoryStruct.toQuiver.{u1, u4} A (CategoryTheory.Category.toCategoryStruct.{u1, u4} A _inst_1)) (CategoryTheory.Functor.{max u4 u3, u3, max (max (max u6 u4) u3) u1, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{max (max (max u6 u3) u4) u1, max (max (max u6 u3) u4) u1} (CategoryTheory.Functor.{max u4 u3, u3, max (max (max u6 u4) u3) u1, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.Category.toCategoryStruct.{max (max (max u6 u3) u4) u1, max (max (max u6 u3) u4) u1} (CategoryTheory.Functor.{max u4 u3, u3, max (max (max u6 u4) u3) u1, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.Functor.category.{max u4 u3, u3, max (max (max u4 u6) u1) u3, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, max (max (max u6 u3) u4) u1, u4, max (max (max u6 u3) u4) u1} A _inst_1 (CategoryTheory.Functor.{max u4 u3, u3, max (max (max u6 u4) u3) u1, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.Functor.category.{max u4 u3, u3, max (max (max u4 u6) u1) u3, u6} (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3) C _inst_3) (CategoryTheory.evaluation.{u1, u3, u4, u6} A _inst_1 C _inst_3)) a)) (Prefunctor.obj.{succ u1, max (succ u5) (succ u3), u4, max (max (max u5 u6) u2) u3} A (CategoryTheory.CategoryStruct.toQuiver.{u1, u4} A (CategoryTheory.Category.toCategoryStruct.{u1, u4} A _inst_1)) (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{max u5 u3, max (max (max u5 u6) u2) u3} (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{max u5 u3, max (max (max u5 u6) u2) u3} (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u1, max u5 u3, u4, max (max (max u5 u6) u2) u3} A _inst_1 (CategoryTheory.Functor.{u2, u3, u5, u6} B _inst_2 C _inst_3) (CategoryTheory.Functor.category.{u2, u3, u5, u6} B _inst_2 C _inst_3) F) a)
-Case conversion may be inaccurate. Consider using '#align category_theory.flip_comp_evaluation CategoryTheory.flipCompEvaluationₓ'. -/
/-- `F.flip` composed with evaluation is the same as evaluating `F`. -/
@[simps]
def flipCompEvaluation (F : A ⥤ B ⥤ C) (a) : F.flip ⋙ (evaluation _ _).obj a ≅ F.obj a :=
@@ -433,12 +403,6 @@ def functorProdFunctorEquivCounitIso :
#align category_theory.functor_prod_functor_equiv_counit_iso CategoryTheory.functorProdFunctorEquivCounitIso
-/
-/- warning: category_theory.functor_prod_functor_equiv -> CategoryTheory.functorProdFunctorEquiv is a dubious translation:
-lean 3 declaration is
- forall (A : Type.{u4}) [_inst_1 : CategoryTheory.Category.{u1, u4} A] (B : Type.{u5}) [_inst_2 : CategoryTheory.Category.{u2, u5} B] (C : Type.{u6}) [_inst_3 : CategoryTheory.Category.{u3, u6} C], CategoryTheory.Equivalence.{max (max u4 u2) u4 u3, max u4 u2 u3, max (max u1 u2 u4 u5) u1 u3 u4 u6, max u1 (max u2 u3) u4 u5 u6} (Prod.{max u1 u2 u4 u5, max u1 u3 u4 u6} (CategoryTheory.Functor.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3)) (CategoryTheory.prod.{max u4 u2, max u4 u3, max u1 u2 u4 u5, max u1 u3 u4 u6} (CategoryTheory.Functor.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.category.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3)) (CategoryTheory.Functor.{u1, max u2 u3, u4, max u5 u6} A _inst_1 (Prod.{u5, u6} B C) (CategoryTheory.prod.{u2, u3, u5, u6} B _inst_2 C _inst_3)) (CategoryTheory.Functor.category.{u1, max u2 u3, u4, max u5 u6} A _inst_1 (Prod.{u5, u6} B C) (CategoryTheory.prod.{u2, u3, u5, u6} B _inst_2 C _inst_3))
-but is expected to have type
- forall (A : Type.{u4}) [_inst_1 : CategoryTheory.Category.{u1, u4} A] (B : Type.{u5}) [_inst_2 : CategoryTheory.Category.{u2, u5} B] (C : Type.{u6}) [_inst_3 : CategoryTheory.Category.{u3, u6} C], CategoryTheory.Equivalence.{max (max u4 u2) u3, max (max u4 u2) u3, max (max (max (max u6 u4) u3) u1) (max (max u5 u4) u2) u1, max (max (max (max u6 u5) u4) u2 u3) u1} (Prod.{max (max (max u5 u4) u2) u1, max (max (max u6 u4) u3) u1} (CategoryTheory.Functor.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3)) (CategoryTheory.Functor.{u1, max u2 u3, u4, max u6 u5} A _inst_1 (Prod.{u5, u6} B C) (CategoryTheory.prod.{u2, u3, u5, u6} B _inst_2 C _inst_3)) (CategoryTheory.prod.{max u4 u2, max u4 u3, max (max (max u4 u5) u1) u2, max (max (max u4 u6) u1) u3} (CategoryTheory.Functor.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.category.{u1, u2, u4, u5} A _inst_1 B _inst_2) (CategoryTheory.Functor.{u1, u3, u4, u6} A _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u3, u4, u6} A _inst_1 C _inst_3)) (CategoryTheory.Functor.category.{u1, max u2 u3, u4, max u5 u6} A _inst_1 (Prod.{u5, u6} B C) (CategoryTheory.prod.{u2, u3, u5, u6} B _inst_2 C _inst_3))
-Case conversion may be inaccurate. Consider using '#align category_theory.functor_prod_functor_equiv CategoryTheory.functorProdFunctorEquivₓ'. -/
/-- The equivalence of categories between `(A ⥤ B) × (A ⥤ C)` and `A ⥤ (B × C)` -/
@[simps]
def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
These notions on functors are now Functor.Full
, Functor.Faithful
, Functor.EssSurj
, Functor.IsEquivalence
, Functor.ReflectsIsomorphisms
. Deprecated aliases are introduced for the previous names.
@@ -175,8 +175,8 @@ def braiding : C × D ≌ D × C :=
(NatIso.ofComponents fun X => eqToIso (by simp))
#align category_theory.prod.braiding CategoryTheory.Prod.braiding
-instance swapIsEquivalence : IsEquivalence (swap C D) :=
- (by infer_instance : IsEquivalence (braiding C D).functor)
+instance swapIsEquivalence : (swap C D).IsEquivalence :=
+ (by infer_instance : (braiding C D).functor.IsEquivalence)
#align category_theory.prod.swap_is_equivalence CategoryTheory.Prod.swapIsEquivalence
end Prod
Includes some doc comments and real code: this is exhaustive, with two exceptions:
Follow-up to #11301, much shorter this time.
@@ -384,11 +384,11 @@ open Opposite
@[simps]
def prodOpEquiv : (C × D)ᵒᵖ ≌ Cᵒᵖ × Dᵒᵖ where
functor :=
- { obj := λ X => ⟨op X.unop.1, op X.unop.2⟩,
- map := λ f => ⟨f.unop.1.op, f.unop.2.op⟩ }
+ { obj := fun X ↦ ⟨op X.unop.1, op X.unop.2⟩,
+ map := fun f ↦ ⟨f.unop.1.op, f.unop.2.op⟩ }
inverse :=
- { obj := λ ⟨X,Y⟩ => op ⟨X.unop, Y.unop⟩,
- map := λ ⟨f,g⟩ => op ⟨f.unop, g.unop⟩ }
+ { obj := fun ⟨X,Y⟩ ↦ op ⟨X.unop, Y.unop⟩,
+ map := fun ⟨f,g⟩ ↦ op ⟨f.unop, g.unop⟩ }
unitIso := Iso.refl _
counitIso := Iso.refl _
functor_unitIso_comp := fun ⟨X, Y⟩ => by
This is a very large PR, but it has been reviewed piecemeal already in PRs to the bump/v4.7.0
branch as we update to intermediate nightlies.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: damiano <adomani@gmail.com>
@@ -393,7 +393,7 @@ def prodOpEquiv : (C × D)ᵒᵖ ≌ Cᵒᵖ × Dᵒᵖ where
counitIso := Iso.refl _
functor_unitIso_comp := fun ⟨X, Y⟩ => by
dsimp
- ext <;> simpa using Category.id_comp _
+ ext <;> apply Category.id_comp
end Opposite
@@ -66,7 +66,7 @@ theorem isIso_prod_iff {P Q : C} {S T : D} {f : (P, S) ⟶ (Q, T)} :
IsIso f ↔ IsIso f.1 ∧ IsIso f.2 := by
constructor
· rintro ⟨g, hfg, hgf⟩
- simp at hfg hgf
+ simp? at hfg hgf says simp only [prod_Hom, prod_comp, prod_id, Prod.mk.injEq] at hfg hgf
rcases hfg with ⟨hfg₁, hfg₂⟩
rcases hgf with ⟨hgf₁, hgf₂⟩
exact ⟨⟨⟨g.1, hfg₁, hgf₁⟩⟩, ⟨⟨g.2, hfg₂, hgf₂⟩⟩⟩
This PR develops the API for cartesian products of categories (natural isomorphisms, equivalences, morphism properties) in order to show that under simple assumptions, the localized category of a product of two categories identifies to a product of the localized categories.
@@ -298,6 +298,29 @@ def prod {F G : A ⥤ B} {H I : C ⥤ D} (α : F ⟶ G) (β : H ⟶ I) : F.prod
use instead `α.prod β` or `NatTrans.prod α β`. -/
end NatTrans
+namespace NatIso
+
+/-- The cartesian product of two natural isomorphisms. -/
+@[simps]
+def prod {F F' : A ⥤ B} {G G' : C ⥤ D} (e₁ : F ≅ F') (e₂ : G ≅ G') :
+ F.prod G ≅ F'.prod G' where
+ hom := NatTrans.prod e₁.hom e₂.hom
+ inv := NatTrans.prod e₁.inv e₂.inv
+
+end NatIso
+
+namespace Equivalence
+
+/-- The cartesian product of two equivalences of categories. -/
+@[simps]
+def prod (E₁ : A ≌ B) (E₂ : C ≌ D) : A × C ≌ B × D where
+ functor := E₁.functor.prod E₂.functor
+ inverse := E₁.inverse.prod E₂.inverse
+ unitIso := NatIso.prod E₁.unitIso E₂.unitIso
+ counitIso := NatIso.prod E₁.counitIso E₂.counitIso
+
+end Equivalence
+
/-- `F.flip` composed with evaluation is the same as evaluating `F`. -/
@[simps!]
def flipCompEvaluation (F : A ⥤ B ⥤ C) (a) : F.flip ⋙ (evaluation _ _).obj a ≅ F.obj a :=
Equivalence between the opposite of a product of categories and the product of the opposites.
@@ -5,6 +5,7 @@ Authors: Stephen Morgan, Scott Morrison
-/
import Mathlib.CategoryTheory.EqToHom
import Mathlib.CategoryTheory.Functor.Const
+import Mathlib.CategoryTheory.Opposites
import Mathlib.Data.Prod.Basic
#align_import category_theory.products.basic from "leanprover-community/mathlib"@"dc6c365e751e34d100e80fe6e314c3c3e0fd2988"
@@ -352,4 +353,25 @@ def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C :=
counitIso := functorProdFunctorEquivCounitIso A B C, }
#align category_theory.functor_prod_functor_equiv CategoryTheory.functorProdFunctorEquiv
+section Opposite
+
+open Opposite
+
+/-- The equivalence between the opposite of a product and the product of the opposites. -/
+@[simps]
+def prodOpEquiv : (C × D)ᵒᵖ ≌ Cᵒᵖ × Dᵒᵖ where
+ functor :=
+ { obj := λ X => ⟨op X.unop.1, op X.unop.2⟩,
+ map := λ f => ⟨f.unop.1.op, f.unop.2.op⟩ }
+ inverse :=
+ { obj := λ ⟨X,Y⟩ => op ⟨X.unop, Y.unop⟩,
+ map := λ ⟨f,g⟩ => op ⟨f.unop, g.unop⟩ }
+ unitIso := Iso.refl _
+ counitIso := Iso.refl _
+ functor_unitIso_comp := fun ⟨X, Y⟩ => by
+ dsimp
+ ext <;> simpa using Category.id_comp _
+
+end Opposite
+
end CategoryTheory
@@ -2,16 +2,13 @@
Copyright (c) 2017 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Stephen Morgan, Scott Morrison
-
-! This file was ported from Lean 3 source module category_theory.products.basic
-! leanprover-community/mathlib commit dc6c365e751e34d100e80fe6e314c3c3e0fd2988
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.CategoryTheory.EqToHom
import Mathlib.CategoryTheory.Functor.Const
import Mathlib.Data.Prod.Basic
+#align_import category_theory.products.basic from "leanprover-community/mathlib"@"dc6c365e751e34d100e80fe6e314c3c3e0fd2988"
+
/-!
# Cartesian products of categories
@@ -158,7 +158,7 @@ def swap : C × D ⥤ D × C where
map f := (f.2, f.1)
#align category_theory.prod.swap CategoryTheory.Prod.swap
-/-- Swapping the factors of a cartesion product of categories twice is naturally isomorphic
+/-- Swapping the factors of a cartesian product of categories twice is naturally isomorphic
to the identity functor.
-/
@[simps]
@@ -173,8 +173,8 @@ def symmetry : swap C D ⋙ swap D C ≅ 𝟭 (C × D)
@[simps!]
def braiding : C × D ≌ D × C :=
Equivalence.mk (swap C D) (swap D C)
- (NatIso.ofComponents (fun X => eqToIso (by simp)) (by aesop_cat))
- (NatIso.ofComponents (fun X => eqToIso (by simp)) (by aesop_cat))
+ (NatIso.ofComponents fun X => eqToIso (by simp))
+ (NatIso.ofComponents fun X => eqToIso (by simp))
#align category_theory.prod.braiding CategoryTheory.Prod.braiding
instance swapIsEquivalence : IsEquivalence (swap C D) :=
@@ -192,8 +192,7 @@ variable (C : Type u₁) [Category.{v₁} C] (D : Type u₂) [Category.{v₂} D]
which is functorial in both `X` and `F`.
-/
@[simps]
-def evaluation : C ⥤ (C ⥤ D) ⥤ D
- where
+def evaluation : C ⥤ (C ⥤ D) ⥤ D where
obj X :=
{ obj := fun F => F.obj X
map := fun α => α.app X }
@@ -206,8 +205,7 @@ def evaluation : C ⥤ (C ⥤ D) ⥤ D
as a functor `C × (C ⥤ D) ⥤ D`.
-/
@[simps]
-def evaluationUncurried : C × (C ⥤ D) ⥤ D
- where
+def evaluationUncurried : C × (C ⥤ D) ⥤ D where
obj p := p.2.obj p.1
map := fun {x} {y} f => x.2.map f.1 ≫ f.2.app y.1
map_comp := fun {X} {Y} {Z} f g => by
@@ -222,7 +220,7 @@ variable {C}
/-- The constant functor followed by the evaluation functor is just the identity. -/
@[simps!]
def Functor.constCompEvaluationObj (X : C) : Functor.const C ⋙ (evaluation C D).obj X ≅ 𝟭 D :=
- NatIso.ofComponents (fun Y => Iso.refl _) fun {Y} {Z} f => by simp
+ NatIso.ofComponents fun Y => Iso.refl _
#align category_theory.functor.const_comp_evaluation_obj CategoryTheory.Functor.constCompEvaluationObj
end
@@ -234,8 +232,7 @@ namespace Functor
/-- The cartesian product of two functors. -/
@[simps]
-def prod (F : A ⥤ B) (G : C ⥤ D) : A × C ⥤ B × D
- where
+def prod (F : A ⥤ B) (G : C ⥤ D) : A × C ⥤ B × D where
obj X := (F.obj X.1, G.obj X.2)
map f := (F.map f.1, G.map f.2)
#align category_theory.functor.prod CategoryTheory.Functor.prod
@@ -244,8 +241,7 @@ def prod (F : A ⥤ B) (G : C ⥤ D) : A × C ⥤ B × D
You can use `F.prod G` as a "poor man's infix", or just write `functor.prod F G`. -/
/-- Similar to `prod`, but both functors start from the same category `A` -/
@[simps]
-def prod' (F : A ⥤ B) (G : A ⥤ C) : A ⥤ B × C
- where
+def prod' (F : A ⥤ B) (G : A ⥤ C) : A ⥤ B × C where
obj a := (F.obj a, G.obj a)
map f := (F.map f, G.map f)
#align category_theory.functor.prod' CategoryTheory.Functor.prod'
@@ -253,13 +249,13 @@ def prod' (F : A ⥤ B) (G : A ⥤ C) : A ⥤ B × C
/-- The product `F.prod' G` followed by projection on the first component is isomorphic to `F` -/
@[simps!]
def prod'CompFst (F : A ⥤ B) (G : A ⥤ C) : F.prod' G ⋙ CategoryTheory.Prod.fst B C ≅ F :=
- NatIso.ofComponents (fun X => Iso.refl _) fun f => by simp
+ NatIso.ofComponents fun X => Iso.refl _
#align category_theory.functor.prod'_comp_fst CategoryTheory.Functor.prod'CompFst
/-- The product `F.prod' G` followed by projection on the second component is isomorphic to `G` -/
@[simps!]
def prod'CompSnd (F : A ⥤ B) (G : A ⥤ C) : F.prod' G ⋙ CategoryTheory.Prod.snd B C ≅ G :=
- NatIso.ofComponents (fun X => Iso.refl _) fun f => by simp
+ NatIso.ofComponents fun X => Iso.refl _
#align category_theory.functor.prod'_comp_snd CategoryTheory.Functor.prod'CompSnd
section
@@ -307,7 +303,7 @@ end NatTrans
/-- `F.flip` composed with evaluation is the same as evaluating `F`. -/
@[simps!]
def flipCompEvaluation (F : A ⥤ B ⥤ C) (a) : F.flip ⋙ (evaluation _ _).obj a ≅ F.obj a :=
- (NatIso.ofComponents fun b => eqToIso rfl) <| by aesop_cat
+ NatIso.ofComponents fun b => eqToIso rfl
#align category_theory.flip_comp_evaluation CategoryTheory.flipCompEvaluation
variable (A B C)
@@ -338,36 +334,25 @@ def functorProdToProdFunctor : (A ⥤ B × C) ⥤ (A ⥤ B) × (A ⥤ C)
@[simps!]
def functorProdFunctorEquivUnitIso :
𝟭 _ ≅ prodFunctorToFunctorProd A B C ⋙ functorProdToProdFunctor A B C :=
- NatIso.ofComponents
- (fun F =>
- (((Functor.prod'CompFst F.fst F.snd).prod (Functor.prod'CompSnd F.fst F.snd)).trans
- (prod.etaIso F)).symm)
- (fun α => by aesop_cat)
+ NatIso.ofComponents fun F =>
+ (((Functor.prod'CompFst F.fst F.snd).prod (Functor.prod'CompSnd F.fst F.snd)).trans
+ (prod.etaIso F)).symm
#align category_theory.functor_prod_functor_equiv_unit_iso CategoryTheory.functorProdFunctorEquivUnitIso
/-- The counit isomorphism for `functorProdFunctorEquiv` -/
@[simps!]
def functorProdFunctorEquivCounitIso :
functorProdToProdFunctor A B C ⋙ prodFunctorToFunctorProd A B C ≅ 𝟭 _ :=
- NatIso.ofComponents (fun F => NatIso.ofComponents (fun X => prod.etaIso (F.obj X)) (by aesop_cat))
- (by aesop_cat)
+ NatIso.ofComponents fun F => NatIso.ofComponents fun X => prod.etaIso (F.obj X)
#align category_theory.functor_prod_functor_equiv_counit_iso CategoryTheory.functorProdFunctorEquivCounitIso
-/- Porting note: unlike with Lean 3, we needed to provide `functor_unitIso_comp` because
-Lean 4 could not see through `functorProdFunctorEquivUnitIso` (or the co-unit version)
-to run the auto tactic `by aesop_cat` -/
-
/-- The equivalence of categories between `(A ⥤ B) × (A ⥤ C)` and `A ⥤ (B × C)` -/
@[simps]
def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C :=
{ functor := prodFunctorToFunctorProd A B C,
inverse := functorProdToProdFunctor A B C,
unitIso := functorProdFunctorEquivUnitIso A B C,
- counitIso := functorProdFunctorEquivCounitIso A B C,
- functor_unitIso_comp := by
- simp only [functorProdFunctorEquivUnitIso]
- aesop_cat
- }
+ counitIso := functorProdFunctorEquivCounitIso A B C, }
#align category_theory.functor_prod_functor_equiv CategoryTheory.functorProdFunctorEquiv
end CategoryTheory
I ran codespell Mathlib
and got tired halfway through the suggestions.
@@ -219,7 +219,7 @@ def evaluationUncurried : C × (C ⥤ D) ⥤ D
variable {C}
-/-- The constant functor followed by the evalutation functor is just the identity. -/
+/-- The constant functor followed by the evaluation functor is just the identity. -/
@[simps!]
def Functor.constCompEvaluationObj (X : C) : Functor.const C ⋙ (evaluation C D).obj X ≅ 𝟭 D :=
NatIso.ofComponents (fun Y => Iso.refl _) fun {Y} {Z} f => by simp
This is the forward port of https://github.com/leanprover-community/mathlib/pull/18742. That PR hasn't landed yet, so this PR still needs to be updated with the new commit SHA.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr>
@@ -44,7 +44,7 @@ variable (C : Type u₁) [Category.{v₁} C] (D : Type u₂) [Category.{v₂} D]
See <https://stacks.math.columbia.edu/tag/001K>.
-/
-@[simps (config := { notRecursive := [] })]
+@[simps (config := { notRecursive := [] }) Hom id_fst id_snd comp_fst comp_snd]
instance prod : Category.{max v₁ v₂} (C × D)
where
Hom X Y := (X.1 ⟶ Y.1) × (X.2 ⟶ Y.2)
vscode is already configured by .vscode/settings.json
to trim these on save. It's not clear how they've managed to stick around.
By doing this all in one PR now, it avoids getting random whitespace diffs in PRs later.
This was done with a regex search in vscode,
@@ -172,7 +172,7 @@ def symmetry : swap C D ⋙ swap D C ≅ 𝟭 (C × D)
-/
@[simps!]
def braiding : C × D ≌ D × C :=
- Equivalence.mk (swap C D) (swap D C)
+ Equivalence.mk (swap C D) (swap D C)
(NatIso.ofComponents (fun X => eqToIso (by simp)) (by aesop_cat))
(NatIso.ofComponents (fun X => eqToIso (by simp)) (by aesop_cat))
#align category_theory.prod.braiding CategoryTheory.Prod.braiding
@@ -294,9 +294,9 @@ def prod {F G : A ⥤ B} {H I : C ⥤ D} (α : F ⟶ G) (β : H ⟶ I) : F.prod
app X := (α.app X.1, β.app X.2)
naturality {X} {Y} f := by
cases X; cases Y
- simp only [Functor.prod_map, prod_comp]
- rw [Prod.mk.inj_iff]
- constructor
+ simp only [Functor.prod_map, prod_comp]
+ rw [Prod.mk.inj_iff]
+ constructor
repeat {rw [naturality]}
#align category_theory.nat_trans.prod CategoryTheory.NatTrans.prod
@@ -338,11 +338,11 @@ def functorProdToProdFunctor : (A ⥤ B × C) ⥤ (A ⥤ B) × (A ⥤ C)
@[simps!]
def functorProdFunctorEquivUnitIso :
𝟭 _ ≅ prodFunctorToFunctorProd A B C ⋙ functorProdToProdFunctor A B C :=
- NatIso.ofComponents
- (fun F =>
- (((Functor.prod'CompFst F.fst F.snd).prod (Functor.prod'CompSnd F.fst F.snd)).trans
- (prod.etaIso F)).symm)
- (fun α => by aesop_cat)
+ NatIso.ofComponents
+ (fun F =>
+ (((Functor.prod'CompFst F.fst F.snd).prod (Functor.prod'CompSnd F.fst F.snd)).trans
+ (prod.etaIso F)).symm)
+ (fun α => by aesop_cat)
#align category_theory.functor_prod_functor_equiv_unit_iso CategoryTheory.functorProdFunctorEquivUnitIso
/-- The counit isomorphism for `functorProdFunctorEquiv` -/
@@ -354,12 +354,12 @@ def functorProdFunctorEquivCounitIso :
#align category_theory.functor_prod_functor_equiv_counit_iso CategoryTheory.functorProdFunctorEquivCounitIso
/- Porting note: unlike with Lean 3, we needed to provide `functor_unitIso_comp` because
-Lean 4 could not see through `functorProdFunctorEquivUnitIso` (or the co-unit version)
+Lean 4 could not see through `functorProdFunctorEquivUnitIso` (or the co-unit version)
to run the auto tactic `by aesop_cat` -/
/-- The equivalence of categories between `(A ⥤ B) × (A ⥤ C)` and `A ⥤ (B × C)` -/
@[simps]
-def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C :=
+def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C :=
{ functor := prodFunctorToFunctorProd A B C,
inverse := functorProdToProdFunctor A B C,
unitIso := functorProdFunctorEquivUnitIso A B C,
@@ -353,7 +353,7 @@ def functorProdFunctorEquivCounitIso :
(by aesop_cat)
#align category_theory.functor_prod_functor_equiv_counit_iso CategoryTheory.functorProdFunctorEquivCounitIso
-/- Porting note: unlike with Lean 3, we needed to provide `functor_unit_iso_comp` because
+/- Porting note: unlike with Lean 3, we needed to provide `functor_unitIso_comp` because
Lean 4 could not see through `functorProdFunctorEquivUnitIso` (or the co-unit version)
to run the auto tactic `by aesop_cat` -/
@@ -364,7 +364,7 @@ def functorProdFunctorEquiv : (A ⥤ B) × (A ⥤ C) ≌ A ⥤ B × C :=
inverse := functorProdToProdFunctor A B C,
unitIso := functorProdFunctorEquivUnitIso A B C,
counitIso := functorProdFunctorEquivCounitIso A B C,
- functor_unit_iso_comp := by
+ functor_unitIso_comp := by
simp only [functorProdFunctorEquivUnitIso]
aesop_cat
}
All dependencies are ported!