\import Algebra.Group
\import Algebra.Monoid
\import Category
\import Paths
\import Set
\instance Aut {A : \Type} (a : A) : Group (Trunc0 (a = a))
| ide => in0 idp
| * p q => \case \elim p \with {
| in0 p' => Trunc0.map q \lam q' => p' *> q'
}
| ide-left {x} => \case \elim x \with {
| in0 a1 => pmap in0 (idp_*> a1)
}
| *-assoc {x} {y} {z} => \case \elim x, \elim y, \elim z \with {
| in0 a1, in0 a2, in0 a3 => pmap in0 (*>-assoc a1 a2 a3)
}
| inverse x => Trunc0.map x inv
| inverse-left {x} => \case \elim x \with{
| in0 a1 => pmap in0 (inv_*> a1)
}
\func End {C : Precat} (c : C) : Monoid (Hom c c) \cowith
| ide => id c
| * => ∘
| ide-left => id-left
| ide-right => id-right
| *-assoc => o-assoc