<p>A <em>double groupoid</em> is a <em>double category</em> 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 <em>basic double groupoids</em>, which do not involve pre-crossed modules. The more general case will be discussed in the <strong class="pkg">XMod</strong> package.</p>
<p>In a double groupoid, as well as objects and arrows, we need a set of <em>squares</em>. A square is bounded by four arrows, two horizontal and two vertical, and there is a <em>horizontal</em> groupoid structure and a <em>vertical</em> groupoid structure on these squares.</p>
<p>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 <em>edge-symmetric</em> double groupoids.</p>
<p>This addition to the package is very experimental, and will be extended as time permits.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ SinglePieceBasicDoubleGroupoid</code>( <var class="Arg">gpd</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ DoubleGroupoid</code>( <var class="Arg">args</var> )</td><td class="tdright">( function )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsDoubleGroupoid</code>( <var class="Arg">mwo</var> )</td><td class="tdright">( category )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsBasicDoubleGroupoid</code>( <var class="Arg">dgpd</var> )</td><td class="tdright">( category )</td></tr></table></div>
<p>Let <span class="SimpleMath">G</span> be a connected groupoid with object set <span class="SimpleMath">Ω</span>. The double groupoid <span class="SimpleMath">□(G)</span> on <span class="SimpleMath">G</span> is constructed by the operation <code class="code">SinglePieceBasicDoubleGroupoid(G)</code>.</p>
<p>The global function <code class="code">DoubleGroupoid</code> may be used instead of this operation, and will work with various other input parameters.</p>
<p>We name the four arrows <code class="code">UpArrow(s)</code>, <code class="code">LeftArrow(s)</code>, <code class="code">RightArrow(s)</code> and <code class="code">DownArrow(s)</code>.</p>
<p>We think of the square <span class="SimpleMath">s_1</span> being <em>based</em> at the bottom, right-hand corner, <span class="SimpleMath">x_1</span>.</p>
<p>The <em>boundary</em> of the square is the loop <span class="SimpleMath">(x_1, d_1^-1b_1^-1a_1c_1, x_1) = (x_1,δ(s_1),x_1)</span>. The number of squares in a 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.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsCommutingSquare</code>( <var class="Arg">sq</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>The square <span class="SimpleMath">s_1</span> is <em>commuting</em> if <span class="SimpleMath">a_1*c_1 = b_1*d_1</span>, so that its boundary is the identity. The set of commutative squares in <span class="SimpleMath">□(G)</span> forms the <em>commutative sub-double groupoid</em> of <span class="SimpleMath">□(G)</span>.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ TransposedSquare</code>( <var class="Arg">sq</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsClosedUnderTransposition</code>( <var class="Arg">sq</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>The transpose of the square <span class="SimpleMath">s_1</span>, as with matrix transposition, is obtained by interchanging <span class="SimpleMath">a_1</span> with <span class="SimpleMath">b_1</span> and <span class="SimpleMath">c_1</span> with <span class="SimpleMath">d_1</span>. Its boundary is the inverse of the boundary of <span class="SimpleMath">s_1</span>.</p>
<p>In our example, after adding <span class="SimpleMath">c_4</span> and <span class="SimpleMath">d_4</span>, it is routine to check that the two ways of computing the product of four squares give the same answer.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ HorizontalIdentities</code>( <var class="Arg">sq</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ VerticalIdentities</code>( <var class="Arg">sq</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ HorizontalInverses</code>( <var class="Arg">sq</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ VerticalInverses</code>( <var class="Arg">sq</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>There is no single identity for the operations <code class="code">HorizontalProduct</code> and <code class="code">VerticalProduct</code> but there are, for each square, a <em>left identity</em>, a <em>right identity</em>, an <em>up identity</em> and a <em>down identity</em>. The composite of the three squares shown below is equal to the central square <span class="SimpleMath">s</span>, and the other two squares are the left identity <span class="SimpleMath">1_L(s)</span> and the right identity <span class="SimpleMath">1_R(s)</span> for <span class="SimpleMath">s</span>.</p>
<p class="pcenter">
\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
}}
<p>Similarly, here are the up identity <span class="SimpleMath">1_U(s)</span> and the down identity <span class="SimpleMath">1_D(s)</span> of <span class="SimpleMath">s</span>:</p>
<p class="pcenter">
\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
}}
<p>Confusingly, <span class="SimpleMath">s</span> has a <em>horizontal inverse</em> <span class="SimpleMath">s^-1_H</span> whose product with <span class="SimpleMath">s</span> is the left identity or right identity:</p>
<p class="pcenter">
s (\rightarrow) s^{-1}_{H} ~=~ 1_L(s), \qquad
s^{-1}_{H} (\rightarrow) s ~=~ 1_R(s).
</p>
<p>The boundary of <span class="SimpleMath">s^-1_H</span> is <span class="SimpleMath">dc^-1a^-1b = (δ(s)^-1)^d^-1}</span>. Here are the two products:</p>
<p class="pcenter">
\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
}}
<p>Similarly, <span class="SimpleMath">s</span> has a <em>vertical inverse</em> <span class="SimpleMath">s^-1_V</span> whose product with <span class="SimpleMath">s</span> is an up or down identity: <span class="SimpleMath">s (↓) s^-1_V = 1_U(s)</span> and <span class="SimpleMath">s^-1_V (↓) s = 1_D(s)</span>. The boundary is <span class="SimpleMath">a^-1bdc^-1 = (δ(s)^-1)^c^-1}</span>.</p>
<p class="pcenter">
\vcenter{\xymatrix @=4pc{
w \ar[r]^{d} \ar[d]_{b^{-1}}
& x \ar[d]^{c^{-1}} \\
u \ar[r]_{a}
& v
}}
<h5>8.1-8 <span class="Heading">Horizontal and vertical groupoids in <span class="SimpleMath">□(G)</span></span></h5>
<p>Now <span class="SimpleMath">□(G)</span> is the maximal double groupoid determined by <span class="SimpleMath">G</span>, but in general many substructures may be formed. The <em>horizontal groupoid</em> structure <span class="SimpleMath">□_H(G)</span> on <span class="SimpleMath">□(G)</span> has the vertical arrows as objects, and considers the usual square <span class="SimpleMath">s</span></p>
<p class="pcenter">
\vcenter{\xymatrix @=4pc{
u \ar[r]^{a} \ar[d]_{b}
& v \ar[d]^{c} \\
w \ar[r]_{d}
& x
}}
</p>
<p>as an arrow from <span class="SimpleMath">b</span> to <span class="SimpleMath">c</span>. So the arrows in <span class="SimpleMath">□_H(G)</span> are effectively pairs of horizontal arrows <span class="SimpleMath">[a,d]</span>. The vertex groups are isomorphic to <span class="SimpleMath">G × G</span>; the identity arrow at <span class="SimpleMath">b</span> is <span class="SimpleMath">1_L(s)</span>; and the inverse arrow of <span class="SimpleMath">s</span> is <span class="SimpleMath">s^-1_H</span>.</p>
<p>Similarly the <em>vertical groupoid</em> structure <span class="SimpleMath">□_V(G)</span> on <span class="SimpleMath">□(G)</span> has the horizontal arrows as objects and pairs of vertical arrows as arrows. The identity arrow at <span class="SimpleMath">a</span> is <span class="SimpleMath">1_U(s)</span>, and the inverse arrow of <span class="SimpleMath">s</span> is <span class="SimpleMath">s^-1_V</span>.</p>
<p>These groupoid structures have not been implemented in this package.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ UnionOfPieces</code>( <var class="Arg">pieces</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ Pieces</code>( <var class="Arg">dgpd</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>The operation <code class="code">UnionOfPieces</code> and the attribute <code class="code">Pieces</code>, introduced in section <a href="chap2.html#X7C7007207FD91BB0"><span class="RefLink">2.5</span></a>, are also used for double groupoids. The pieces are sorted by the least object in their object lists. The <code class="code">ObjectList</code> is the sorted concatenation of the objects in the pieces.</p>
<p>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.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ DoubleGroupoidWithTrivialGroup</code>( <var class="Arg">obs</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>When <span class="SimpleMath">|Ω|=n</span> the double groupoid with trivial permutation group on these <span class="SimpleMath">n</span> objects contains <span class="SimpleMath">n^4</span> squares of the form:</p>
<p class="pcenter">
\vcenter{\xymatrix @=4pc{
u \ar[r]^{()} \ar[d]_{()}
& v \ar[d]^{()} \\
w \ar[r]_{()}
& x
}}
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ DoubleGroupoidWithSingleObject</code>( <var class="Arg">gp</var>, <var class="Arg">obj</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<p>Given a group <span class="SimpleMath">G</span> we can form the corresponding groupoid with a single object, and from that a double groupoid on that object. The number of squares is <span class="SimpleMath">|G|^4</span>.</p>
<h5>8.3-3 <span class="Heading">What is the double groupoid generated by a set of squares?</span></h5>
<p>This is a very experimental section. Let us consider the following list of three squares <span class="SimpleMath">[s_U(a,u,v),~ 1_U(v,u),~ s_U(a,u,u)]</span>. What is generated by the single square <span class="SimpleMath">s_U(a,u,v)</span>?</p>
<p class="pcenter">
\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
}}
</p>
<p>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 <code class="code">DoubleGroupoidWithTrivialGroup</code> on the given objects should be automatically included? In that case the square <span class="SimpleMath">1_U(v,u)</span> is available and can compose on the right to give <span class="SimpleMath">s_U(a,u,u)</span>. This then composes with itself to produce squares <span class="SimpleMath">s_U(a^i,u,u)</span>. Then, composing with identities, we obtain <code class="code">SinglePieceBasicDoubleGroupoid(G)</code> where <span class="SimpleMath">G</span> is the groupoid with group <span class="SimpleMath">⟨ a ⟩</span> and objects <span class="SimpleMath">[u,v]</span>. More work on this area is required!</p>
<h4>8.4 <span class="Heading">Starting with two groupoids</span></h4>
<p>In the literature on double groupoids the construction often starts with two groupoids <span class="SimpleMath">G_1, G_2</span>, and squares have horizontal arrows chosen from <span class="SimpleMath">G_1</span> and vertical arrows chosen from <span class="SimpleMath">G_2</span>. When that is the case, the boundary of a square is not defined, since arrows from <span class="SimpleMath">G_1</span> do not compose with those from <span class="SimpleMath">G_2</span>. This situation may be modelled here by constructing the direct product groupoid <span class="SimpleMath">G = G_1 × G_2</span> and forming a double groupoid on <span class="SimpleMath">G</span> in which squares have the form:</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ DoubleGroupoidHomomorphism</code>( <var class="Arg">src</var>, <var class="Arg">rng</var>, <var class="Arg">hom</var> )</td><td class="tdright">( operation )</td></tr></table></div>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ IsDoubleGroupoidHomomorphism</code>( <var class="Arg">mwohom</var> )</td><td class="tdright">( category )</td></tr></table></div>
<p>A homomorphism of double groupoids is determined by a homomorphism <code class="code">mor</code> between the underlying groupoids since <code class="code">mor</code> determines the images of the four arrows in every square.</p>
<p>In the example we take the endomorphism <code class="code">md8</code> of <code class="code">Gd8</code>, constructed in section <a href="chap5.html#X83DDA9528396451A"><span class="RefLink">5.2-1</span></a>, to produce an endomorphism of <code class="code">DGd8</code>.</p>