fact: Definition f_adjoint a : fg_id' (f a) = f_equal f (gf_id a) := let symmetric_eq : eq_trans (f_equal f (gf_id (g (f a)))) (fg_id (f a)) = eq_trans (fg_id (f (g (f a)))) (f_equal f (gf_id a)) := eq_trans (eq_trans (f_equal (fun H => eq_trans (f_equal f H) (fg_id (f a))) (eq_sym (eq_id_comm_r _ gf_id a))) (f_equal (fun p => eq_trans p _) (eq_trans (f_equal_compose (fun a => g (f a)) f _) (eq_sym (f_equal_compose f (fun b => f (g b)) _))))) (eq_sym (commute_homotopy_id fg_id (f_equal f (gf_id a)))) in match fg_id (f (g (f a))) as p return forall p', _ = eq_trans p p' -> eq_trans (eq_sym p) _ = p' with eq_refl => fun p' eq => eq_trans (eq_trans_refl_l _) (eq_trans eq (eq_trans_refl_l _)) end _ symmetric_eq.