<!-- ------------------------------------------------------------------- -->
<!--                                                                     -->
<!--  mwohom.xml       groupoids documentation            Chris Wensley  -->
<!--                                                                     -->
<!--  Copyright (C) 2000-2022, Emma Moore and Chris Wensley,             --> 
<!--  School of Computer Science, Bangor University, U.K.                --> 
<!--                                                                     -->
<!-- ------------------------------------------------------------------- -->

<?xml version="1.0" encoding="UTF-8"?>

<Chapter Label="chap-homwo">
<Heading>Mappings of many-object structures</Heading>

A <E>homomorphism</E> <M>f</M> from a magma with objects <M>M</M> 
to a magma with objects <M>N</M> consists of 
<List>
<Item>
a map <M>f_O</M> from the objects of <M>M</M> to those of <M>N</M>, 
</Item>
<Item>
a map <M>f_A</M> from the arrows of <M>M</M> to those of <M>N</M>. 
</Item>
</List>
The map <M>f_A</M> is required to be compatible with the tail and head maps 
and to preserve multiplication: 
<Display>
f_A(a : u \to v) * f_A(b : v \to w) ~=~ f_A(a*b : u \to w) 
</Display> 
with tail <M>f_O(u)</M> and head <M>f_O(w)</M>. 
<P/>
When the underlying magma of <M>M</M> is a monoid or group, 
the map <M>f_A</M> is required to preserve identities and inverses.  
<P/>

<Section Label="sec-mwohom">
<Heading>Homomorphisms of magmas with objects</Heading>

<ManSection>
   <Func Name="MagmaWithObjectsHomomorphism"
         Arg="args" />
   <Oper Name="HomomorphismFromSinglePiece"
         Arg="src,rng,hom,imobs" />
   <Oper Name="HomomorphismToSinglePiece"
         Arg="src,rng,images" Label="for magmas with objects" />
   <Attr Name="MappingToSinglePieceData"
         Arg="mwohom" Label="for magmas with objects" />
   <Attr Name="PiecesOfMapping"
         Arg="mwohom" />
   <Oper Name="IsomorphismNewObjects"
         Arg="src,objlist" Label="for magmas with objects" />
<Description>
There are a variety of homomorphism constructors. 
<P/> 
The simplest construction gives a homomorphism <M>M \to N</M> with 
both <M>M</M> and <M>N</M> connected. 
It is implemented as 
<Index Key="IsMappingToSinglePieceRep"> 
<C>IsMappingToSinglePieceRep</C> </Index> 
<C>IsMappingToSinglePieceRep</C> 
with attributes 
<Index Key="Source"> <C>Source</C> </Index> <C>Source</C>, 
<Index Key="Range">  <C>Range</C>  </Index> <C>Range</C> 
and <C>MappingToSinglePieceData</C>. 
The operation requires the following information: 
<List>
<Item>
a magma homomorphism <C>hom</C> from the underlying magma of <M>M</M> 
to the underlying magma of <M>N</M>, 
</Item>
<Item>
a list <C>imobs</C> of the images of the objects of <M>M</M>. 
</Item>
</List>
In the first example we construct endomappings of <C>m</C> and <C>M78</C>. 
<P/>
</Description>
</ManSection>
<Example>
<![CDATA[
gap> tup1 := [ DirectProductElement([m1,m2]), DirectProductElement([m2,m1]), 
>              DirectProductElement([m3,m4]), DirectProductElement([m4,m3]) ];; 
gap> f1 := GeneralMappingByElements( m, m, tup1 ); 
gap> IsMagmaHomomorphism( f1 ); 
true
gap> hom1 := MagmaWithObjectsHomomorphism( M78, M78, f1, [-8,-7] );; 
gap> Display( hom1 );
homomorphism to single piece magma: M78 -> M78
 magma hom: <mapping: m -> m > 
object map: [ -8, -7 ] -> [ -8, -7 ]
gap> [ Source( hom1 ), Range( hom1 ) ]; 
[ M78, M78 ]
gap> b87;
[m4 : -8 -> -7]
gap> im1 := ImageElm( hom1, b87 );
[m3 : -8 -> -7]
gap> i56 := IsomorphismNewObjects( M78, [-5,-6] ); 
magma with objects homomorphism : 
[ [ IdentityMapping( m ), [ -5, -6 ] ] ]
gap> ib87 := ImageElm( i56, b87 );
[m4 : -5 -> -6]
gap> M65 := Range( i56);; 
gap> SetName( M65, "M65" ); 
gap> j56 := InverseGeneralMapping( i56 );; 
gap> ImagesOfObjects( j56 ); 
[ -7, -8 ]
gap> comp := j56 * hom1;
magma with objects homomorphism : M65 -> M78
[ [ <mapping: m -> m >, [ -7, -8 ] ] ]
gap> ImageElm( comp, ib87 );
[m3 : -8 -> -7]
]]>
</Example>

