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.
Require Import Category.Core Functor.Core NaturalTransformation.Core.Require Import Category.Core Functor.Core NaturalTransformation.Core.
Require Import Functor.Composition.Core.
Require Import NaturalTransformation.Paths NaturalTransformation.Composition.Core.
Require Import Category.Morphisms FunctorCategory.Core.
Require Import Pseudofunctor.Core.
Require Import NaturalTransformation.Composition.Laws.
Require Import Trunc Types.Sigma.
Require Import Basics.Tactics.

Import Functor.Identity.FunctorIdentityNotations.

Set Implicit Arguments.
Generalizable All Variables.
Local Open Scope morphism_scope.
Local Open Scope category_scope.
Local Open Scope type_scope.

(** Quoting David Spivak:

    David: ok
       so an object of [FC ⇓ D] is a pair [(X, G)], where [X] is a
       finite category (or a small category or whatever you wanted)
       and [G : X --> D] is a functor.
       a morphism in [FC ⇓ D] is a ``natural transformation diagram''
       (as opposed to a commutative diagram, in which the natural
       transformation would be ``identity'')
       so a map in [FC ⇓ D] from [(X, G)] to [(X', G')] is a pair
       [(F, α)] where [F : X --> X'] is a functor and
       [α : G --> G' ∘ F] is a natural transformation
       and the punchline is that there is a functor
       [colim : FC ⇓ D --> D]

     David: consider for yourself the case where [F : X --> X'] is
       identity ([X = X']) and (separately) the case where
       [α : G --> G ∘ F] is identity.
       the point is, you've already done the work to get this colim
       functor.
       because every map in [FC ⇓ D] can be written as a composition
       of two maps, one where the [F]-part is identity and one where
       the [α]-part is identity.
       and you've worked both of those cases out already.
       *)

Module Import LaxCommaCategoryParts.
  Section lax_comma_category_parts.
    Context `{Funext}.
    Variables A B : PreCategory.

    Variable S : Pseudofunctor A.
    Variable T : Pseudofunctor B.

    Context `{forall a b, IsHSet (Functor (S a) (T b))}.

    Record object :=
      {
        a : A;
        b : B;
        f : Functor (S a) (T b)
      }.

    Local Notation object_sig_T :=
      ({ a : A
       | { b : B
         | Functor (S a) (T b) }}).

    
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))

{a0 : A & {b0 : B & Functor (S a0) (T b0)}} <~> object
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))

{a0 : A & {b0 : B & Functor (S a0) (T b0)}} <~> object
issig. Defined.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
n: trunc_index
IsTrunc0: IsTrunc n A
IsTrunc1: IsTrunc n B
H1: forall (s : A) (d : B), IsTrunc n (Functor (S s) (T d))

IsTrunc n object
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
n: trunc_index
IsTrunc0: IsTrunc n A
IsTrunc1: IsTrunc n B
H1: forall (s : A) (d : B), IsTrunc n (Functor (S s) (T d))

IsTrunc n object
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
n: trunc_index
IsTrunc0: IsTrunc n A
IsTrunc1: IsTrunc n B
H1: forall (s : A) (d : B), IsTrunc n (Functor (S s) (T d))

IsTrunc n {a0 : A & {b0 : B & Functor (S a0) (T b0)}}
typeclasses eauto. Qed.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object

forall (Ha : a x = a y) (Hb : b x = b y), match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y -> x = y
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object

forall (Ha : a x = a y) (Hb : b x = b y), match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y -> x = y
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a2 : A) (b2 : B), IsHSet (Functor (S a2) (T b2))
a0: A
b0: B
f0: Functor (S a0) (T b0)
a1: A
b1: B
f1: Functor (S a1) (T b1)

forall (Ha : a0 = a1) (Hb : b0 = b1), match Ha in (_ = X) return (Functor (S X) (T b1)) with | 1%path => match Hb in (_ = Y) return (Functor (S a0) (T Y)) with | 1%path => f0 end end = f1 -> {| a := a0; b := b0; f := f0 |} = {| a := a1; b := b1; f := f1 |}
intros; path_induction; reflexivity. Defined. Definition path_object_uncurried x y (H : { HaHb : (x.(a) = y.(a)) * (x.(b) = y.(b)) | match fst HaHb in _ = X, snd HaHb in _ = Y return Functor (S X) (T Y) with | idpath, idpath => x.(f) end = y.(f) }) : x = y := @path_object x y (fst H.1) (snd H.1) H.2.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object
Ha: a x = a y
Hb: b x = b y
Hf: match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y

ap a (path_object x y Ha Hb Hf) = Ha
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object
Ha: a x = a y
Hb: b x = b y
Hf: match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y

