A double groupoid is a double category in which all the category structures are groupoids. For the most general type of double groupoid there is also an associated pre-crossed module. In this package we consider only basic double groupoids, which do not involve pre-crossed modules. The more general case will be discussed in the XMod package.
In a double groupoid, as well as objects and arrows, we need a set of squares. A square is bounded by four arrows, two horizontal and two vertical, and there is a horizontal groupoid structure and a vertical groupoid structure on these squares.
Double groupoids can be considered where the vertical arrows come from one groupoid, and the horizontal arrows from another. The double groupoids constructed here are special in that all four arrows come from the same groupoid. We call these edge-symmetric double groupoids.
This addition to the package is very experimental, and will be extended as time permits.
Let G be a connected groupoid with object set Ω. Let □(G) be the set of squares with objects from Ω at each corner; plus two vertical arrows and two horizontal arrows from Arr(G). The following picture illustrates a square s_1:
\vcenter{\xymatrix @=4pc{ u_1 \ar[r]^{a_1} \ar[d]_{b_1} & v_1 \ar[d]^{c_1} \\ w_1 \ar[r]_{d_1} & x_1 }}
We name the four arrows UpArrow(s)
, LeftArrow(s)
, RightArrow(s)
and DownArrow(s)
.
We think of the square s_1 being based at the bottom, right-hand corner, x_1.
The boundary of the square is the loop (x_1, d_1^-1b_1^-1a_1c_1, x_1) = (x_1,δ(s_1),x_1).
‣ SinglePieceBasicDoubleGroupoid ( gpd ) | ( operation ) |
‣ DoubleGroupoid ( args ) | ( function ) |
‣ SquareOfArrows ( gpd, up, lt, rt, dn ) | ( operation ) |
‣ UpArrow ( sq ) | ( attribute ) |
‣ LeftArrow ( sq ) | ( attribute ) |
‣ RightArrow ( sq ) | ( attribute ) |
‣ DownArrow ( sq ) | ( attribute ) |
‣ BoundaryOfSquare ( sq ) | ( operation ) |
‣ DoubleGroupoidOfSquare ( sq ) | ( operation ) |
The operation SinglePieceBasicDoubleGroupoid
constructs the double groupoid □(G) on a groupoid G. The number of squares in this double groupoid is the product of the number of objects with the size of the group all raised to the fourth power. When viewing or printing a square, the boundary element is shown in the centre.
The global function DoubleGroupoid
may be used instead of this operation, and will work with various other input parameters.
gap> DGd8 := SinglePieceBasicDoubleGroupoid( Gd8 );; gap> DGd8!.groupoid; Gd8 gap> DGd8!.objects; [ -9, -8, -7 ] gap> [ Size(DGd8), (3*8)^4 ]; [ 331776, 331776 ] gap> SetName( DGd8, "DGd8" ); gap> a1 := Arrow( Gd8, (5,7), -7, -8 );; gap> b1 := Arrow( Gd8, (6,8), -7, -7 );; gap> c1 := Arrow( Gd8, (5,6)(7,8), -8, -9 );; gap> d1 := Arrow( Gd8, (5,6,7,8), -7, -9 );; gap> bdy1 := d1^-1 * b1^-1 * a1 * c1; [(6,8) : -9 -> -9] gap> sq1 := SquareOfArrows( DGd8, a1, b1, c1, d1 ); [-7] ------- (5,7) ------> [-8] | | (6,8) (6,8) (5,6)(7,8) V V [-7] ----- (5,6,7,8) ----> [-9] gap> sq1 in DGd8; true gap> UpArrow( sq1 ); [(5,7) : -7 -> -8] gap> LeftArrow( sq1 ); [(6,8) : -7 -> -7] gap> RightArrow( sq1 ); [(5,6)(7,8) : -8 -> -9] gap> DownArrow( sq1 ); [(5,6,7,8) : -7 -> -9] gap> BoundaryOfSquare( sq1 ); [(6,8) : -9 -> -9] gap> DoubleGroupoidOfSquare( sq1 ); DGd8
‣ IsCommutingSquare ( sq ) | ( property ) |
The square s_1 is commuting if a_1*c_1 = b_1*d_1, so that its boundary is the identity. The set of commutative squares in □(G) forms the commutative sub-double groupoid of □(G).
gap> a2 := Arrow( Gd8, (6,8), -8, -9 );; gap> c2 := Arrow( Gd8, (5,7)(6,8), -9, -8);; gap> d2 := Arrow( Gd8, (5,6,7,8), -9, -8 );; gap> sq2 := SquareOfArrows( DGd8, a2, c1, c2, d2 ); [-8] -------- (6,8) -------> [-9] | | (5,6)(7,8) () (5,7)(6,8) V V [-9] ------ (5,6,7,8) -----> [-8] gap> bdy2 := BoundaryOfSquare( sq2 ); [() : -8 -> -8] gap> [ IsCommutingSquare(sq1), IsCommutingSquare(sq2) ]; [ false, true ]
‣ TransposedSquare ( sq ) | ( operation ) |
‣ IsClosedUnderTransposition ( sq ) | ( property ) |
The transpose of the square s_1, as with matrix transposition, is obtained by interchanging a_1 with b_1 and c_1 with d_1. Its boundary is the inverse of the boundary of s_1.
gap> tsq1 := TransposedSquare( sq1 ); [-7] ------- (6,8) ------> [-7] | | (5,7) (6,8) (5,6,7,8) V V [-8] ---- (5,6)(7,8) ---> [-9] gap> IsClosedUnderTransposition( sq1 ); false
‣ HorizontalProduct ( sq1, sq2 ) | ( operation ) |
When RightArrow
(s_1) = LeftArrow
(s_2) we may compose s_1 and s_2 horizontally to form the square s_1 (→) s_2 = HorizontalProduct
(s_1,s_2) as illustrated here:
\vcenter{\xymatrix @=4pc{ u_1 \ar[r]^{a_1} \ar[d]_{b_1} & v_1 \ar[r]^{a_2} \ar[d]^{c_1} & v_2 \ar[d]^{c_2} \ar@{}[dr]|= & u_1 \ar[r]^{a_1a_2} \ar[d]_{b_1} & v_2 \ar[d]^{c_2} \\ w_1 \ar[r]_{d_1} & x_1 \ar[r]_{d_2} & x_2 & w_1 \ar[r]_{d_1d_2} & x_2 }}
Notice that the boundary of the composite satisfies the identity:
\delta(s_1 (\rightarrow) s_2) ~=~ (d_1d_2)^{-1}b_1^{-1}(a_1a_2)c_2 ~=~ d_2^{-1}(d_1^{-1}b_1^{-1}a_1c_1)d_2(d_2^{-1}c_1^{-1}a_2c_2) ~=~ (\delta s_1)^{d_2} (\delta s_2).
(This operation was called LeftRightProduct
in versions up to 1.76.)
gap> LeftArrow( sq2 ) = RightArrow( sq1 ); true gap> sq12 := HorizontalProduct( sq1, sq2 ); [-7] ----- (5,7)(6,8) ----> [-9] | | (6,8) (5,7) (5,7)(6,8) V V [-7] ----- (5,7)(6,8) ----> [-8] gap> bdy12 := BoundaryOfSquare( sq12 ); [(5,7) : -8 -> -8] gap> (bdy1^d2) * bdy2 = bdy12; true
‣ VerticalProduct ( sq1, sq3 ) | ( operation ) |
When DownArrow
(s_1) = UpArrow
(s_3) we may compose s_1 and s_3 vertically to form s_1 (↓) s_3 = VerticalProduct
(s_1,s_3) illustrated by:
\vcenter{\xymatrix @=2pc{ u_1 \ar[rr]^{a_1} \ar[dd]_{b_1} && v_1 \ar[dd]^{c_1} & & && \\ && & & u_1 \ar[rr]^{a_1} \ar[dd]_{b_1b_3} && v_1 \ar[dd]^{c_1c_3} \\ w_1 \ar[rr]_{d_1} \ar[dd]_{b_3} && x_1 \ar[dd]^{c_3} &=& && \\ && & & w_3 \ar[rr]_{d_3} && x_3 \\ w_3 \ar[rr]_{d_3} && x_3 }}
This time the boundary condition satisfies the identity:
\delta(s_1 (\downarrow) s_3) ~=~ d_3^{-1}(b_1b_3)^{-1}a_1(c_1c_3) ~=~ (d_3^{-1}b_3^{-1}d_1c_3)c_3^{-1}(d_1^{-1}b_1^{-1}a_1c_1)c_3 ~=~ (\delta s_3)(\delta s_1)^{c_3}.
(This operation was called UpDownProduct
in versions up to 1.76.)
gap> b3 := Arrow( Gd8, (5,7), -7, -9 );; gap> c3 := Arrow( Gd8, (6,8), -9, -8);; gap> d3 := Arrow( Gd8, (5,8)(6,7), -9, -8 );; gap> sq3 := SquareOfArrows( DGd8, d1, b3, c3, d3 ); [-7] ---- (5,6,7,8) ---> [-9] | | (5,7) (6,8) (6,8) V V [-9] ---- (5,8)(6,7) ---> [-8] gap> bdy3 := BoundaryOfSquare( sq3 ); [(6,8) : -8 -> -8] gap> UpArrow( sq3 ) = DownArrow( sq1 ); true gap> sq13 := VerticalProduct( sq1, sq3 ); [-7] -------- (5,7) -------> [-8] | | (5,7)(6,8) () (5,8,7,6) V V [-9] ----- (5,8)(6,7) ----> [-8]
Vertical and horizontal compositions commute, so we may construct products such as:
\vcenter{\xymatrix @=2pc{ u_1 \ar[rr]^{a_1} \ar[dd]_{b_1} && v_1 \ar[rr]^{a_2} \ar[dd]|{c_1} && v_2 \ar[dd]^{c_2} & & &&& \\ && && & & u_1 \ar[rrr]^{a_1a_2} \ar[dd]_{b_1b_3} &&& v_2 \ar[dd]^{c_2c_4} \\ w_1 \ar[rr]|{d_1} \ar[dd]_{b_3} && x_1 \ar[rr]|{d_2} \ar[dd]|{c_3} && x_2 \ar[dd]^{c_4} &=& &&& \\ && && & & w_3 \ar[rrr]_{d_3d_4} &&& x_4 \\ w_3 \ar[rr]_{d_3} && x_3 \ar[rr]_{d_4} && x_4 }}
In our example, after adding c_4 and d_4, it is routine to check that the two ways of computing the product of four squares give the same answer.
\vcenter{\xymatrix @=2pc{ -7 \ar[rr]^{(5,7)} \ar[dd]_{(6,8)} && -8 \ar[rr]^{(6,8)} \ar[dd]|{(5,6)(7,8)} && -9 \ar[dd]^{(5,7)(6,8)} & & &&& \\ && && & & -7 \ar[rrr]^{(5,7)(6,8)} \ar[dd]^{(5,7)(6,8)} &&& -9 \ar[dd]_{(5,8,7,6)} \\ -7 \ar[rr]|{(5,6,7,8)} \ar[dd]_{(5,7)} && -9 \ar[rr]|{(5,6,7,8)} \ar[dd]|{(6,8)} && -8 \ar[dd]^{(5,6,7,8)} &=& &&& \\ && && & & -9 \ar[rrr]_{(5,7)(6,8)} &&& -7 \\ -9 \ar[rr]_{(5,8)(6,7)} && -8 \ar[rr]_{(5,6)(7,8)} && -7 }}
gap> c4 := Arrow( Gd8, (5,6,7,8), -8, -7);; gap> d4 := Arrow( Gd8, (5,6)(7,8), -8, -7 );; gap> sq4 := SquareOfArrows( DGd8, d2, c3, c4, d4 ); [-9] ------- (5,6,7,8) ------> [-8] | | (6,8) (5,6,7,8) (5,6,7,8) V V [-8] ------ (5,6)(7,8) -----> [-7] gap> UpArrow( sq4 ) = DownArrow( sq2 ); true gap> LeftArrow( sq4 ) = RightArrow( sq3 ); true gap> sq34 := HorizontalProduct( sq3, sq4 ); [-7] ------- (5,7)(6,8) ------> [-8] | | (5,7) (5,8)(6,7) (5,6,7,8) V V [-9] ------- (5,7)(6,8) ------> [-7] gap> sq1234 := VerticalProduct( sq12, sq34 ); [-7] --------- (5,7)(6,8) --------> [-9] | | (5,7)(6,8) (5,6,7,8) (5,8,7,6) V V [-9] --------- (5,7)(6,8) --------> [-7] gap> sq24 := VerticalProduct( sq2, sq4 ); [-8] ----------- (6,8) ----------> [-9] | | (5,8,7,6) (5,6,7,8) (5,8,7,6) V V [-8] -------- (5,6)(7,8) -------> [-7] gap> sq1324 := HorizontalProduct( sq13, sq24 );; gap> sq1324 = sq1234; true
‣ HorizontalIdentities ( sq ) | ( operation ) |
‣ VerticalIdentities ( sq ) | ( operation ) |
‣ HorizontalInverses ( sq ) | ( operation ) |
‣ VerticalInverses ( sq ) | ( operation ) |
There is no single identity for the operations HorizontalProduct
and VerticalProduct
but there are, for each square, a left identity, a right identity, an up identity and a down identity. The composite of the three squares shown below is equal to the central square s, and the other two squares are the left identity 1_L(s) and the right identity 1_R(s) for s.
\vcenter{\xymatrix @=4pc{ u \ar[r]^{1} \ar[d]_{b} & u \ar[r]^{a} \ar[d]^{b} & v \ar[r]^{1} \ar[d]_{c} & v \ar[d]^{c} \\ w \ar[r]_{1} & w \ar[r]_{d} & x \ar[r]_{1} & x }}
gap> hid := HorizontalIdentities( sq24 );; gap> hid[1]; Print("\n"); hid[2]; [-8] --------- () --------> [-8] | | (5,8,7,6) () (5,8,7,6) V V [-8] --------- () --------> [-8] [-9] --------- () --------> [-9] | | (5,8,7,6) () (5,8,7,6) V V [-7] --------- () --------> [-7] gap> HorizontalProduct( hid[1], sq24 ) = sq24; true gap> HorizontalProduct( sq24, hid[2] ) = sq24; true
Similarly, here are the up identity 1_U(s) and the down identity 1_D(s) of s:
\vcenter{\xymatrix @=4pc{ u \ar[r]^{a} \ar[d]_{1} & v \ar[d]^{1} & w \ar[r]^{d} \ar[d]_{1} & x \ar[d]^{1} \\ u \ar[r]_{a} & v & w \ar[r]_{d} & x }}
gap> vid := VerticalIdentities( sq24 );; gap> vid[1]; Print("\n"); vid[2]; [-8] ---- (6,8) ---> [-9] | | () () () V V [-8] ---- (6,8) ---> [-9] [-8] ---- (5,6)(7,8) ---> [-7] | | () () () V V [-8] ---- (5,6)(7,8) ---> [-7] gap> VerticalProduct( vid[1], sq24 ) = sq24; true gap> VerticalProduct( sq24, vid[2] ) = sq24; true
Confusingly, s has a horizontal inverse s^-1_H whose product with s is the left identity or right identity:
s (\rightarrow) s^{-1}_{H} ~=~ 1_L(s), \qquad s^{-1}_{H} (\rightarrow) s ~=~ 1_R(s).
The boundary of s^-1_H is dc^-1a^-1b = (δ(s)^-1)^d^-1}. Here are the two products:
\vcenter{\xymatrix @=4pc{ u \ar[r]^{a} \ar[d]_{b} & v \ar[r]^{a^{-1}} \ar[d]^{c} & u \ar[d]^{b} & v \ar[r]^{a^{-1}} \ar[d]_{c} & u \ar[r]^{a} \ar[d]^{b} & v \ar[d]^{c} \\ w \ar[r]_{d} & x \ar[r]_{d^{-1}} & w & x \ar[r]_{d^{-1}} & w \ar[r]_{d} & x }}
gap> hinv := HorizontalInverse( sq24 ); [-9] ----------- (6,8) ----------> [-8] | | (5,8,7,6) (5,6,7,8) (5,8,7,6) V V [-7] -------- (5,6)(7,8) -------> [-8] gap> HorizontalProduct( hinv, sq24 ) = hid[2]; true gap> HorizontalProduct( sq24, hinv ) = hid[1]; true
Similarly, s has a vertical inverse s^-1_V whose product with s is an up or down identity: s (↓) s^-1_V = 1_U(s) and s^-1_V (↓) s = 1_D(s). The boundary is a^-1bdc^-1 = (δ(s)^-1)^c^-1}.
\vcenter{\xymatrix @=4pc{ w \ar[r]^{d} \ar[d]_{b^{-1}} & x \ar[d]^{c^{-1}} \\ u \ar[r]_{a} & v }}
gap> vinv := VerticalInverse( sq24 ); [-8] -------- (5,6)(7,8) -------> [-7] | | (5,6,7,8) (5,8,7,6) (5,6,7,8) V V [-8] ----------- (6,8) ----------> [-9] gap> VerticalProduct( vinv, sq24 ) = vid[2]; true gap> VerticalProduct( sq24, vinv ) = vid[1]; true
Now □(G) is the maximal double groupoid determined by G, but in general many substructures may be formed.
The horizontal groupoid structure □_H(G) on □(G) has the vertical arrows as objects, and considers the usual square s
\vcenter{\xymatrix @=4pc{ u \ar[r]^{a} \ar[d]_{b} & v \ar[d]^{c} \\ w \ar[r]_{d} & x }}
as an arrow from b to c. So the arrows in □_H(G) are effectively pairs of horizontal arrows [a,d]. The vertex groups are isomorphic to G × G; the identity arrow at b is 1_L(s); and the inverse arrow of s is s^-1_H.
Similarly the vertical groupoid structure □_V(G) on □(G) has the horizontal arrows as objects and pairs of vertical arrows as arrows. The identity arrow at a is 1_U(s), and the inverse arrow of s is s^-1_V.
As with groupoids, double groupoids may comprise a union of single piece double groupoids with disjoint object sets.
‣ UnionOfPieces ( pieces ) | ( operation ) |
‣ Pieces ( dgpd ) | ( attribute ) |
The operation UnionOfPieces
and the attribute Pieces
, introduced in section 2.5, are also used for double groupoids. The pieces are sorted by the least object in their object lists. The ObjectList
is the sorted concatenation of the objects in the pieces.
The example shows that, as well as taking the union of two double groupoids, the same object may be constructed directly from the underlying groupoids.
gap> DGc6 := SinglePieceBasicDoubleGroupoid( Gc6 );; gap> DGa4 := SinglePieceBasicDoubleGroupoid( Ga4 );; gap> DGc6s4 := DoubleGroupoid( [ DGc6, DGa4 ] ); double groupoid having 2 pieces :- 1: single piece double groupoid with: groupoid = Ga4 group = a4 objects = [ -15 .. -11 ] 2: single piece double groupoid with: groupoid = Gc6 group = c6 objects = [ -10 ] gap> DGa4c6 := DoubleGroupoid( [ Ga4, Gc6 ] );; gap> Pieces( DGa4c6 ); [ single piece double groupoid with: groupoid = Ga4 group = a4 objects = [ -15 .. -11 ], single piece double groupoid with: groupoid = Gc6 group = c6 objects = [ -10 ] ]
Before considering the general case we investigate two special cases:
a basic double groupoid with identity group;
a basic double groupoid with a single object.
‣ DoubleGroupoidWithTrivialGroup ( obs ) | ( operation ) |
When |Ω|=n the double groupoid with trivial permutation group on these n objects contains n^4 squares of the form:
\vcenter{\xymatrix @=4pc{ u \ar[r]^{()} \ar[d]_{()} & v \ar[d]^{()} \\ w \ar[r]_{()} & x }}
gap> DGtriv := DoubleGroupoidWithTrivialGroup( [-19..-17] ); single piece double groupoid with: groupoid = single piece groupoid: < Group( [ () ] ), [ -19 .. -17 ] > group = Group( [ () ] ) objects = [ -19 .. -17 ] gap> Size(DGtriv); 81
‣ DoubleGroupoidWithSingleObject ( gp, obj ) | ( operation ) |
Given a group G we can form the corresponding groupoid with a single object, and from that a double groupoid on that object. The number of squares is |G|^4.
gap> DGc4 := DoubleGroupoidWithSingleObject( Group((1,2,3,4)), 0 ); single piece double groupoid with: groupoid = single piece groupoid: < Group( [ (1,2,3,4) ] ), [ 0 ] > group = Group( [ (1,2,3,4) ] ) objects = [ 0 ] gap> Size( DGc4 ); 256
This is a very experimental section. Let us consider the following list of three squares [s_U(a,u,v),~ 1_U(v,u),~ s_U(a,u,u)]. What is generated by the single square s_U(a,u,v)?
\vcenter{\xymatrix @=4pc{ u \ar[r]^{a} \ar[d]_{1} & v \ar[d]^{1} & v \ar[r]^{1} \ar[d]_{1} & u \ar[d]_{1} & u \ar[r]^{a} \ar[d]_{1} & u \ar[d]_{1} \\ u \ar[r]_{1} & v & v \ar[r]_{1} & u & u \ar[r]_{1} & u }}
The first square does not compose with itself, so cannot generate anything. When constructing a group from generators there is never any need to include an identity - that is always assumed to be included. Perhaps, when constructing a double groupoid, it should be assumed that the DoubleGroupoidWithTrivialGroup
on the given objects should be automatically included? In that case the square 1_U(v,u) is available and can compose on the right to give s_U(a,u,u). This then composes with itself to produce squares s_U(a^i,u,u). Then, composing with identities, we obtain SinglePieceBasicDoubleGroupoid(G)
where G is the groupoid with group ⟨ a ⟩ and objects [u,v]. More work on this area is required!
In the literature on double groupoids the construction often starts with two groupoids G_1, G_2, and squares have horizontal arrows chosen from G_1 and vertical arrows chosen from G_2. When that is the case, the boundary of a square is not defined, since arrows from G_1 do not compose with those from G_2. This situation may be modelled here by constructing the direct product groupoid G = G_1 × G_2 and forming a double groupoid on G in which squares have the form:
\vcenter{\xymatrix @=4pc{ [u_1,u_2] \ar[r]^{[a,1]} \ar[d]_{[1,b]} & [v_1,v_2] \ar[d]^{[1,c]} \\ [w_1,w_2] \ar[r]_{[d,1]} & [x_1,x_2] }}
gap> Gd8c6 := DirectProduct( Gd8, Gc6 ); single piece groupoid: < Group( [ (1,2,3,4), (1,3), (5,6,7)(8,9) ] ), [ [ -9, -10 ], [ -8, -10 ], [ -7, -10 ] ] > gap> SetName( Gd8c6, "Gd8c6" ); gap> DGd8c6 := SinglePieceBasicDoubleGroupoid( Gd8c6 ); single piece double groupoid with: groupoid = Gd8c6 group = Group( [ (1,2,3,4), (1,3), (5,6,7)(8,9) ] ) objects = [ [ -9, -10 ], [ -8, -10 ], [ -7, -10 ] ] gap> emb1 := Embedding( Gd8c6, 1 );; gap> emb2 := Embedding( Gd8c6, 2 );; gap> a5 := Arrow( Gd8, (5,7), -9, -7 );; gap> a6 := ImageElm( emb1, a5 ); [(1,3) : [ -9, -10 ] -> [ -7, -10 ]] gap> d5 := Arrow( Gd8, (6,8), -9, -8 );; gap> d6 := ImageElm( emb1, d5 ); [(2,4) : [ -9, -10 ] -> [ -8, -10 ]] gap> b5 := Arrow( Gc6, (11,12,13), -10, -10 );; gap> b6 := ImageElm( emb2, b5 ); [(5,6,7) : [ -9, -10 ] -> [ -9, -10 ]] gap> c6 := Arrow( Gd8c6, (8,9), [-7,-10], [-8,-10] );; gap> sq := SquareOfArrows( DGd8c6, a6, b6, c6, d6 ); [[ -9, -10 ]] ----- (1,3) ----> [[ -7, -10 ]] | | (5,6,7) (1,3)(2,4)(5,7,6)(8,9) (8,9) V V [[ -9, -10 ]] ----- (2,4) ----> [[ -8, -10 ]]
‣ DoubleGroupoidHomomorphism ( src, rng, hom ) | ( operation ) |
A homomorphism of double groupoids is determined by a homomorphism mor
between the underlying groupoids since mor
determines the images of the four arrows in every square.
In the example we take the endomorphism md8
of Gd8
, constructed in section 5.2-1, to produce an endomorphism of DGd8
.
gap> ad8 := GroupHomomorphismByImages( d8, d8, > [ (5,6,7,8), (5,7) ], [ (5,8,7,6), (6,8) ] );; gap> md8 := GroupoidHomomorphism( Gd8, Gd8, ad8, > [-7,-9,-8], [(),(5,7),(6,8)] );; gap> endDGd8 := DoubleGroupoidHomomorphism( DGd8, DGd8, md8 ); double groupoid homomorphism : DGd8 -> DGd8 gap> Display( endDGd8 ); double groupoid homomorphism: [ DGd8 ] -> [ DGd8 ] with underlying groupoid homomorphism: groupoid mapping: [ Gd8 ] -> [ Gd8 ] root homomorphism: [ [ (5,6,7,8), (5,7) ], [ (5,8,7,6), (6,8) ] ] images of objects: [ -7, -9, -8 ] images of rays: [ [() : -7 -> -7], [(5,7) : -7 -> -9], [(6,8) : -7 -> -8] ] gap> sq1; [-7] ------- (5,7) ------> [-8] | | (6,8) (6,8) (5,6)(7,8) V V [-7] ----- (5,6,7,8) ----> [-9] gap> ImageElm( endDGd8, sq1 ); [-8] ------- (5,7) ------> [-9] | | (5,7) (5,7) (5,8,7,6) V V [-8] ---- (5,8)(6,7) ---> [-7]
generated by GAPDoc2HTML