  
  [1X2 Many-object structures[0X
  
  A  [13Xmagma  with  objects[0m  M  consists of a set of [13Xobjects[0m Ob(M), and a set of
  [13Xarrows[0m  Arr(M) together with [13Xtail[0m and [13Xhead[0m maps t,h : Arr(M) -> Ob(M), and a
  [13Xpartial multiplication[0m * : Arr(M) -> Arr(M), with a*b defined precisely when
  the  head of a coincides with the tail of b. We write an arrow a with tail u
  and head v as (a : u -> v).
  
  When this multiplication is associative we obtain a [13Xsemigroup with objects[0m.
  
  A  [13Xloop[0m  is  an  arrow  whose tail and head are the same object. An [13Xidentity
  arrow[0m  at  object  u  is a loop (1_u : u -> u) such that a*1_u=a and 1_u*b=b
  whenever  u  is  the head of a and the tail of b. When M is a semigroup with
  objects  and  every  object  has  an identity arrow, we obtain a [13Xmonoid with
  objects[0m, which is just the usual notion of mathematical category.
  
  An  arrow  (a : u -> v) in a monoid with objects has [13Xinverse[0m (a^-1 : v -> u)
  provided a*a^-1 = 1_u and a^-1*a = 1_v. A monoid with objects in which every
  arrow has an inverse is a [13Xgroup with objects[0m, usually called a [13Xgroupoid[0m.
  
  For  the  definitions of the standard properties of groupoids we refer to R.
  Brown's   book  ``Topology''  [Bro88],  recently  revised  and  reissued  as
  ``Topology and Groupoids'' [Bro06].
  
  
  [1X2.1 Magmas with objects[0X
  
  [1X2.1-1 MagmaWithObjects[0m
  
  [2X> MagmaWithObjects( [0X[3Xargs[0X[2X ) _________________________________________[0Xfunction
  [2X> ObjectList( [0X[3Xmwo[0X[2X ) _______________________________________________[0Xattribute
  [2X> SemigroupithObjects( [0X[3Xargs[0X[2X ) ______________________________________[0Xfunction
  [2X> MonoidWithObjects( [0X[3Xargs[0X[2X ) ________________________________________[0Xfunction
  
  The  simplest construction for a magma with objects is to take a magma m and
  form  arrows  (u,x,v)  for  every  x  in  m and every pair of objects (u,v).
  Multiplication is defined by (u,x,v)*(v,y,w) = (u,x*y,w).
  
  Any  finite, ordered set is in principle acceptable as the objects of M, but
  we will restrict ourselves to sets of negative integers here.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> tm := [[1,2,4,3],[1,2,4,3],[3,4,2,1],[3,4,2,1]];;  Display( tm );[0X
    [4X[ [  1,  2,  4,  3 ],[0X
    [4X  [  1,  2,  4,  3 ],[0X
    [4X  [  3,  4,  2,  1 ],[0X
    [4X  [  3,  4,  2,  1 ] ][0X
    [4Xgap> m := MagmaByMultiplicationTable( tm ); [0X
    [4X<magma with 4 generators>[0X
    [4Xgap> SetName( m, "m" ); [0X
    [4Xgap> m1 := MagmaElement(m,1);; [0X
    [4Xgap> m2 := MagmaElement(m,2);; [0X
    [4Xgap> m3 := MagmaElement(m,3);; [0X
    [4Xgap> m4 := MagmaElement(m,4);; [0X
    [4Xgap> One(m); [0X
    [4Xfail[0X
    [4Xgap> M78 := MagmaWithObjects( [-8,-7], m ); [0X
    [4XMagma with objects :-[0X
    [4X  objects = [ -8, -7 ][0X
    [4X    magma = m[0X
    [4Xgap> [ IsAssociative(M78), IsCommutative(M78) ]; [0X
    [4X[ false, false ][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.1-2 MultiplicativeElementWithObjects[0m
  
  [2X> MultiplicativeElementWithObjects( [0X[3Xmwo, elt, tail, head[0X[2X ) ________[0Xoperation
  
  Elements    in    a    magma    with    objects    lie   in   the   category
  [10XIsMultiplicativeElementWithObjects[0m.  An attempt to multiply two arrows which
  do not compose resuts in [10Xfail[0m being returned.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> a78 := MultiplicativeElementWithObjects( M78, m4, -7, -8 ); [0X
    [4X[m2 : -7 -> -8][0X
    [4Xgap> b87 := MultiplicativeElementWithObjects( M78, m3, -8, -7 ); [0X
    [4X[m3 : -8 -> -7][0X
    [4Xgap> ba := b87*a78; [0X
    [4X[m4 : -8 -> -8][0X
    [4Xgap> ab := a78*b87;[0X
    [4X[m4 : -7 -> -7][0X
    [4Xgap> a78^2; [0X
    [4Xfail[0X
    [4Xgap> ba^2;[0X
    [4X[m1 : -8 -> -8][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
  [1X2.1-3 IsSinglePiece[0m
  
  [2X> IsSinglePiece( [0X[3Xmwo[0X[2X ) _____________________________________________[0Xproperty
  [2X> IsDirectProductWithCompleteGraph( [0X[3Xmwo[0X[2X ) __________________________[0Xproperty
  
  If  the  partial  composition  is forgotten, then a digraph is left (usually
  with  multiple  edges and loops). Thus the notion of [13Xconnected component[0m may
  be  inherited  by magmas with objects from digraphs. Unfortunately the terms
  [10XComponent[0m  and  [10XConstituent[0m  are already in considerably use in [5XGAP[0m, so (for
  now?)  we  use  the  term  [10XIsSinglePiece[0m  to describe a connected magma with
  objects.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> IsSinglePiece( M78 ); [0X
    [4Xtrue[0X
    [4Xgap> IsDirectProductWithCompleteGraph( M78 );[0X
    [4Xtrue[0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