ap a (path_object x y Ha Hb Hf) = Ha
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a2 : A) (b2 : B), IsHSet (Functor (S a2) (T b2))
a0: A
b0: B
f0: Functor (S a0) (T b0)
a1: A
b1: B
f1: Functor (S a1) (T b1)
Ha: a0 = a1
Hb: b0 = b1
Hf: match Ha in (_ = X) return (Functor (S X) (T b1)) with | 1%path => match Hb in (_ = Y) return (Functor (S a0) (T Y)) with | 1%path => f0 end end = f1

ap a (path_object {| a := a0; b := b0; f := f0 |} {| a := a1; b := b1; f := f1 |} Ha Hb Hf) = Ha
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a1 : A) (b1 : B), IsHSet (Functor (S a1) (T b1))
a0: A
b0: B
f0: Functor (S a0) (T b0)

1%path = 1%path
reflexivity. Qed.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object
Ha: a x = a y
Hb: b x = b y
Hf: match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y

ap b (path_object x y Ha Hb Hf) = Hb
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x, y: object
Ha: a x = a y
Hb: b x = b y
Hf: match Ha in (_ = X) return (Functor (S X) (T (b y))) with | 1%path => match Hb in (_ = Y) return (Functor (S (a x)) (T Y)) with | 1%path => f x end end = f y

ap b (path_object x y Ha Hb Hf) = Hb
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a2 : A) (b2 : B), IsHSet (Functor (S a2) (T b2))
a0: A
b0: B
f0: Functor (S a0) (T b0)
a1: A
b1: B
f1: Functor (S a1) (T b1)
Ha: a0 = a1
Hb: b0 = b1
Hf: match Ha in (_ = X) return (Functor (S X) (T b1)) with | 1%path => match Hb in (_ = Y) return (Functor (S a0) (T Y)) with | 1%path => f0 end end = f1

ap b (path_object {| a := a0; b := b0; f := f0 |} {| a := a1; b := b1; f := f1 |} Ha Hb Hf) = Hb
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a1 : A) (b1 : B), IsHSet (Functor (S a1) (T b1))
a0: A
b0: B
f0: Functor (S a0) (T b0)

1%path = 1%path
reflexivity. Qed. Global Opaque path_object. Record morphism (abf a'b'f' : object) := { g : Category.Core.morphism A (abf.(a)) (a'b'f'.(a)); h : Category.Core.morphism B (abf.(b)) (a'b'f'.(b)); p : NaturalTransformation (p_morphism_of T h o abf.(f)) (a'b'f'.(f) o p_morphism_of S g) }. Local Notation morphism_sig_T abf a'b'f' := ({ g : Category.Core.morphism A (abf.(a)) (a'b'f'.(a)) | { h : Category.Core.morphism B (abf.(b)) (a'b'f'.(b)) | NaturalTransformation (p_morphism_of T h o abf.(f)) (a'b'f'.(f) o p_morphism_of S g) }}).
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object

morphism_sig_T abf a'b'f' <~> morphism abf a'b'f'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object

