Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+โ†‘ Ctrl+โ†“ to navigate, Ctrl+๐Ÿ–ฑ๏ธ to focus. On Mac, use โŒ˜ instead of Ctrl.
(** * Functoriality of the comma category construction with projection functors *)
Require Import Category.Core Functor.Core.
Require Import Category.Prod Functor.Prod.Core.
Require Import Category.Dual Functor.Dual.
Require Import Functor.Composition.Core.
Require Import InitialTerminalCategory.Core InitialTerminalCategory.Functors NatCategory.
Require Import FunctorCategory.Core.
Require Import Cat.Core.
Require Import Functor.Paths.
Require Comma.Core.
Local Set Warnings "-notation-overridden". (* work around bug #5567, https://coq.inria.fr/bugs/show_bug.cgi?id=5567, notation-overridden,parsing should not trigger for only printing notations *)
Import Comma.Core.
Local Set Warnings "notation-overridden".
Require Import Comma.InducedFunctors Comma.Projection.
Require ProductLaws ExponentialLaws.Law1.Functors ExponentialLaws.Law4.Functors.
Require Import Types.Forall PathGroupoids HoTT.Tactics.

Set Implicit Arguments.
Generalizable All Variables.

Local Open Scope category_scope.

(** ** Functor from [(A โ†’ C)แต’แต– ร— (B โ†’ C)] to [cat / (A ร— B)] *)
(** It sends [S : A โ†’ C โ† B : T] to the category [(S / T)] and its projection functor to [A ร— B]. *)
Section comma.
  Local Open Scope type_scope.
  Context `{Funext}.

  Variable P : PreCategory -> Type.
  Context `{HF : forall C D, P C -> P D -> IsHSet (Functor C D)}.

  Local Notation Cat := (@sub_pre_cat _ P HF).

  Variables A B C : PreCategory.

  Hypothesis PAB : P (A * B).
  Hypothesis P_comma : forall (S : Functor A C) (T : Functor B C),
                         P (S / T).

  Local Open Scope category_scope.
  Local Open Scope morphism_scope.

  
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
ST: ((A -> C)^op * (B -> C))%category

Cat / !((A * B; PAB) : Cat)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
ST: ((A -> C)^op * (B -> C))%category

Cat / !((A * B; PAB) : Cat)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
ST: ((A -> C)^op * (B -> C))%category

morphism Cat (Cat _0 (Overture.fst ST / Overture.snd ST; P_comma (Overture.fst ST) (Overture.snd ST)))%object (!(A * B; PAB) _0 (center 1%category))%object
exact (comma_category_projection (Basics.Overture.fst ST) (Basics.Overture.snd ST)). Defined.
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d: ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d

morphism (Cat / !((A * B; PAB) : Cat)) (comma_category_projection_functor_object_of s) (comma_category_projection_functor_object_of d)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d: ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d

morphism (Cat / !((A * B; PAB) : Cat)) (comma_category_projection_functor_object_of s) (comma_category_projection_functor_object_of d)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d: ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d

CommaCategory.morphism (comma_category_projection_functor_object_of s) (comma_category_projection_functor_object_of d)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d: ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d

!(A * B; PAB) _1 (center (morphism 1 (CommaCategory.b (comma_category_projection_functor_object_of s)) (CommaCategory.b (comma_category_projection_functor_object_of d)))) o CommaCategory.f (comma_category_projection_functor_object_of s) = CommaCategory.f (comma_category_projection_functor_object_of d) o Cat _1 (comma_category_induced_functor m)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d: ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d

(Identity.identity (A * B) o comma_category_projection (Overture.fst s) (Overture.snd s))%functor = (comma_category_projection (Overture.fst d) (Overture.snd d) o comma_category_induced_functor m)%functor
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
fst1: Functor A C
snd1: Functor B C
fst0: Functor A C
snd0: Functor B C
fst: Core.NaturalTransformation fst0 fst1
snd: Core.NaturalTransformation snd1 snd0

(Identity.identity (A * B) o comma_category_projection fst1 snd1)%functor = (comma_category_projection fst0 snd0 o comma_category_induced_functor (fst, snd)%core)%functor
path_functor. Defined. Local Ltac comma_laws_t := repeat (apply path_forall || intro); simpl; rewrite !transport_forall_constant; transport_path_forall_hammer; simpl; destruct_head Basics.Overture.prod; simpl in *; apply CommaCategory.path_morphism; simpl; repeat match goal with | [ |- context[?f _ _ _ _ _ _ _ (transport ?P ?p ?z)] ] => simpl rewrite (@ap_transport _ P _ _ _ p (fun _ => f _ _ _ _ _ _ _) z) | [ |- context[transport (fun y => ?f (?fa _ _ _ _ _ y) ?x)] ] => rewrite (fun a b => @transport_compose _ _ a b (fun y => f y x) (fa _ _ _ _ _)) | [ |- context[transport (fun y => ?f ?x (?fa _ _ _ _ _ y))] ] => rewrite (fun a b => @transport_compose _ _ a b (fun y => f x y) (fa _ _ _ _ _)) end; unfold comma_category_induced_functor_object_of_identity; unfold comma_category_induced_functor_object_of_compose; simpl; rewrite ?CommaCategory.ap_a_path_object', ?CommaCategory.ap_b_path_object'; try reflexivity.
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
x: ((A -> C)^op * (B -> C))%category

comma_category_projection_functor_morphism_of 1 = 1
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
x: ((A -> C)^op * (B -> C))%category

comma_category_projection_functor_morphism_of 1 = 1
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
x: ((A -> C)^op * (B -> C))%category

comma_category_induced_functor (NaturalTransformation.Identity.identity (Overture.fst x), NaturalTransformation.Identity.identity (Overture.snd x)) = Identity.identity (Overture.fst x / Overture.snd x)
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
x: ((A -> C)^op * (B -> C))%category

{HO : comma_category_induced_functor_object_of (NaturalTransformation.Identity.identity (Overture.fst x), NaturalTransformation.Identity.identity (Overture.snd x)) = idmap & transport (fun GO : CommaCategory.object (Overture.fst x) (Overture.snd x) -> CommaCategory.object (Overture.fst x) (Overture.snd x) => forall s d : CommaCategory.object (Overture.fst x) (Overture.snd x), CommaCategory.morphism s d -> CommaCategory.morphism (GO s) (GO d)) HO (comma_category_induced_functor_morphism_of (NaturalTransformation.Identity.identity (Overture.fst x), NaturalTransformation.Identity.identity (Overture.snd x))) = (fun s d : CommaCategory.object (Overture.fst x) (Overture.snd x) => idmap)}
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
x: ((A -> C)^op * (B -> C))%category

transport (fun GO : CommaCategory.object (Overture.fst x) (Overture.snd x) -> CommaCategory.object (Overture.fst x) (Overture.snd x) => forall s d : CommaCategory.object (Overture.fst x) (Overture.snd x), CommaCategory.morphism s d -> CommaCategory.morphism (GO s) (GO d)) (path_forall (comma_category_induced_functor_object_of 1) idmap (comma_category_induced_functor_object_of_identity x)) (comma_category_induced_functor_morphism_of (NaturalTransformation.Identity.identity (Overture.fst x), NaturalTransformation.Identity.identity (Overture.snd x))) = (fun s d : CommaCategory.object (Overture.fst x) (Overture.snd x) => idmap)
comma_laws_t. Qed.
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

comma_category_projection_functor_morphism_of (m' o m) = comma_category_projection_functor_morphism_of m' o comma_category_projection_functor_morphism_of m
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

comma_category_projection_functor_morphism_of (m' o m) = comma_category_projection_functor_morphism_of m' o comma_category_projection_functor_morphism_of m
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

comma_category_induced_functor (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m)) = (comma_category_induced_functor m' o comma_category_induced_functor m)%functor
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

{HO : comma_category_induced_functor_object_of (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m)) = (fun c : CommaCategory.object (Overture.fst s) (Overture.snd s) => comma_category_induced_functor_object_of m' (comma_category_induced_functor_object_of m c)) & transport (fun GO : CommaCategory.object (Overture.fst s) (Overture.snd s) -> CommaCategory.object (Overture.fst d') (Overture.snd d') => forall s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s), CommaCategory.morphism s0 d0 -> CommaCategory.morphism (GO s0) (GO d0)) HO (comma_category_induced_functor_morphism_of (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m))) = (fun (s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s)) (m0 : CommaCategory.morphism s0 d0) => comma_category_induced_functor_morphism_of m' (comma_category_induced_functor_morphism_of m m0))}
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

{HO : comma_category_induced_functor_object_of (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m)) = (fun c : CommaCategory.object (Overture.fst s) (Overture.snd s) => comma_category_induced_functor_object_of m' (comma_category_induced_functor_object_of m c)) & transport (fun GO : CommaCategory.object (Overture.fst s) (Overture.snd s) -> CommaCategory.object (Overture.fst d') (Overture.snd d') => forall s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s), CommaCategory.morphism s0 d0 -> CommaCategory.morphism (GO s0) (GO d0)) HO (comma_category_induced_functor_morphism_of (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m))) = (fun (s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s)) (m0 : CommaCategory.morphism s0 d0) => comma_category_induced_functor_morphism_of m' (comma_category_induced_functor_morphism_of m m0))}
H: Funext
P: PreCategory -> Type
HF: forall C0 D : PreCategory, P C0 -> P D -> IsHSet (Functor C0 D)
A, B, C: PreCategory
PAB: P (A * B)
P_comma: forall (S : Functor A C) (T : Functor B C), P (S / T)
s, d, d': ((A -> C)^op * (B -> C))%category
m: morphism ((A -> C)^op * (B -> C)) s d
m': morphism ((A -> C)^op * (B -> C)) d d'

transport (fun GO : CommaCategory.object (Overture.fst s) (Overture.snd s) -> CommaCategory.object (Overture.fst d') (Overture.snd d') => forall s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s), CommaCategory.morphism s0 d0 -> CommaCategory.morphism (GO s0) (GO d0)) (path_forall (comma_category_induced_functor_object_of (m' o m)) (fun x : Overture.fst s / Overture.snd s => comma_category_induced_functor_object_of m' (comma_category_induced_functor_object_of m x)) (comma_category_induced_functor_object_of_compose m' m)) (comma_category_induced_functor_morphism_of (Core.compose (Overture.fst m) (Overture.fst m'), Core.compose (Overture.snd m') (Overture.snd m))) = (fun (s0 d0 : CommaCategory.object (Overture.fst s) (Overture.snd s)) (m0 : CommaCategory.morphism s0 d0) => comma_category_induced_functor_morphism_of m' (comma_category_induced_functor_morphism_of m m0))
comma_laws_t. Qed. Definition comma_category_projection_functor : Functor ((A -> C)^op * (B -> C)) (Cat / !((A * B; PAB) : Cat)) := Build_Functor ((A -> C)^op * (B -> C)) (Cat / !((A * B; PAB) : Cat)) comma_category_projection_functor_object_of comma_category_projection_functor_morphism_of comma_category_projection_functor_composition_of comma_category_projection_functor_identity_of. End comma. Section slice_category_projection_functor. Local Open Scope type_scope. Context `{Funext}. Variable P : PreCategory -> Type. Context `{HF : forall C D, P C -> P D -> IsHSet (Functor C D)}. Local Notation Cat := (@sub_pre_cat _ P HF). Variables C D : PreCategory. Hypothesis P1C : P (1 * C). Hypothesis PC1 : P (C * 1). Hypothesis PC : P C. Hypothesis P_comma : forall (S : Functor C D) (T : Functor 1 D), P (S / T). Hypothesis P_comma' : forall (S : Functor 1 D) (T : Functor C D), P (S / T). Local Open Scope functor_scope. Local Open Scope category_scope. Local Notation inv D := (@ExponentialLaws.Law1.Functors.inverse _ terminal_category _ _ _ D). (** ** Functor [(C โ†’ D)แต’แต– โ†’ D โ†’ (cat / C)] *)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op -> D -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op -> D -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op * D -> Cat / (C; PC))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((C -> D)^op * (1 -> D)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (Cat / !(C * 1; PC1)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

morphism Cat (C * 1; PC1) (C; PC)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (C * 1; PC1).1 (C; PC).1
exact (ProductLaws.Law1.functor _). Defined.
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op -> D -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op -> D -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D)^op * D -> Cat / (C; PC))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((C -> D)^op * (1 -> D)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (Cat / !(C * 1; PC1)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

morphism Cat (C * 1; PC1) (C; PC)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (C * 1; PC1).1 (C; PC).1
exact (ProductLaws.Law1.functor _). Defined. (** ** Functor [(C โ†’ D) โ†’ Dแต’แต– โ†’ (cat / C)] *)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) -> D^op -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) -> D^op -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) * D^op -> Cat / (C; PC))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((C -> D) * (1 -> D)^op) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((1 -> D)^op * (C -> D)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (Cat / !(1 * C; P1C)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

morphism Cat (1 * C; P1C) (C; PC)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (1 * C; P1C).1 (C; PC).1
exact (ProductLaws.Law1.functor' _). Defined.
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) -> D^op -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) -> D^op -> Cat / ((C; PC) : Cat))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

((C -> D) * D^op -> Cat / (C; PC))%category
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((C -> D) * (1 -> D)^op) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor ((1 -> D)^op * (C -> D)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (Cat / !(1 * C; P1C)) (Cat / (C; PC))
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

morphism Cat (1 * C; P1C) (C; PC)
H: Funext
P: PreCategory -> Type
HF: forall C0 D0 : PreCategory, P C0 -> P D0 -> IsHSet (Functor C0 D0)
C, D: PreCategory
P1C: P (1 * C)
PC1: P (C * 1)
PC: P C
P_comma: forall (S : Functor C D) (T : Functor 1 D), P (S / T)
P_comma': forall (S : Functor 1 D) (T : Functor C D), P (S / T)

Functor (1 * C; P1C).1 (C; PC).1
exact (ProductLaws.Law1.functor' _). Defined. End slice_category_projection_functor.