/caterwaul/Leibniz/groupoid
Copy path to clipboardLeibniz equality forms a groupoid, with
- unit = reflexivity,
- product = transitivity, and
- inverse = symmetry.
FIXME: The implementation of inverse
forces the target of the functor to
be the enriching category. I donβt know if this is fundamentally required, or
just a consequence of the common formulations being where everything is πππ.
Source
{-|
Leibniz equality forms a groupoid, with
- unit = reflexivity,
- product = transitivity, and
- inverse = symmetry.
**FIXME**: The implementation of `inverse` forces the target of the functor to
be the enriching category. I donβt know if this is fundamentally required, or
just a consequence of the common formulations being where everything is πππ.
-}
let cat = ../Category/Cat/semigroupal
let vObject = Type
let v =
../Category/Monoidal/Cartesian/extractMonoidal
cat
Type
vObject
../Category/Set/monoidal/cartesian
in Ξ»(cObject : Kind) β
Ξ»(c : ../Category/Kind cat vObject cObject) β
let dObject = vObject
let d = ../Category/Monoidal/extractCategory cat Type dObject v
in Ξ»(dCategory : ../Category/Type dObject v d) β
let Leibniz = ./Kind cObject dObject c d
let refl =
Ξ»(a : cObject) β
Ξ»(f : cat.arrow cObject dObject) β
dCategory.unit (f a)
let trans =
Ξ»(a : { _1 : cObject, _2 : cObject }) β
Ξ» ( p
: β(r : Type) β
( β(z : cObject) β
Leibniz.arrow { _1 = z, _2 = a._2 } β
Leibniz.arrow { _1 = a._1, _2 = z } β
r
) β
r
) β
Ξ»(f : cat.arrow cObject dObject) β
dCategory.product
{ _1 = f a._1, _2 = f a._2 }
( Ξ»(r : Type) β
Ξ» ( arrowsOut
: β(z : dObject) β
d.arrow { _1 = z, _2 = f a._2 } β
d.arrow { _1 = f a._1, _2 = z } β
r
) β
p
r
( Ξ»(z : cObject) β
Ξ»(g : Leibniz.arrow { _1 = z, _2 = a._2 }) β
Ξ»(h : Leibniz.arrow { _1 = a._1, _2 = z }) β
arrowsOut (f z) (g f) (h f)
)
)
in { unit = refl
, product = trans
, hom.map
=
Ξ»(a : cat.product cObject cObject) β
Ξ»(b : cat.product cObject cObject) β
Ξ» ( f
: v.product
{ _1 = Leibniz.arrow { _1 = b._1, _2 = a._1 }
, _2 = Leibniz.arrow { _1 = a._2, _2 = b._2 }
}
) β
Ξ»(fn : Leibniz.arrow a) β
trans
{ _1 = b._1, _2 = b._2 }
( Ξ»(r : Type) β
Ξ» ( arrowsOut
: β(z : cObject) β
Leibniz.arrow { _1 = z, _2 = b._2 } β
Leibniz.arrow { _1 = b._1, _2 = z } β
r
) β
arrowsOut
a._1
( trans
{ _1 = a._1, _2 = b._2 }
( Ξ»(r : Type) β
Ξ» ( arrowsOut
: β(z : cObject) β
Leibniz.arrow { _1 = z, _2 = b._2 } β
Leibniz.arrow { _1 = a._1, _2 = z } β
r
) β
arrowsOut a._2 f._2 fn
)
)
f._1
)
, inverse =
Ξ»(a : cat.product cObject cObject) β
Ξ»(subst : Leibniz.arrow a) β
subst
(Ξ»(x : cObject) β Leibniz.arrow { _1 = x, _2 = a._1 })
(refl a._1)
}
: ../Groupoid/Type cObject v Leibniz