if not IsSinglePiece( bdg ) then
Error( "only working with single pieces so far" ); fi;
gpd := bdg!.groupoid;
obs := bdg!.objects;
gp := RootGroup( gpd );
px := XModByNormalSubgroup( gp, gp );
dgpd := SinglePieceDoubleGroupoid( gpd, px );
return dgpd; end );
InstallMethod( DoubleGroupoidWithZeroBoundary, "for a groupoid and a group",
true, [ IsGroupoid, IsGroup ], 0, function( gpd, src )
local gp, px, dgpd;
if not IsSinglePiece( gpd ) then
Error( "only working with single pieces so far" ); fi;
gp := RootGroup( gpd );
px := PreXModWithTrivialRange( src, gp );
dgpd := SinglePieceDoubleGroupoid( gpd, px );
return dgpd; end );
InstallMethod( ViewObj, "for a double groupoid with prexmod", true,
[ IsDoubleGroupoidWithPreXMod and IsSinglePiece ], 0, function( dgpd )
local pxm, isxmod;
pxm := dgpd!.prexmod;
isxmod := HasIsXMod( pxm ) and IsXMod( pxm );
Print( "single piece double groupoid with:\n" ); if isxmod then
Print( " xmod = ", pxm, "\n" ); else
Print( " prexmod = ", pxm, "\n" ); fi;
Print( " groupoid = ", dgpd!.groupoid, "\n" );
Print( " group = ", dgpd!.groupoid!.magma, "\n" );
Print( " objects = ", dgpd!.objects ); end );
InstallMethod( PrintObj, "for a double groupoid with prexmod", true,
[ IsDoubleGroupoidWithPreXMod and IsSinglePiece ], 0, function( dgpd )
local pxm, isxmod;
pxm := dgpd!.prexmod;
isxmod := HasIsXMod( pxm ) and IsXMod( pxm );
Print( "single piece double groupoid with:\n" ); if isxmod then
Print( " xmod = ", pxm, "\n" ); else
Print( " prexmod = ", pxm, "\n" ); fi;
Print( " groupoid = ", dgpd!.groupoid, "\n" );
Print( " group = ", dgpd!.groupoid!.magma, "\n" );
Print( " objects = ", dgpd!.objects, "\n" ); end );
InstallMethod( SquareOfArrows, "for double groupoid with objects, element, up, left, right and down",
true, [ IsDoubleGroupoid, IsMultiplicativeElement,
IsObject, IsObject, IsObject, IsObject ], 0, function( dgpd, e, u, l, r, d )
local gpd, px, bdy, ime, ok, piece, loop, sq;
gpd := dgpd!.groupoid;
px := dgpd!.prexmod;
bdy := Boundary( px );
ime := ImageElm( bdy, e );
ok := ForAll( [u,l,r,d], x -> x in gpd )
and ( TailOfArrow( u ) = TailOfArrow( l ) )
and ( HeadOfArrow( u ) = TailOfArrow( r ) )
and ( HeadOfArrow( l ) = TailOfArrow( d ) )
and ( HeadOfArrow( r ) = HeadOfArrow( d ) ); if not ok then
Info( InfoXMod, 1, "the four arrows do not form a square" );
return fail; else if IsSinglePiece( gpd ) then
piece := dgpd; else
piece := PieceOfObject( gpd, TailOfArrow( d ) ); fi;
loop := d^-1 * l^-1 * u * r;
ok := ( ime = loop![2] ); if not ok then
Info( InfoXMod, 1, "element ", e, " has image ", ime, " <> boundary element ", loop![2] );
return fail; fi;
sq := SquareOfArrowsNC( dgpd, e, u, l, r, d );
return sq; fi; end );
############################################################################# ## #M VerticalProduct( s1, s2 ) ## . . . . . . . vertical composition of squares in a basic double groupoid ##
InstallMethod( VerticalProduct, "for two squares in a basic double groupoid",
true, [ IsDoubleGroupoidElement, IsDoubleGroupoidElement], 0, function( s1, s2 )
local dgpd, m, px, act, aut;
## elements are composable? if not ( s1![6] = s2![3] ) then
Info( InfoXMod, 1, "down arrow of s1 <> up arrow of s2" );
return fail; fi; if not ( s1![1] = s2![1] ) then
Info( InfoXMod, 1, "s1 and s2 are in different double groupoids" );
return fail; fi;
dgpd := s1![1];
px := dgpd!.prexmod;
act := XModAction( px );
aut := ImageElm( act, s2![5]![2] );
m := s2![2] * ImageElm( aut, s1![2] );
return SquareOfArrowsNC( dgpd, m, s1![3], s1![4]*s2![4],
s1![5]*s2![5], s2![6] ); end );
############################################################################# ## #M HorizontalProduct( s1, s2 ) ## . . . . horizontal composition of squares in a basic double groupoid ##
InstallMethod( HorizontalProduct, "for two squares in a basic double groupouid", true,
[ IsDoubleGroupoidElement, IsDoubleGroupoidElement], 0, function( s1, s2 )
local dgpd, m, px, act, aut;
## elements are composable? if not ( s1![5] = s2![4] ) then
Info( InfoXMod, 1, "right arrow of s1 <> left arrow of s2" );
return fail; fi; if not ( s1![1] = s2![1] ) then
Info( InfoXMod, 1, "s1 and s2 are in different double groupoids" );
return fail; fi;
dgpd := s1![1];
px := dgpd!.prexmod;
act := XModAction( px );
aut := ImageElm( act, s2![6]![2] );
m := ImageElm( aut, s1![2] ) * s2![2];
return SquareOfArrowsNC( dgpd, m, s1![3]*s2![3], s1![4],
s2![5], s1![6]*s2![6] ); end );
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.22Bemerkung:
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.