Functor.Representable.Hom_Func_Prop.
Local Open Scope functor_scope.
(** Local notations for simplification. *)
Local Notation NID := NatTrans_id (only parsing).
Local Notation FCAT := Func_Cat (only parsing).
(** This module contains different definitions of adjunctions and their conversion. *)
(** The left hand side of the isomorphism for adjunctions defined through hom functor. *)
Notation Hom_Adj_Left C D F G :=
((Hom_Func D) ∘ (Prod_Functor (F^op) (@Functor_id D)))%functor (only parsing).
(* The right hand side of the isomorphism for adjunctions defined through hom functor. *)
Notation Hom_Adj_Right C D F G :=
((Hom_Func C) ∘ (Prod_Functor (@Functor_id (C^op)) G))%functor (only parsing).
Local Obligation Tactic := idtac.
Section Adjunction.
Context {C D : Category} (F : C –≻ D) (G : D –≻ C).
(** This is the definition of adjunctions taken as them main definition in this development.  Functor F : C -> D is the left adjoint to functor G : D -> C if there is a natural transformation η : (Functor_id C) -> (G ∘ F) and for any arrow f : c -> (G _o d) there is a unique arrow f̂f^: (F _o c) d such that the following diagram commutes:  # <pre>  f c —————————–> (G _o d) |               ↗ |             / η_c |           /  G _a  f^ |         / ↓       / (G _o (F _o c))  </pre> # *)
Record Adjunct : Type :=
{
adj_unit : ((Functor_id C) –≻ (G ∘ F))%nattrans;
adj_morph_ex {c : C} {d : D} (f : (c –≻ (G _o d)%object)%morphism) :
((F _o c)%object –≻ d)%morphism;
adj_morph_com {c : C} {d : D} (f : (c –≻ (G _o d))%morphism%object) :
f = ((G _a (adj_morph_ex f)) ∘ (Trans adj_unit c))%morphism;
adj_morph_unique {c : C} {d : D} (f : (c –≻ (G _o d))%object%morphism)
(g h : ((F _o c) –≻ d)%morphism%object) :
f = ((G _a g) ∘ (Trans adj_unit c))%morphism →
f = ((G _a h) ∘ (Trans adj_unit c))%morphism →
g = h
}.
Arguments adj_unit : clear implicits.
Arguments adj_morph_ex _ {_ _} _.
Arguments adj_morph_com _ {_ _} _.
Arguments adj_morph_unique _ {_ _} _ _ _ _ _.

(* Specifications: *)
Theorem Adjunct_eq_simplify (adj adj' : Adjunct) :
adj_unit adj = @adj_unit adj' →
@adj_morph_ex adj = @adj_morph_ex adj' → adj = adj'.