Categories.agda 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. module Categories where
  2. infix 10 _≡_
  3. data _≡_ {A : Set}(a : A) : {B : Set} -> B -> Set where
  4. refl : a ≡ a
  5. trans : forall {A B C}{a : A}{b : B}{c : C} -> a ≡ b -> b ≡ c -> a ≡ c
  6. trans refl p = p
  7. sym : forall {A B}{a : A}{b : B} -> a ≡ b -> b ≡ a
  8. sym refl = refl
  9. resp : forall {A}{B : A -> Set}{a a' : A} ->
  10. (f : (a : A) -> B a) -> a ≡ a' -> f a ≡ f a'
  11. resp f refl = refl
  12. record Cat : Set1 where
  13. infix 20 _○_
  14. field Obj : Set
  15. Hom : Obj -> Obj -> Set
  16. id : forall X -> Hom X X
  17. _○_ : forall {X Y Z} -> Hom Y Z -> Hom X Y -> Hom X Z
  18. idl : forall {X Y}{f : Hom X Y} -> id Y ○ f ≡ f
  19. idr : forall {X Y}{f : Hom X Y} -> f ○ id X ≡ f
  20. assoc : forall {W X Y Z}{f : Hom W X}{g : Hom X Y}{h : Hom Y Z} ->
  21. (h ○ g) ○ f ≡ h ○ (g ○ f)
  22. open Cat
  23. record Functor (C D : Cat) : Set where
  24. field Fun : Obj C -> Obj D
  25. map : forall {X Y} -> (Hom C X Y) -> Hom D (Fun X) (Fun Y)
  26. mapid : forall {X} -> map (id C X) ≡ id D (Fun X)
  27. map○ : forall {X Y Z}{f : Hom C X Y}{g : Hom C Y Z} ->
  28. map (_○_ C g f) ≡ _○_ D (map g) (map f)
  29. open Functor
  30. idF : forall C -> Functor C C
  31. idF C = record {Fun = \x -> x; map = \x -> x; mapid = refl; map○ = refl}
  32. _•_ : forall {C D E} -> Functor D E -> Functor C D -> Functor C E
  33. F • G = record {Fun = \X -> Fun F (Fun G X);
  34. map = \f -> map F (map G f);
  35. mapid = trans (resp (\x -> map F x) (mapid G)) (mapid F);
  36. map○ = trans (resp (\x -> map F x) (map○ G)) (map○ F)}
  37. record Nat {C D : Cat} (F G : Functor C D) : Set where
  38. field η : (X : Obj C) -> Hom D (Fun F X) (Fun G X)
  39. law : {X Y : Obj C}{f : Hom C X Y} ->
  40. _○_ D (η Y) (map F f) ≡ _○_ D (map G f) (η X)
  41. open Nat
  42. _▪_ : forall {C D : Cat}{F G H : Functor C D} -> Nat G H -> Nat F G -> Nat F H
  43. _▪_ {D = D} A B =
  44. record {
  45. η = \X -> _○_ D (η A X) (η B X);
  46. law = \{X}{Y} ->
  47. trans (assoc D)
  48. (trans (resp (\f -> _○_ D (η A Y) f) (law B))
  49. (trans (sym (assoc D))
  50. (trans (resp (\g -> _○_ D g (η B X)) (law A))
  51. (assoc D))))
  52. }