Section ua_laws.
Variable diese : forall a' : A, (b --> G a') -> (a --> a').
Definition UA_eq (a' : A) (f : b --> G a') (g : a --> a') :=
u o FMor G g =_S f.
Definition UA_law1 := forall (a' : A) (f : b --> G a'), UA_eq f (diese f).
Definition UA_law2 :=
forall (a' : A) (f : b --> G a') (g : a --> a'),
UA_eq f g -> g =_S diese f.
End ua_laws.
Structure IsUA : Type :=
{UA_diese : forall a' : A, (b --> G a') -> (a --> a');
Prf_isUA_law1 : UA_law1 UA_diese;
Prf_isUA_law2 : UA_law2 UA_diese}.
Variable t : IsUA.
(* f=g => f# = g# *)
End isua_def.
Structure > UA : Type :=
{UA_ob : A; UA_mor : b --> G UA_ob; Prf_IsUA :> IsUA UA_mor}.
(*** rewrite rules ***)

Lemma UA_diag :
forall (u : UA) (a' : A) (f : b --> G a'),
UA_mor u o FMor G (UA_diese u f) =_S f.