End NatTrans.
Arguments Trans {_ _ _ _} _ _.
Arguments Trans_com {_ _ _ _} _ {_ _} _.
Arguments Trans_com_sym {_ _ _ _} _ {_ _} _.
Bind Scope nattrans_scope with NatTrans.
Notation "F –≻ F'" := (NatTrans F F') : nattrans_scope.
Local Open Scope nattrans_scope.
Section NatTrans_Compose.
Context {C C' : Category}.
(** Natural transformations are composable. The arrow family of the result is just the composition of corresponding components in each natural transformation. Graphically: # <pre> F                            F C ———————————————–> D        C ———————————————–> D ||                           || ||N                          || ||                           || \/                           || C ———————————————–> D                || N' ∘ N G                              || ||                           || ||N'                         || ||                           || \/                           \/ C ———————————————–> D        C ———————————————–> D H                            H </pre> #  This kind of composition is sometimes also called vertical composition of natural transformations. *)
Program Definition NatTrans_compose {F F' F'' : (C –≻ C')%functor}
(tr : F –≻ F') (tr' : F' –≻ F'') : (F –≻ F'')%nattrans :=
{|
Trans := fun c : Obj => ((Trans tr' c) ∘ (Trans tr c)) % morphism
|}.
Next Obligation. (* Trans_com*)
Next Obligation. (* Trans_com_sym *)
End NatTrans_Compose.
Notation "N ∘ N'" := (NatTrans_compose N' N) : nattrans_scope.
Section NatTrans_Props.
Context {C C' : Category}.

(* Specifications: *)
(** The composition of natural transformations is associative. *)
Theorem NatTrans_compose_assoc {F G H I : (C –≻ C')%functor} (N : F –≻ G)
(N' : G –≻ H) (N'' : H –≻ I)
: ((N'' ∘ N') ∘ N = N'' ∘ (N' ∘ N))%nattrans
.