1#############################################################################
2##
3#W  alg2map.gi                 The XMODALG package            Zekeriya Arvasi
4#W                                                             & Alper Odabas
5#Y  Copyright (C) 2014-2018, Zekeriya Arvasi & Alper Odabas,
6##
7
8##############################################################################
9##
10#M  Make2dAlgebraMorphism( <src>, <rng>, <shom>, <rhom> ) . . . 2d-object map
11##
12InstallMethod( Make2dAlgebraMorphism,
13    "for 2d-object, 2d-object, homomorphism, homomorphism", true,
14    [ Is2dAlgebraObject, Is2dAlgebraObject, IsAlgebraHomomorphism, IsAlgebraHomomorphism ], 0,
15function( src, rng, shom, rhom )
16
17    local  filter, fam, mor, ok;
18
19    fam := FamilyObj( [ src, rng, shom, rhom ] );
20    filter := Is2dAlgebraMorphismRep;
21    ok := ( ( Source( src ) = Source( shom ) ) and
22            (  Range( src ) = Source( rhom ) ) and
23            ( Source( rng ) = Range( shom ) ) and
24            (  Range( rng ) = Range( rhom ) ) );
25    if not ok then
26        Info( InfoXModAlg, 2, "sources and ranges do not match" );
27        return fail;
28    fi;
29    mor := rec();
30    ObjectifyWithAttributes( mor,
31      NewType( fam, filter ),
32      Source, src,
33      Range, rng,
34      IsEmpty, true,
35      SourceHom, shom,
36      RangeHom, rhom );
37    return mor;
38end );
39
40#############################################################################
41##
42#M  IsPreXModAlgebraMorphism           check diagram of algebra homs commutes
43##
44InstallMethod( IsPreXModAlgebraMorphism,
45    "generic method for pre-crossed module homomorphisms",
46    true, [ Is2dAlgebraMorphism ], 0,
47function( mor )
48
49    local PM, Pact, Pbdy, Prng, Psrc, QM, Qact, Qbdy, Qrng, Qsrc, basPrng,
50          vecPrng, dimPrng, basPsrc, maps, i, j, im, im2, basQrng, vecQrng,
51          dimQrng, basQsrc, maps2, morsrc, morrng, x2, x1, y2, z2, y1, z1,
52          gensrc, genrng, cx1, gx1, gcx1, actx1, actgx1;
53
54    PM := Source( mor );
55    QM := Range( mor );
56    if not ( IsPreXModAlgebra( PM ) and IsPreXModAlgebra( QM ) ) then
57        return false;
58    fi;
59    Psrc := Source( PM );
60    Prng := Range( PM );
61    Pbdy := Boundary( PM );
62    Pact := XModAlgebraAction( PM );
63    Qsrc := Source( QM );
64    Qrng := Range( QM );
65    Qbdy := Boundary( QM );
66    Qact := XModAlgebraAction( QM );
67    morsrc := SourceHom( mor );
68    morrng := RangeHom( mor );
69    gensrc := GeneratorsOfAlgebra( Psrc );
70    genrng := GeneratorsOfAlgebra( Prng );
71    Info( InfoXModAlg, 3, "Checking that the diagram commutes :- \n",
72        "    boundary( morsrc( x ) ) = morrng( boundary( x ) )" );
73    for x2 in gensrc do
74        y1 := ( x2 ^ morsrc ) ^ Qbdy;
75        z1 := ( x2 ^ Pbdy ) ^ morrng;
76        if not ( y1 = z1 ) then
77            Info( InfoXModAlg, 3, "Square does not commute! \n",
78                "when x2= ", x2, " Qbdy( morsrc(x2) )= ", y1, "\n",
79                "              and morrng( Pbdy(x2) )= ", z1 );
80            return false;
81        fi;
82    od;
83    # now check that the actions commute:
84    Info( InfoXModAlg, 3,
85          "Checking:  morsrc(x2^x1) = morsrc(x2)^(morrng(x1))" );
86	if ( IsLeftModuleGeneralMapping(Pact) = true ) then
87	basPrng := Basis(Prng);
88	vecPrng := BasisVectors(basPrng);
89	dimPrng := Dimension(Prng);
90	basPsrc := Basis(Psrc);
91	maps := ListWithIdenticalEntries(dimPrng,0);
92	for j in [1..dimPrng] do
93		im := List(basPsrc, b -> vecPrng[j]*b);
94		maps[j] := LeftModuleHomomorphismByImages(Psrc,Psrc,basPsrc,im);
95	od;
96
97	basQrng := Basis(Qrng);
98	vecQrng := BasisVectors(basQrng);
99	dimQrng := Dimension(Qrng);
100	basQsrc := Basis(Qsrc);
101	maps2 := ListWithIdenticalEntries(dimQrng,0);
102	for j in [1..dimQrng] do
103		im2 := List(basQsrc, b -> vecQrng[j]*b);
104		maps2[j] := LeftModuleHomomorphismByImages(Qsrc,Qsrc,basQsrc,im2);
105	od;
106
107	for x2 in gensrc do
108        for x1 in genrng do
109		cx1 := Coefficients(basPrng,x1);
110		actx1 := Sum(List([1..dimPrng], i -> cx1[i]*maps[i]));
111		gx1 := x1 ^ morrng;
112		gcx1 := Coefficients(basQrng,gx1);
113		actgx1 := Sum(List([1..dimQrng], i -> gcx1[i]*maps2[i]));
114            y2 := (x2^actx1)^morsrc;
115            z2 := (x2^morsrc)^actgx1;
116            if not ( y2 = z2 ) then
117                Info( InfoXModAlg, 2, "Actions do not commute! \n",
118                      "When  x2 = ", x2, "  and  x1 = ", x1, "\n",
119                      "           morsrc(x2^x1) = ", y2, "\n",
120                      "and morsrc(x2)^(morrng(x1) = ", z2 );
121                return false;
122            fi;
123        od;
124    od;
125	else
126    for x2 in gensrc do
127        for x1 in genrng do
128            y2 := ( [ x1 , x2 ] ^ Pact) ^ morsrc;
129            z2 := [ x1 ^ morrng , x2 ^ morsrc ] ^ Qact ;
130            if not ( y2 = z2 ) then
131                Info( InfoXModAlg, 2, "Actions do not commute! \n",
132                      "When  x2 = ", x2, "  and  x1 = ", x1, "\n",
133                      "           morsrc(x2^x1) = ", y2, "\n",
134                      "and morsrc(x2)^(morrng(x1) = ", z2 );
135                return false;
136            fi;
137        od;
138    od;
139	fi;
140    return true;
141end );
142
143#############################################################################
144##
145#F  Display( <mor> ) . . . . print details of a (pre-)crossed module morphism
146##
147InstallMethod( Display, "display a morphism of pre-crossed modules", true,
148    [ IsPreXModAlgebraMorphism ], 0,
149    function( mor )
150
151    local morsrc, morrng, gensrc, genrng, imsrc, imrng, P, Q, name, ok;
152    name := Name( mor );
153    P := Source( mor );
154    Q := Range( mor );
155    morsrc := SourceHom( mor );
156    gensrc := GeneratorsOfAlgebra( Source( P ) );
157    morrng := RangeHom( mor );
158    genrng := GeneratorsOfAlgebra( Range( P ) );
159    if IsXModAlgebraMorphism( mor ) then
160        Print( "\nMorphism of crossed modules :- \n" );
161    else
162        Print( "\nMorphism of pre-crossed modules :- \n" );
163    fi;
164## temporary fix (21/03/18)
165##    Print( ": Source = ", P, " with generating sets:\n  " );
166##    Print( gensrc, "\n  ", genrng, "\n" );
167    Print( ": Source = " );
168    ViewObj( P );
169    Print( "\n" );
170    if ( Q = P ) then
171        Print( ": Range = Source\n" );
172    else
173##        Print( ":  Range = ", Q, " with generating sets:\n  " );
174    Print( ":  Range = " );
175    ViewObj( Q );
176    Print( "\n" );
177## temporary removal (21/03/18)
178##        Print( GeneratorsOfAlgebra( Source( Q ) ), "\n" );
179##        Print( "  ", GeneratorsOfAlgebra( Range( Q ) ), "\n" );
180    fi;
181    imsrc := List( gensrc, s -> Image( morsrc, s ) );
182    Print( ": Source Homomorphism maps source generators to:\n" );
183    Print( "  ", imsrc, "\n" );
184    imrng := List( genrng, r -> Image( morrng, r ) );
185    Print( ": Range Homomorphism maps range generators to:\n" );
186    Print( "  ", imrng, "\n" );
187    Print( "\n" );
188end );
189
190#############################################################################
191##
192#M  IsXModAlgebraMorphism
193##
194InstallMethod( IsXModAlgebraMorphism,
195    "generic method for pre-crossed module morphisms", true,
196    [ IsPreXModAlgebraMorphism ], 0,
197function( mor )
198    return ( IsXModAlgebra( Source( mor ) ) and IsXModAlgebra(  Range( mor ) ) );
199end );
200
201InstallMethod( IsXModAlgebraMorphism, "generic method for 2d-mappings", true,
202    [ Is2dAlgebraMorphism ], 0,
203function( mor )
204    local  ispre;
205    ispre := IsPreXModAlgebraMorphism( mor );
206    if not ispre then
207        return false;
208    else
209        return ( IsXModAlgebra( Source( mor ) ) and IsXModAlgebra(  Range( mor ) ) );
210    fi;
211end );
212
213
214##############################################################################
215##
216#M  IdentityMapping( <obj> )
217##
218InstallOtherMethod( IdentityMapping, "for 2d-algebra object", true,
219    [ Is2dAlgebraObject ], 0,
220function( obj )
221
222    local  shom, rhom;
223
224    shom := IdentityMapping( Source( obj ) );
225    rhom := IdentityMapping( Range( obj ) );
226    if IsPreXModAlgebraObj( obj ) then
227###xmodu ekleyince tekrar duzenle########
228        return PreXModAlgebraMorphismByHoms( obj, obj, shom, rhom );
229##         return fail;
230    elif IsPreCat1AlgebraObj( obj ) then
231        return PreCat1AlgebraMorphismByHoms( obj, obj, shom, rhom );
232    else
233        return fail;
234    fi;
235end );
236
237##############################################################################
238##
239#F  PreXModAlgebraMorphism( <src>,<rng>,<srchom>,<rnghom> ) pre-crossed mod morphism
240##
241##  (need to extend to other sets of parameters)
242##
243InstallGlobalFunction( PreXModAlgebraMorphism, function( arg )
244
245    local  nargs;
246    nargs := Length( arg );
247
248    # two pre-xmods and two homomorphisms
249    if ( ( nargs = 4 ) and IsPreXModAlgebra( arg[1] ) and IsPreXModAlgebra( arg[2])
250                       and IsAlgebraHomomorphism( arg[3] )
251                       and IsAlgebraHomomorphism( arg[4] ) ) then
252        return PreXModAlgebraMorphismByHoms( arg[1], arg[2], arg[3], arg[4] );
253    fi;
254    # alternatives not allowed
255    Info( InfoXModAlg, 2, "usage: PreXModAlgebraMorphism( src, rng, srchom, rnghom );" );
256    return fail;
257end );
258
259###############################################################################
260##
261#F  XModAlgebraMorphism( <src>, <rng>, <srchom>, <rnghom> )    crossed module morphism
262##
263##  (need to extend to other sets of parameters)
264##
265InstallGlobalFunction( XModAlgebraMorphism, function( arg )
266
267    local  nargs;
268    nargs := Length( arg );
269
270    # two xmods and two homomorphisms
271    if ( ( nargs = 4 ) and IsXModAlgebra( arg[1] ) and IsXModAlgebra( arg[2])
272                       and IsAlgebraHomomorphism( arg[3] )
273                       and IsAlgebraHomomorphism( arg[4] ) ) then
274        return XModAlgebraMorphismByHoms( arg[1], arg[2], arg[3], arg[4] );
275    fi;
276    # alternatives not allowed
277    Info( InfoXModAlg, 2, "usage: XModAlgebraMorphism( src, rng, srchom, rnghom );" );
278    return fail;
279end );
280
281##############################################################################
282##
283#M  XModMorphismByHoms( <Xs>, <Xr>, <hsrc>, <hrng> )  . . . make xmod morphism
284##
285InstallMethod( XModAlgebraMorphismByHoms, "for 2 xmods and 2 homomorphisms", true,
286    [ IsXModAlgebra, IsXModAlgebra, IsAlgebraHomomorphism, IsAlgebraHomomorphism ], 0,
287function( src, rng, srchom, rnghom )
288
289    local  mor, ok;
290    mor := PreXModAlgebraMorphismByHoms( src, rng, srchom, rnghom );
291    ok := IsXModAlgebraMorphism( mor );
292    if not ok then
293        return fail;
294    fi;
295    return mor;
296end );
297
298###############################################################################
299##
300#M  PreXModAlgebraMorphismByHoms( <P>, <Q>, <hsrc>, <hrng> ) . . make prexmod morphism
301##
302InstallMethod( PreXModAlgebraMorphismByHoms,
303    "for pre-xmod, pre-xmod, homomorphism, homomorphism,", true,
304    [ IsPreXModAlgebra, IsPreXModAlgebra, IsAlgebraHomomorphism,
305      IsAlgebraHomomorphism ], 0,
306function( src, rng, srchom, rnghom )
307
308    local  filter, fam, mor, ok, nsrc, nrng, name;
309
310    if not ( IsAlgebraHomomorphism(srchom) and IsAlgebraHomomorphism(rnghom) ) then
311        Info( InfoXModAlg, 2, "source and range mappings must be algebra homs" );
312        return fail;
313    fi;
314    mor := Make2dAlgebraMorphism( src, rng, srchom, rnghom );
315    if not IsPreXModAlgebraMorphism( mor ) then
316        Info( InfoXModAlg, 2, "not a morphism of pre-crossed modules.\n" );
317        return fail;
318    fi;
319    if ( HasName( Source(src) ) and HasName( Range(src) ) ) then
320        nsrc := Name( src );
321    else
322        nsrc := "[..]";
323    fi;
324    if ( HasName( Source(rng) )and HasName( Range(rng) ) ) then
325        nrng := Name( rng );
326    else
327        nrng := "[..]";
328    fi;
329    name := Concatenation( "[", nsrc, " => ", nrng, "]" );
330    SetName( mor, name );
331    ok := IsXModAlgebraMorphism( mor );
332   # ok := IsSourceMorphism( mor );
333    return mor;
334end );
335
336###############################################################################
337##
338#F  PreCat1AlgebraMorphism( <src>,<rng>,<srchom>,<rnghom> )    pre-cat1-algebra morphism
339##
340##  (need to extend to other sets of parameters)
341##
342InstallGlobalFunction( PreCat1AlgebraMorphism, function( arg )
343
344    local  nargs;
345    nargs := Length( arg );
346
347    # two pre-cat1s and two homomorphisms
348    if ( ( nargs = 4 ) and IsPreCat1Algebra( arg[1] ) and IsPreCat1Algebra( arg[2])
349                       and IsAlgebraHomomorphism( arg[3] )
350                       and IsAlgebraHomomorphism( arg[4] ) ) then
351        return PreCat1AlgebraMorphismByHoms( arg[1], arg[2], arg[3], arg[4] );
352    fi;
353    # alternatives not allowed
354    Info( InfoXModAlg, 2, "usage: PreCat1AlgebraMorphism( src, rng, srchom, rnghom );" );
355    return fail;
356end );
357
358###############################################################################
359##
360#F  Cat1AlgebraMorphism( <src>, <rng>, <srchom>, <rnghom> )        cat1-algebra morphism
361##
362##  (need to extend to other sets of parameters)
363##
364InstallGlobalFunction( Cat1AlgebraMorphism, function( arg )
365
366    local  nargs;
367    nargs := Length( arg );
368
369    # two cat1s and two homomorphisms
370    if ( ( nargs = 4 ) and IsCat1Algebra( arg[1] ) and IsCat1Algebra( arg[2])
371                       and IsAlgebraHomomorphism( arg[3] )
372                       and IsAlgebraHomomorphism( arg[4] ) ) then
373        return Cat1AlgebraMorphismByHoms( arg[1], arg[2], arg[3], arg[4] );
374    fi;
375    # alternatives not allowed
376    Info( InfoXModAlg, 2, "usage: Cat1AlgebraMorphism( src, rng, srchom, rnghom );" );
377    return fail;
378end );
379
380##############################################################################
381##
382#M  IsPreCat1AlgebraMorphism . . check that the diagram of group homs commutes
383##
384InstallMethod( IsPreCat1AlgebraMorphism,
385    "generic method for mappings of 2d-objects", true,
386    [ Is2dAlgebraMorphism ], 0,
387function( mor )
388
389    local  PCG, Prng, Psrc, Pt, Ph, Pe, QCG, Qrng, Qsrc, Qt, Qh, Qe,
390           morsrc, morrng, x2, x1, y2, z2, y1, z1, gensrc, genrng;
391
392    PCG := Source( mor );
393    QCG := Range( mor );
394    if not ( IsPreCat1Algebra( PCG ) and IsPreCat1Algebra( QCG ) ) then
395        return false;
396    fi;
397    Psrc := Source( PCG );
398    Prng := Range( PCG );
399    Pt := TailMap( PCG );
400    Ph := HeadMap( PCG );
401    Pe := RangeEmbedding( PCG );
402    Qsrc := Source( QCG );
403    Qrng := Range( QCG );
404    Qt := TailMap( QCG );
405    Qh := HeadMap( QCG );
406    Qe := RangeEmbedding( QCG );
407    morsrc := SourceHom( mor );
408    morrng := RangeHom( mor );
409    # now check that the homomorphisms commute
410    gensrc := GeneratorsOfAlgebra( Psrc );
411    genrng := GeneratorsOfAlgebra( Prng );
412    Info( InfoXModAlg, 3,
413          "Checking that the diagrams commute :- \n",
414          "    tail/head( morsrc( x ) ) = morrng( tail/head( x ) )" );
415    for x2 in gensrc do
416        y1 := ( x2 ^ morsrc ) ^ Qt;
417        z1 := ( x2 ^ Pt ) ^ morrng;
418        y2 := ( x2 ^ morsrc ) ^ Qh;
419        z2 := ( x2 ^ Ph ) ^ morrng;
420        if not ( ( y1 = z1 ) and ( y2 = z2 ) ) then
421            Info( InfoXModAlg, 3, "Square does not commute! \n",
422                  "when x2= ", x2, " Qt( morsrc(x2) )= ", y1, "\n",
423                  "              and morrng( Pt(x2) )= ", z1, "\n",
424                  "              and Qh( morsrc(x2) )= ", y2, "\n",
425                  "              and morrng( Ph(x2) )= ", z2 );
426            return false;
427        fi;
428    od;
429    for x2 in genrng do
430        y1 := ( x2 ^ morrng ) ^ Qe;
431        z1 := ( x2 ^ Pe ) ^ morsrc;
432        if not ( y1 = z1 ) then
433            Info( InfoXModAlg, 3, "Square does not commute! \n",
434                  "when x2= ", x2, " Qe( morrng(x2) )= ", y1, "\n",
435                  "              and morsrc( Pe(x2) )= ", z1 );
436            return false;
437        fi;
438    od;
439    return true;
440end );
441
442#############################################################################
443##
444#F  Display( <mor> ) . . . . . . print details of a (pre-)cat1-algebra morphism
445##
446InstallMethod( Display, "display a morphism of pre-cat1 algebras", true,
447    [ IsPreCat1AlgebraMorphism ], 0,
448function( mor )
449
450    local  morsrc, morrng, gensrc, genrng, P, Q, name, ok;
451
452    if not HasName( mor ) then
453        # name := PreCat1AlgebraMorphismName( mor );
454        SetName( mor, "[..=>..]=>[..=>..]" );
455    fi;
456    name := Name( mor );
457    P := Source( mor );
458    Q := Range( mor );
459    morsrc := SourceHom( mor );
460    gensrc := GeneratorsOfAlgebra( Source( P ) );
461    morrng := RangeHom( mor );
462    genrng := GeneratorsOfAlgebra( Range( P ) );
463    if IsCat1AlgebraMorphism( mor ) then
464        Print( "\nMorphism of cat1-algebras :- \n" );
465    else
466        Print( "\nMorphism of pre-cat1 algebras :- \n" );
467    fi;
468    Print( ": Source = ", P, " with generating sets:\n  " );
469    Print( gensrc, "\n  ", genrng, "\n" );
470    if ( Q = P ) then
471        Print( ": Range = Source\n" );
472    else
473        Print( ":  Range = ", Q, " with generating sets:\n  " );
474        Print( GeneratorsOfAlgebra( Source( Q ) ), "\n" );
475        Print( "  ", GeneratorsOfAlgebra( Range( Q ) ), "\n" );
476    fi;
477    Print( ": Source Homomorphism maps source generators to:\n" );
478    Print( "  ", List( gensrc, s -> Image( morsrc, s ) ), "\n" );
479    Print( ": Range Homomorphism maps range generators to:\n" );
480    Print( "  ", List( genrng, r -> Image( morrng, r ) ), "\n" );
481	Print( "\n" );
482end );
483
484#############################################################################
485##
486#M  Name                                                       for a pre-xmod
487##
488InstallMethod( Name, "method for a 2d-mapping", true, [ Is2dAlgebraMorphism ], 0,
489function( mor )
490
491    local  nsrc, nrng, name;
492
493    if HasName( Source( mor ) ) then
494        nsrc := Name( Source( mor ) );
495    else
496        nsrc := "[...]";
497    fi;
498    if HasName( Range( mor ) ) then
499        nrng := Name( Range( mor ) );
500    else
501        nrng := "[...]";
502    fi;
503    name := Concatenation( "[", nsrc, " => ", nrng, "]" );
504    SetName( mor, name );
505    return name;
506end );
507
508#############################################################################
509##
510#M  IsCat1AlgebraMorphism
511##
512InstallMethod( IsCat1AlgebraMorphism, "generic method for cat1-algebra homomorphisms",
513    true, [ IsPreCat1AlgebraMorphism ], 0,
514function( mor )
515    return ( IsCat1Algebra( Source( mor ) ) and IsCat1Algebra(  Range( mor ) ) );
516end );
517
518InstallMethod( IsCat1AlgebraMorphism, "generic method for 2d-mappings", true,
519    [ Is2dAlgebraMorphism ], 0,
520function( mor )
521    local  ispre;
522    ispre := IsPreCat1AlgebraMorphism( mor );
523    if not ispre then
524        return false;
525    else
526        return ( IsCat1Algebra( Source( mor ) ) and IsCat1Algebra(  Range( mor ) ) );
527    fi;
528end );
529
530##############################################################################
531##
532#M  PreCat1AlgebraMorphismByHoms( <P>, <Q>, <hsrc>, <hrng> ) . make pre-cat1-alg morphism
533##
534InstallMethod( PreCat1AlgebraMorphismByHoms,
535    "for pre-cat1-algebra, pre-cat1-algebra, homomorphism, homomorphism,",
536    true,
537    [ IsPreCat1Algebra, IsPreCat1Algebra, IsAlgebraHomomorphism, IsAlgebraHomomorphism ], 0,
538function( src, rng, srchom, rnghom )
539
540    local  filter, fam, mor, ok, nsrc, nrng, name;
541
542    if not ( IsAlgebraHomomorphism(srchom) and IsAlgebraHomomorphism(rnghom) ) then
543        Info( InfoXModAlg, 2, "source and range mappings must be algebra homs" );
544        return fail;
545    fi;
546    mor := Make2dAlgebraMorphism( src, rng, srchom, rnghom );
547    if not IsPreCat1AlgebraMorphism( mor ) then
548        Info( InfoXModAlg, 2, "not a morphism of pre-cat1 algebras.\n" );
549        return fail;
550    fi;
551    if ( HasName( Source(src) ) and HasName( Range(src) ) ) then
552        nsrc := Name( src );
553    else
554        nsrc := "[..]";
555    fi;
556    if ( HasName( Source(rng) ) and HasName( Range(rng) ) ) then
557        nrng := Name( rng );
558    else
559        nrng := "[..]";
560    fi;
561    name := Concatenation( "[", nsrc, " => ", nrng, "]" );
562    SetName( mor, name );
563    ok := IsCat1AlgebraMorphism( mor );
564    return mor;
565end );
566
567#############################################################################
568##
569#M  Cat1AlgebraMorphismByHoms( <Cs>, <Cr>, <hsrc>, <hrng> ) . . . make xmod morphism
570##
571InstallMethod( Cat1AlgebraMorphismByHoms, "for 2 cat1s and 2 homomorphisms", true,
572    [ IsCat1Algebra, IsCat1Algebra, IsAlgebraHomomorphism, IsAlgebraHomomorphism ], 0,
573function( src, rng, srchom, rnghom )
574
575    local  mor, ok;
576    mor := PreCat1AlgebraMorphismByHoms( src, rng, srchom, rnghom );
577    ok := IsCat1AlgebraMorphism( mor );
578    if not ok then
579        return fail;
580    fi;
581    return mor;
582end );
583
584##############################################################################
585##
586#M  ViewObj( <mor> ) . . . . . . . . . .  view a (pre-)crossed module morphism
587##
588InstallMethod( ViewObj, "method for a morphism of pre-crossed modules", true,
589    [ IsPreXModAlgebraMorphism ], 0,
590function( mor )
591    if HasName( mor ) then
592        Print( Name( mor ), "\n" );
593    else
594        Print( "[", Source( mor ), " => ", Range( mor ), "]" );
595    fi;
596end );
597
598##############################################################################
599##
600#M  PrintObj( <mor> ) . . . . . . . . .  print a (pre-)crossed module morphism
601##
602InstallMethod( PrintObj, "method for a morphism of pre-crossed modules", true,
603    [ IsPreXModAlgebraMorphism ], 0,
604function( mor )
605    if HasName( mor ) then
606        Print( Name( mor ), "\n" );
607    else
608        Print( "[", Source( mor ), " => ", Range( mor ), "]" );
609    fi;
610end );
611
612#############################################################################
613##
614#M  ViewObj( <PCG> ) . . . . . . . . . . . . . . . . view a (pre-)cat1-algebras
615##
616InstallMethod( ViewObj, "method for a morphism of pre-cat1 algebras", true,
617    [ IsPreCat1AlgebraMorphism ], 0,
618function( mor )
619    if HasName( mor ) then
620        Print( Name( mor ), "\n" );
621    else
622        Print( "[", Source( mor ), " => ", Range( mor ), "]" );
623    fi;
624end );
625
626##############################################################################
627##
628#M  PrintObj( <PCG> ) . . . . . . . . . . . . . . . . print a (pre-)cat1-algebras
629##
630InstallMethod( PrintObj, "method for a morphism of pre-cat1 algebras", true,
631    [ IsPreCat1AlgebraMorphism ], 0,
632function( mor )
633    if HasName( mor ) then
634        Print( Name( mor ), "\n" );
635    else
636        Print( "[", Source( mor ), " => ", Range( mor ), "]" );
637    fi;
638end );
639
640##############################################################################
641##
642#M  Kernel . . . . . . of morphisms of pre-crossed modules of algebras and pre-cat1-groups of algebras
643##
644InstallOtherMethod( Kernel, "generic method for 2d-mappings",
645     true, [ Is2DimensionalMapping and Is2dAlgebraMorphism ], 0,
646function( map )
647
648    local  kerS, kerR, K;
649    if HasKernel2DimensionalMapping( map ) then
650        return Kernel2DimensionalMapping( map );
651    fi;
652    kerS := Kernel( SourceHom( map ) );
653    kerR := Kernel( RangeHom( map ) );
654    K := Sub2dAlgebra( Source( map ), kerS, kerR );
655    SetKernel2DimensionalMapping( map, K );
656    return K;
657end );
658
659##############################################################################
660##
661#M  IsInjective( map ) . . . . . . . . . . . . . . . . . . .  for a 2dAlg-mapping
662##
663InstallOtherMethod( IsInjective,
664    "method for a 2dAlg-mapping", true, [ Is2dAlgebraMorphism ], 0,
665    map -> (     IsInjective( SourceHom( map ) )
666             and IsInjective( RangeHom( map ) ) )  );
667
668##############################################################################
669##
670#M  IsSurjective( map ) . . . . . . . . . . . . . . . . . . . for a 2dAlg-mapping
671##
672InstallOtherMethod( IsSurjective,
673    "method for a 2dAlg-mapping", true, [ Is2dAlgebraMorphism ], 0,
674    map -> (     IsSurjective( SourceHom( map ) )
675             and IsSurjective( RangeHom( map ) ) )  );
676
677##############################################################################
678##
679#M  IsSingleValued( map ) . . . . . . . . . . . . . . . . . . for a 2dAlg-mapping
680##
681InstallOtherMethod( IsSingleValued,
682    "method for a 2dAlg-mapping", true, [ Is2dAlgebraMorphism ], 0,
683    map -> (     IsSingleValued( SourceHom( map ) )
684             and IsSingleValued( RangeHom( map ) ) )  );
685
686##############################################################################
687##
688#M  IsTotal( map ) . . . . . . . . . . . . . . . . . . . . .  for a 2dAlg-mapping
689##
690InstallOtherMethod( IsTotal,
691    "method for a 2dAlg-mapping", true, [ Is2dAlgebraMorphism ], 0,
692    map -> (     IsTotal( SourceHom( map ) )
693             and IsTotal( RangeHom( map ) ) )  );
694
695##############################################################################
696##
697#M  IsBijective( map ) . . . . . . . . . . . . . . . . . . .  for a 2dAlg-mapping
698##
699InstallOtherMethod( IsBijective,
700    "method for a 2d-mapping", true, [ Is2dAlgebraMorphism ], 0,
701    map -> (     IsBijective( SourceHom( map ) )
702             and IsBijective( RangeHom( map ) ) )  );
703
704#############################################################################
705##
706#M  ImagesSource( <mor> ) . . . . for pre-xmod and pre-cat1 algebra morphisms
707##
708InstallOtherMethod( ImagesSource, "image of pre-xmod/cat1 algebra morphism",
709    true, [ Is2DimensionalMapping and Is2dAlgebraMorphism ], 0,
710function( mor )
711
712    local Shom, Rhom, imS, imR, sub;
713
714    Shom := SourceHom( mor );
715    Rhom := RangeHom( mor );
716    imS := ImagesSource( Shom );
717    imR := ImagesSource( Rhom );
718    sub := Sub2dAlgebra( Range( mor ), imS, imR );
719    return sub;
720end );
721
722