morphism_sig_T abf a'b'f' <~> morphism abf a'b'f'
issig. Defined.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
n: trunc_index
IsTrunc0: IsTrunc n (Core.morphism A (a abf) (a a'b'f'))
IsTrunc1: IsTrunc n (Core.morphism B (b abf) (b a'b'f'))
H1: forall (m1 : Core.morphism A (a abf) (a a'b'f')) (m2 : Core.morphism B (b abf) (b a'b'f')), IsTrunc n (NaturalTransformation (p_morphism_of T m2 o f abf) (f a'b'f' o p_morphism_of S m1))

IsTrunc n (morphism abf a'b'f')
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
n: trunc_index
IsTrunc0: IsTrunc n (Core.morphism A (a abf) (a a'b'f'))
IsTrunc1: IsTrunc n (Core.morphism B (b abf) (b a'b'f'))
H1: forall (m1 : Core.morphism A (a abf) (a a'b'f')) (m2 : Core.morphism B (b abf) (b a'b'f')), IsTrunc n (NaturalTransformation (p_morphism_of T m2 o f abf) (f a'b'f' o p_morphism_of S m1))

IsTrunc n (morphism abf a'b'f')
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
n: trunc_index
IsTrunc0: IsTrunc n (Core.morphism A (a abf) (a a'b'f'))
IsTrunc1: IsTrunc n (Core.morphism B (b abf) (b a'b'f'))
H1: forall (m1 : Core.morphism A (a abf) (a a'b'f')) (m2 : Core.morphism B (b abf) (b a'b'f')), IsTrunc n (NaturalTransformation (p_morphism_of T m2 o f abf) (f a'b'f' o p_morphism_of S m1))

IsTrunc n (morphism_sig_T abf a'b'f')
typeclasses eauto. Qed.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'

forall (Hg : g gh = g g'h') (Hh : h gh = h g'h'), match Hg in (_ = g) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g)) with | 1%path => match Hh in (_ = h) return (NaturalTransformation (p_morphism_of T h o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h' -> gh = g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'

forall (Hg : g gh = g g'h') (Hh : h gh = h g'h'), match Hg in (_ = g) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g)) with | 1%path => match Hh in (_ = h) return (NaturalTransformation (p_morphism_of T h o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h' -> gh = g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'
Hg: g gh = g g'h'
Hh: h gh = h g'h'
Hp: match Hg in (_ = g0) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g0)) with | 1%path => match Hh in (_ = h0) return (NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h'

gh = g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
g0: Core.morphism A (a abf) (a a'b'f')
h0: Core.morphism B (b abf) (b a'b'f')
p0: NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S g0)
g1: Core.morphism A (a abf) (a a'b'f')
h1: Core.morphism B (b abf) (b a'b'f')
p1: NaturalTransformation (p_morphism_of T h1 o f abf) (f a'b'f' o p_morphism_of S g1)
Hg: g0 = g1
Hh: h0 = h1
Hp: match Hg in (_ = g2) return (NaturalTransformation (p_morphism_of T h1 o f abf) (f a'b'f' o p_morphism_of S g2)) with | 1%path => match Hh in (_ = h2) return (NaturalTransformation (p_morphism_of T h2 o f abf) (f a'b'f' o p_morphism_of S g0)) with | 1%path => p0 end end = p1

{| g := g0; h := h0; p := p0 |} = {| g := g1; h := h1; p := p1 |}
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
g0: Core.morphism A (a abf) (a a'b'f')
h0: Core.morphism B (b abf) (b a'b'f')
p0: NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S g0)

{| g := g0; h := h0; p := p0 |} = {| g := g0; h := h0; p := p0 |}
reflexivity. Qed. Definition path_morphism_uncurried abf a'b'f' gh g'h' (H : { HgHh : (gh.(g) = g'h'.(g)) * (gh.(h) = g'h'.(h)) | match fst HgHh in _ = g, snd HgHh in _ = h return NaturalTransformation (p_morphism_of T h o abf.(f)) (a'b'f'.(f) o p_morphism_of S g) with | idpath, idpath => gh.(p) end = g'h'.(p) }) : gh = g'h' := @path_morphism abf a'b'f' gh g'h' (fst H.1) (snd H.1) H.2.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'

forall (Hg : g gh = g g'h') (Hh : h gh = h g'h'), (f a'b'f' oL (idtoiso (S (a abf) -> S (a a'b'f')) (ap (p_morphism_of S) Hg) : Core.morphism (S (a abf) -> S (a a'b'f')) (p_morphism_of S (g gh)) (p_morphism_of S (g g'h'))) o p gh o ((idtoiso (T (b abf) -> T (b a'b'f')) (ap (p_morphism_of T) Hh))^-1 oR f abf))%natural_transformation = p g'h' -> match Hg in (_ = g0) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g0)) with | 1%path => match Hh in (_ = h0) return (NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'

forall (Hg : g gh = g g'h') (Hh : h gh = h g'h'), (f a'b'f' oL (idtoiso (S (a abf) -> S (a a'b'f')) (ap (p_morphism_of S) Hg) : Core.morphism (S (a abf) -> S (a a'b'f')) (p_morphism_of S (g gh)) (p_morphism_of S (g g'h'))) o p gh o ((idtoiso (T (b abf) -> T (b a'b'f')) (ap (p_morphism_of T) Hh))^-1 oR f abf))%natural_transformation = p g'h' -> match Hg in (_ = g0) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g0)) with | 1%path => match Hh in (_ = h0) return (NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh, g'h': morphism abf a'b'f'
Hg: g gh = g g'h'
Hh: h gh = h g'h'
Hp: (f a'b'f' oL idtoiso (S (a abf) -> S (a a'b'f')) (ap (p_morphism_of S) Hg) o p gh o ((idtoiso (T (b abf) -> T (b a'b'f')) (ap (p_morphism_of T) Hh))^-1 oR f abf))%natural_transformation = p g'h'

match Hg in (_ = g0) return (NaturalTransformation (p_morphism_of T (h g'h') o f abf) (f a'b'f' o p_morphism_of S g0)) with | 1%path => match Hh in (_ = h0) return (NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p g'h'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh: morphism abf a'b'f'
g0: Core.morphism A (a abf) (a a'b'f')
h0: Core.morphism B (b abf) (b a'b'f')
p0: NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S g0)
Hg: g gh = g0
Hh: h gh = h0
Hp: (f a'b'f' oL idtoiso (S (a abf) -> S (a a'b'f')) (ap (p_morphism_of S) Hg) o p gh o ((idtoiso (T (b abf) -> T (b a'b'f')) (ap (p_morphism_of T) Hh))^-1 oR f abf))%natural_transformation = p0

match Hg in (_ = g1) return (NaturalTransformation (p_morphism_of T h0 o f abf) (f a'b'f' o p_morphism_of S g1)) with | 1%path => match Hh in (_ = h1) return (NaturalTransformation (p_morphism_of T h1 o f abf) (f a'b'f' o p_morphism_of S (g gh))) with | 1%path => p gh end end = p0
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh: morphism abf a'b'f'

p gh = (f a'b'f' oL NaturalTransformation.Identity.identity (p_morphism_of S (g gh)) o p gh o (NaturalTransformation.Identity.identity (p_morphism_of T (h gh)) oR f abf))%natural_transformation
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh: morphism abf a'b'f'
x: S (a abf)

p gh x = (f a'b'f') _1 1 o p gh x o 1
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
abf, a'b'f': object
gh: morphism abf a'b'f'
x: S (a abf)

p gh x = p gh x
reflexivity. Qed. Definition path_morphism' abf a'b'f' (gh g'h' : morphism abf a'b'f') (Hg : gh.(g) = g'h'.(g)) (Hh : gh.(h) = g'h'.(h)) (Hp : ((_ oL (Category.Morphisms.idtoiso (_ -> _) (ap (@p_morphism_of _ _ S _ _) Hg) : Category.Core.morphism _ _ _)) o (gh.(p)) o ((Category.Morphisms.idtoiso (_ -> _) (ap (@p_morphism_of _ _ T _ _) Hh) : Category.Core.morphism _ _ _)^-1 oR _) = g'h'.(p))%natural_transformation) : gh = g'h' := @path_morphism abf a'b'f' gh g'h' Hg Hh (@path_morphism'_helper abf a'b'f' gh g'h' Hg Hh Hp). Definition path_morphism'_uncurried abf a'b'f' gh g'h' (H : { HgHh : (gh.(g) = g'h'.(g)) * (gh.(h) = g'h'.(h)) | ((_ oL (Category.Morphisms.idtoiso (_ -> _) (ap (@p_morphism_of _ _ S _ _) (fst HgHh)) : Category.Core.morphism _ _ _)) o (gh.(p)) o ((Category.Morphisms.idtoiso (_ -> _) (ap (@p_morphism_of _ _ T _ _) (snd HgHh)) : Category.Core.morphism _ _ _)^-1 oR _) = g'h'.(p))%natural_transformation }) : gh = g'h' := @path_morphism' abf a'b'f' gh g'h' (fst H.1) (snd H.1) H.2.
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
s, d, d': object
gh: morphism d d'
g'h': morphism s d

morphism s d'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
s, d, d': object
gh: morphism d d'
g'h': morphism s d

morphism s d'
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
s, d, d': object
gh: morphism d d'
g'h': morphism s d

NaturalTransformation (p_morphism_of T (h gh o h g'h') o f s) (f d' o p_morphism_of S (g gh o g g'h'))
exact ((_ oL (p_composition_of S _ _ _ _ _)^-1) o (associator_1 _ _ _) o (gh.(p) oR _) o (associator_2 _ _ _) o (_ oL g'h'.(p)) o (associator_1 _ _ _) o ((p_composition_of T _ _ _ _ _ : Category.Core.morphism _ _ _) oR _))%natural_transformation. Defined. Global Arguments compose _ _ _ _ _ / .
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x: object

morphism x x
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x: object

morphism x x
H: Funext
A, B: PreCategory
S: Pseudofunctor A
T: Pseudofunctor B
H0: forall (a0 : A) (b0 : B), IsHSet (Functor (S a0) (T b0))
x: object

NaturalTransformation (p_morphism_of T 1 o f x) (f x o p_morphism_of S 1)
exact ((_ oL (p_identity_of S _ : Category.Core.morphism _ _ _)^-1) o (right_identity_natural_transformation_2 _) o (left_identity_natural_transformation_1 _) o ((p_identity_of T _ : Category.Core.morphism _ _ _) oR _))%natural_transformation. Defined. Global Arguments identity _ / . End lax_comma_category_parts. End LaxCommaCategoryParts.