using Gatlab
@theory Groupoid <: ThEmpty begin
Ob :: TYPE
Hom(dom, codom) :: TYPE ⊣ [dom::Ob, codom::Ob]
id(a) :: Hom(a, a) ⊣ [a::Ob]
(f ⋅ g) :: Hom(a, c) ⊣ [a::Ob, b::Ob, c::Ob, f::Hom(a,b), g::Hom(b,c)]
inv(f) :: Hom(b,a) ⊣ [a::Ob, b::Ob, f::Hom(a,b)]
assoc := ((f ⋅ g) ⋅ h) == (f ⋅ (g ⋅ h)) :: Hom(a,d) ⊣ [a::Ob, b::Ob, c::Ob, d::Ob, f::Hom(a,b), g::Hom(b,c), h::Hom(c,d)]
idl := id(a) ⋅ f == f :: Hom(a,b) ⊣ [a::Ob, b::Ob, f::Hom(a,b)]
idr := f ⋅ id(b) == f :: Hom(a,b) ⊣ [a::Ob, b::Ob, f::Hom(a,b)]
linv := inv(f) ⋅ f == id(b) :: Hom(b,b) ⊣ [a::Ob, b::Ob, f::Hom(a,b)]
rinv := f ⋅ inv(f) == id(a) :: Hom(a,a) ⊣ [a::Ob, b::Ob, f::Hom(a,b)]
end
gettheory(Groupoid) # hide
############
# Groupoid #
############
Type Constructors
=================
----------- Ob introduction
Ob : TYPE
(dom,codom):Ob
----------------------- Hom introduction
Hom(dom,codom) : TYPE
Term Constructors
=================
a:Ob
------------------ id introduction
id(a) : Hom(a,a)
(a,b,c):Ob | f:Hom(a,b) | g:Hom(b,c)
-------------------------------------- ⋅ introduction
(f ⋅ g) : Hom(a,c)
(a,b):Ob | f:Hom(a,b)
----------------------- inv introduction
inv(f) : Hom(b,a)
Axioms
======
(a,b,c,d):Ob | f:Hom(a,b) | g:Hom(b,c) | h:Hom(c,d)
----------------------------------------------------- assoc
((f ⋅ g) ⋅ h) = (f ⋅ (g ⋅ h)) : Hom(a,d)
(a,b):Ob | f:Hom(a,b)
---------------------------- idl
(id(a) ⋅ f) = f : Hom(a,b)
(a,b):Ob | f:Hom(a,b)
---------------------------- idr
(f ⋅ id(b)) = f : Hom(a,b)
(a,b):Ob | f:Hom(a,b)
--------------------------------- linv
(inv(f) ⋅ f) = id(b) : Hom(b,b)
(a,b):Ob | f:Hom(a,b)
--------------------------------- rinv
(f ⋅ inv(f)) = id(a) : Hom(a,a)