A homomorphism <E>to</E> a connected magma with objects may have a source 
with several pieces, 
and so is a union of homomorphisms <E>from</E> single pieces. 
<P/>
<Example>
<![CDATA[
gap> M4 := UnionOfPieces( [ M78, M65 ] );;
gap> images := [ MappingToSinglePieceData( hom1 )[1], 
> MappingToSinglePieceData( j56 )[1] ]; 
[ [ <mapping: m -> m >, [ -8, -7 ] ], [ IdentityMapping( m ), [ -7, -8 ] ] ]
gap> map4 := HomomorphismToSinglePiece( M4, M78, images ); 
magma with objects homomorphism : 
[ [ <mapping: m -> m >, [ -8, -7 ] ], [ IdentityMapping( m ), [ -7, -8 ] ] ]
gap> ImageElm( map4, b87 );
[m3 : -8 -> -7]
gap> ImageElm( map4, ib87 );
[m4 : -8 -> -7]
]]>
</Example>

</Section>


<Section Label="sec-sgphom">
<Heading>Homomorphisms of semigroups and monoids with objects</Heading>

The next example exhibits a homomorphism between transformation 
semigroups with objects. 
<P/>
<Example>
<![CDATA[
gap> t2 := Transformation( [2,2,4,1] );; 
gap> s2 := Transformation( [1,1,4,4] );;
gap> r2 := Transformation( [4,1,3,3] );; 
gap> sgp2 := Semigroup( [ t2, s2, r2 ] );;
gap> SetName( sgp2, "sgp<t2,s2,r2>" );
gap> ##  apparently no method for transformation semigroups available for: 
gap> ##  nat := NaturalHomomorphismByGenerators( sgp, sgp2 );  so we use: 
gap> ##  in the function flip below t is a transformation on [1..n] 
gap> flip := function( t ) 
>     local i, j, k, L, L2, n; 
>     n := DegreeOfTransformation( t );  
>     L := ImageListOfTransformation( t ); 
>     if IsOddInt(n) then n:=n+1; L1:=Concatenation(L,[n]); 
>                    else L1:=L; fi; 
>     L2 := ShallowCopy( L1 );
>     for i in [1..n] do 
>         if IsOddInt(i) then j:=i+1; else j:=i-1; fi; 
>         k := L1[j]; 
>         if IsOddInt(k) then L2[i]:=k+1; else L2[i]:=k-1; fi; 
>     od; 
>     return( Transformation( L2 ) ); 
> end;; 
gap> smap := MappingByFunction( sgp, sgp2, flip );; 
gap> ok := RespectsMultiplication( smap ); 
true
gap> [ t, ImageElm( smap, t ) ]; 
[ Transformation( [ 1, 1, 2, 3 ] ), Transformation( [ 2, 2, 4, 1 ] ) ]
gap> [ s, ImageElm( smap, s ) ]; 
[ Transformation( [ 2, 2, 3, 3 ] ), Transformation( [ 1, 1, 4, 4 ] ) ]
gap> [ r, ImageElm( smap, r ) ]; 
[ Transformation( [ 2, 3, 4, 4 ] ), Transformation( [ 4, 1, 3, 3 ] ) ]
gap> SetName( smap, "smap" ); 
gap> T123 := SemigroupWithObjects( sgp2, [-13,-12,-11] );; 
gap> shom := MagmaWithObjectsHomomorphism( S123, T123, smap, [-11,-12,-13] );; 
gap> it12 := ImageElm( shom, t12 );;  [ t12, it12 ]; 
[ [Transformation( [ 1, 1, 2, 3 ] ) : -1 -> -2], 
  [Transformation( [ 2, 2, 4, 1 ] ) : -13 -> -12] ]
gap> is23 := ImageElm( shom, s23 );;  [ s23, is23 ]; 
[ [Transformation( [ 2, 2, 3, 3 ] ) : -2 -> -3], 
  [Transformation( [ 1, 1, 4, 4 ] ) : -12 -> -11] ]
gap> ir31 := ImageElm( shom, r31 );;  [ r31, ir31 ]; 
[ [Transformation( [ 2, 3, 4, 4 ] ) : -3 -> -1], 
  [Transformation( [ 4, 1, 3, 3 ] ) : -11 -> -13] ]
]]>
</Example>

