  
  [1X5 Homomorphisms of Groupoids[0X
  
  A  [13Xhomomorphism[0m  m  from a groupoid G to a groupoid H consists of a map from
  the objects of G to those of H together with a map from the elements of G to
  those  of  H  which  is  compatible  with  tail and head and which preserves
  multiplication:
  
  
       m(g1 : o1 \to o2)*m(g2 : o2 \to o3) ~=~ m(g1*g2 : o1 \to o3).
  
  
  Note  that when a homomorphism is not injective on objects, the image of the
  source  need not be a subgroupoid of the range. The simplest example of this
  is  given  by homomorphism the two-object groupoid with trivial group to the
  free group < a > on one generator, when the image is [1,a,a^-1].
  
  
  [1X5.1 Homomorphisms to a connected groupoid[0X
  
  [1X5.1-1 GroupoidHomomorphism[0m
  
  [2X> GroupoidHomomorphism( [0X[3Xargs[0X[2X ) _____________________________________[0Xfunction
  [2X> GroupoidHomomorphismFromSinglePiece( [0X[3Xsrc, rng, hom, imobs[0X[2X ) _____[0Xoperation
  [2X> Source( [0X[3Xhom[0X[2X ) ___________________________________________________[0Xattribute
  [2X> Range( [0X[3Xhom[0X[2X ) ____________________________________________________[0Xattribute
  
  As  usual,  there  are  a  variety  of  homomorphism constructors. The basic
  construction is a homomorphism G -> H with H connected, which is implemented
  as  [10XIsHomomorphismToSinglePieceGroupoidRep[0m with attributes [10XSource[0m, [10XRange[0m and
  [10XPieceImages[0m.     If     G     is    also    connected,    we    may    apply
  [10XHomomorphismOfSinglePieceGroupoids[0m, requiring:
  
  --    a homomorphism [10Xhom[0m from the group of G to the group of H.
  
  --    a list [10Ximobs[0m of the images of the objects of G;
  
  [4X---------------------------  Example  ----------------------------[0X
    [4X[0X
    [4Xgap> d12 := Group( (15,16,17,18,19,20, (15,20)(16,19)(17,18) );;[0X
    [4Xgap> Gd12 := SinglePieceGroupoid( [-37,-36,-35,-34], d12 );;[0X
    [4Xgap> SetName( d12, "d12" );  SetName( Gd12, "Gd12" );[0X
    [4Xgap> s3d := Subgroup( d12, [ (15,17,19)(16,18,20), (15,20)(16,19)(17,18) ] );[0X
    [4Xgap> Gs3d := SubgroupoidByPieces( Gd12, [ [[-36,-35,-34], s3d] ] );;[0X
    [4Xgap> SetName( s3d, "s3d" );  SetName( Gs3d, "Gs3d" );[0X
    [4Xgap> gend8 := GeneratorsOfGroup( d8 );;[0X
    [4Xgap> imhd8 := [ ( ), (15,20)(16,19)(17,18) ];;[0X
    [4Xgap> hd8 := GroupHomomorphismByImages( d8, s3d, gend8, imhd8 );[0X
    [4Xgap> homd8 := GroupoidHomomorphism( Gd8, Gs3d, hd8, [-34,-35,-36] );[0X
    [4Xgroupoid homomorphism : Gd8 -> Gs3d [0X
    [4Xgap> IsBijectiveOnObjects( homd8 );[0X
    [4Xtrue[0X
    [4Xgap> Display( homd8 );[0X
    [4Xgroupoid mapping: [ Gd8 ] -> [ Gs3d ][0X
    [4Xroot homomorphism: [ [ (1,2,3,4), (1,3) ], [ (), (15,20)(16,19)(17,18) ] ][0X
    [4Ximages of objects: [ -34, -35, -36 ][0X
    [4X   images of rays: [ (), (), () ][0X
    [4X[0X
  [4X------------------------------------------------------------------[0X
  
