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