</Section>


<Section Label="sec-hompieces">
<Heading>Homomorphisms to more than one piece</Heading>

<ManSection>
   <Oper Name="HomomorphismByUnion"
         Arg="src,rng,homs" Label="for magmas with objects" />
<Description>
When <M>f : M \to N</M> and <M>N</M> has more than one connected component, 
then <M>f</M> is a union of homomorphisms, one for each piece in the range. 
</Description>
</ManSection>
<Example>
<![CDATA[
gap> N4 := UnionOfPieces( [ M78, T123 ] );
magma with objects having 2 pieces :-
1: semigroup with objects :-
    magma = sgp<t2,s2,r2>
  objects = [ -13, -12, -11 ]
2: M78
gap> h14 := HomomorphismByUnionNC( N1, N4, [ hom1, shom ] );
magma with objects homomorphism : 
[ magma with objects homomorphism : M78 -> M78
    [ [ <mapping: m -> m >, [ -8, -7 ] ] ], magma with objects homomorphism : 
    [ [ smap, [ -11, -12, -13 ] ] ] ]
gap> ImageElm( h14, a78 );
[m1 : -7 -> -8]
gap> ImageElm( h14, r31 );
[Transformation( [ 4, 1, 3, 3 ] ) : -11 -> -13]
]]>
</Example>

<ManSection>
   <Prop Name="IsInjectiveOnObjects" 
         Arg="mwohom" />
   <Prop Name="IsSurjectiveOnObjects" 
         Arg="mwohom" />
   <Prop Name="IsBijectiveOnObjects" 
         Arg="mwohom" />
   <Prop Name="IsEndomorphismWithObjects" 
         Arg="mwohom" />
   <Prop Name="IsAutomorphismWithObjects" 
         Arg="mwohom" />
<Description>
The meaning of these five properties is obvious. 
</Description>
</ManSection>

<Example>
<![CDATA[
gap> IsInjectiveOnObjects( h14 );
true
gap> IsSurjectiveOnObjects( h14 );
true
gap> IsBijectiveOnObjects( h14 ); 
true
gap> IsEndomorphismWithObjects( h14 ); 
false
gap> IsAutomorphismWithObjects( h14 ); 
false
]]>
</Example>

</Section>

<Section Label="sec-mapbyfun">
<Heading>Mappings defined by a function</Heading>

<ManSection>
   <Oper Name="MappingWithObjectsByFunction"
         Arg="src,rng,fun,imobs" />
   <Prop Name="IsMappingWithObjectsByFunction"
         Arg="map" />
   <Attr Name="UnderlyingFunction"
         Arg="map" />
<Description>
More general mappings, which need not preserve multiplication, 
are available using this operation. 
See section <Ref Sect="sec-autos"/> for an application. 
</Description>
</ManSection>

<Example>
<![CDATA[
gap> flip := function(a) return Arrow(M78,a![1],a![3],a![2]); end;      
function( a ) ... end
gap> flipmap := MappingWithObjectsByFunction( M78, M78, flip, [-8,-7] );
magma with objects mapping by function : M78 -> M78
function: function ( a )
    return Arrow( M78, a![1], a![3], a![2] );
end
gap> a78; ImageElm( flipmap, a78 );                                     
[m2 : -7 -> -8]
[m2 : -8 -> -7]
]]>
</Example>

</Section>

</Chapter>
