Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
(** * Groupoids *)Require Import Category.Morphisms Category.Strict.Require Import Trunc PathGroupoids Basics.Tactics.Set Implicit Arguments.Generalizable All Variables.LocalOpen Scope category_scope.(** A groupoid is a precategory where every morphism is an isomorphism. Since 1-types are 1-groupoids, we can construct the category corresponding to the 1-groupoid of a 1-type. *)(** ** Definition of what it means to be a groupoid *)ClassIsGroupoid (C : PreCategory)
:= isgroupoid : forallsd (m : morphism C s d),
IsIsomorphism m.Instancetrunc_isgroupoid `{Funext} C : IsHProp (IsGroupoid C)
:= istrunc_forall.(** We don't want access to all of the internals of a groupoid category at top level. *)ModuleGroupoidCategoryInternals.Sectiongroupoid_category.VariableX : Type.Context `{IsTrunc 1 X}.Local Notationmorphism := (@paths X).Definitioncomposesdd' (m : morphism d d') (m' : morphism s d)
: morphism s d'
:= transitivity m' m.Definitionidentityx : morphism x x
:= reflexivity _.GlobalArguments compose [s d d'] m m' / .GlobalArguments identity x / .Endgroupoid_category.EndGroupoidCategoryInternals.(** ** Categorification of the groupoid of a 1-type *)
X: Type IsTrunc0: IsTrunc 1 X
PreCategory
X: Type IsTrunc0: IsTrunc 1 X
PreCategory
refine (@Build_PreCategory X
(@paths X)
(@GroupoidCategoryInternals.identity X)
(@GroupoidCategoryInternals.compose X)
_
_
_
_);
simpl; intros; path_induction; reflexivity.Defined.Arguments groupoid_category X {_}.
X: Type IsTrunc0: IsTrunc 1 X
IsGroupoid (groupoid_category X)
X: Type IsTrunc0: IsTrunc 1 X
IsGroupoid (groupoid_category X)
X: Type IsTrunc0: IsTrunc 1 X s, d: X m: s = d
IsIsomorphism m
exact (Build_IsIsomorphism
(groupoid_category X)
s d
m m^%path
(concat_pV m)
(concat_Vp m)).Defined.(** ** 0-types give rise to strict (groupoid) categories *)