Zulip Chat Archive
Stream: Is there code for X?
Topic: Defining 2-category in lean?
Coriver Chen (Oct 14 2023 at 08:12):
Hi how to define 2-category in lean? I found that it even quite hard to define the data
Coriver Chen (Oct 14 2023 at 08:14):
I checked Quiver
's definition and try something like
import Mathlib.CategoryTheory.Category.Basic
import Mathlib.CategoryTheory.Products.Basic
open CategoryTheory
universe w v u
class TwoQuiver (V : Type u) where
Hom : V → V → Sort v
Trans : Sort v → Sort v → Sort w
Coriver Chen (Oct 14 2023 at 08:15):
Is the type signature OK for https://ncatlab.org/nlab/show/2-category ?
Coriver Chen (Oct 14 2023 at 08:22):
I tried
import Mathlib.CategoryTheory.Category.Basic
import Mathlib.CategoryTheory.Products.Basic
open CategoryTheory
universe w v u₁ u₂ u₃
variable (V : Type v) [CategoryTheory.Category.{w} V]
class TwoCategory (C: Type u₁) where
Hom : C → C → V
h_comp{X Y Z: C}: Hom X Y × Hom Y Z → Hom X Z
too code in playground but it says "type expected, got (Hom X Z : V)"
Coriver Chen (Oct 14 2023 at 08:23):
I understand that Hom X Z
is a value with type V
, but it should also be treat as a type too?
Scott Morrison (Oct 14 2023 at 08:48):
docs#CategoryTheory.Bicategory
Coriver Chen (Oct 15 2023 at 03:20):
I am continuing the construction of the definition of 2-category in lean, using the idea similar to Bicategory.
Now I get the following code:
import Mathlib.CategoryTheory.Category.Basic
import Mathlib.CategoryTheory.Products.Basic
import Mathlib.CategoryTheory.Products.Associator
import Mathlib.CategoryTheory.Functor.Basic
import Mathlib.CategoryTheory.Functor.Currying
open CategoryTheory
open CategoryTheory.prod
universe w v u u₁ u₂ u₃ v₁ v₂ v₃
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D] {E : Type u₃} [Category.{v₃} E]
-- copy from Mathlib.CategoryTheory.Functor.Currying
-- where it does not curry the second, werid
def curryObj₂ (F : C × D ⥤ E) : D ⥤ C ⥤ E
where
obj Y :=
{ obj := fun X => F.obj (X, Y)
map := fun g => F.map (g, 𝟙 Y)
map_id := fun X => by simp only [F.map_id]; rw [←prod_id]; exact F.map_id ⟨X,Y⟩
map_comp := fun f g => by simp [←F.map_comp]}
map g :=
{ app := fun X => F.map (𝟙 X, g)
naturality := fun {Y} {Y'} g => by simp [←F.map_comp] }
map_id := fun X => by ext Y; exact F.map_id _
map_comp := fun f g => by ext Y; dsimp; simp [←F.map_comp]
class TwoCategory (C : Type u) extends Quiver.{v + 1} C : Type (max (max u (v + 1)) (w + 1)) where
homCategory(X Y : C) : Category.{w} (X ⟶ Y)
h_comp{X Y Z : C} : (X ⟶ Y) × (Y ⟶ Z) ⥤ (X ⟶ Z)
-- cannot use symbol 𝟙
id(X : C) : X ⟶ X
id_eq₁(X Y : C) : (curryObj h_comp).obj (id X) = 𝟭 (X ⟶ Y)
id_eq₂(X Y : C) : (curryObj₂ h_comp).obj (id Y) = 𝟭 (X ⟶ Y)
assoc(X Y Z W : C) : (@h_comp X Y Z).prod (𝟭 (Z ⟶ W)) ⋙ (@h_comp X Z W) = ((𝟭 (X ⟶ Y)).prod (@h_comp Y Z W)) ⋙ (@h_comp X Y W)
Coriver Chen (Oct 15 2023 at 03:25):
But in the definition of assoc
the kernel reprots the error
type mismatch
Functor.prod (𝟭 (X ⟶ Y)) h_comp ⋙ h_comp
has type
(X ⟶ Y) × (Y ⟶ Z) × (Z ⟶ W) ⥤ (X ⟶ W) : Type (max w v)
but is expected to have type
((X ⟶ Y) × (Y ⟶ Z)) × (Z ⟶ W) ⥤ (X ⟶ W) : Type (max w v)
Is it any way to fix this? It seems that the equivalance (C × D) × E ≌ C × D × E has to be considered. I saw CategoryTheory.prod.associativity. But I have no idea how to use it. Thank you very much!
Scott Morrison (Oct 15 2023 at 05:25):
Can't you just use the existing Bicategory? Setting up this definition is not the easiest learning exercise for a beginner.
Coriver Chen (Oct 15 2023 at 05:39):
Yeah I can do that too. Now I see that "any strict 2-category is a bicategory in which the unitors and associator are identities. " in ncatlab. Using the existing bicategory and adding two more constraints to it should be enough, I will try to do it this way.
Dean Young (Oct 15 2023 at 05:46):
@Coriver Chen it's worth noting that a strict twocategory can be made to have seven entries just like a category, if you bundle them up right:
-- definition of a (strict) twocategory
structure twocategory.{w} where
Obj : Type w
Hom : Obj →
Obj →
category
Idn : (C : Obj) →
Cat.Hom *_Cat (Hom C C)
Cmp : (C : Obj) →
(D : Obj) →
(E : Obj) →
Cat.Hom ((Hom C D) ×_Cat (Hom D E)) (Hom C E)
Id₁ : (C : Obj) →
(D : Obj) →
((Cmp C D D) ∘_(Cat) ((𝟙_(Cat) (Hom C D)) ×_Fun (Idn D)) ∘_(Cat) (PrdId₁ (Hom C D)).Fst) = (𝟙_(Cat) (Hom C D))
Id₂ : (C : Obj) →
(D : Obj) →
((Cmp C C D) ∘_(Cat) ((Idn C) ×_Fun (𝟙_(Cat) (Hom C D))) ∘_(Cat) (PrdId₂Fst (Hom C D))) = (𝟙_(Cat) (Hom C D))
Ass : (B : Obj) →
(C : Obj) →
(D : Obj) →
(E : Obj) →
((Cmp B C E) ∘_(Cat) ((𝟙_(Cat) (Hom B C)) ×_Fun (Cmp C D E))) = (Cmp B D E) ∘_(Cat) ((Cmp B C D) ×_Fun (𝟙_(Cat) (Hom D E))) ∘_(Cat) (PrdAss (Hom B C) (Hom C D) (Hom D E)).Fst
This is more cumbersome than using a bicategory though.
Coriver Chen (Oct 15 2023 at 06:01):
@Dean Young Thank you for the alternative definition. I will try this too. The definition of it seems to be possible in three ways: via data like obj, 1-morphism and 2-morphism; or as an enriched category; or from the definition of bicategory.
Last updated: Dec 20 2023 at 11:08 UTC