############################################################################# 
## 
#W  mwo.gd                    GAP4 package `Gpd'                Chris Wensley 
##
#H  @(#)Id: "gpd/gap/mwo.gd", v.1.05 2008/11/21 
## 
##  This file contains the declarations of elements, magma, etc., and their 
##  families in the case of many objects.  So each algebraic structure comes 
##  with a set of objects, and each element $e$ has a tail object $te$ and a 
##  head object $he$, and multiplies partially if composable: on the left 
##  with those elements in its family which have head $te$, and on the right 
##  with those elements of its family which have tail $he$.  Non-composable 
##  elements return $fail$ when multiplied. 
##  
Revision.("gpd/gap/mwo_gd") :=
             "@(#)$Id: mwo.gd,v 1.05 2008/11/21 gap Exp $";


###########################  DOMAIN WITH OBJECTS  ########################### 

############################################################################# 
## 
#C  IsDomainWithObjects( <obj> ) . . test if object is a domain wwith objects 
## 
DeclareCategory( "IsDomainWithObjects", IsDomain ); 

############################################################################ 
## 
#F  DomainWithObjects( <dom>, <obs> ) 
##
DeclareGlobalFunction( "DomainWithObjects" ); 

############################################################################# 
## 
#P  IsSinglePieceDomain( <dwo> )
#P  IsDiscreteDomain( <dwo> ) 
#P  IsDirectProductWithCompleteGraphDomain( <dwo> )
## 
DeclareProperty( "IsSinglePieceDomain", IsDomainWithObjects );  
DeclareProperty( "IsDiscreteDomain", IsDomainWithObjects ); 
DeclareProperty( "IsDirectProductWithCompleteGraphDomain", 
    IsDomainWithObjects ); 

############################################################################# 
## 
#A  ObjectList( <dwo> ) 
#A  Pieces( <dwo> ) 
## 
DeclareAttribute( "ObjectList", IsDomainWithObjects ); 
DeclareAttribute( "Pieces", IsDomainWithObjects );  
  
############################################################################## 
## 
#R  IsPiecesRep( <dwo> )                
## 
##  A domain with objects is a list of single piece domains
## 
DeclareRepresentation( "IsPiecesRep", 
    IsDomainWithObjects and IsAttributeStoringRep, 
    [ "Pieces", "ObjectList" ] ); 
 
############################################################################# 
## 
#O  UnionOfPiecesNC( <pieces> )              
#O  UnionOfPieces( <pieces> )              
## 
DeclareOperation( "UnionOfPiecesNC", [ IsList, IsInt ] );    
DeclareOperation( "UnionOfPieces", [ IsList ] );

############################################################################# 
## 
#O  PieceOfObject( <dwo>, <obj> )                                    
#O  PieceNrOfObject( <dwo>, <obj> )                                    
## 
DeclareOperation( "PieceOfObject", [ IsDomainWithObjects, IsScalar ] );  
DeclareOperation( "PieceNrOfObject", [ IsDomainWithObjects, IsScalar ] );

############################################################################# 
## 
#O  TypeOfDomainWithObjects( <dwo> ) 
## 
DeclareOperation( "TypeOfDomainWithObjects", [ IsList ] );  


########################  MULT ELTS WITH OBJECTS  ########################### 

############################################################################# 
## 
#C  IsMultiplicativeElementWithObjects( <elt> ) 
## 
DeclareCategory( "IsMultiplicativeElementWithObjects", 
    IsMultiplicativeElement ); 
DeclareCategoryCollections( "IsMultiplicativeElementWithObjects" ); 
DeclareCategoryCollections( "IsMultiplicativeElementWithObjectsCollection" ); 
DeclareCategoryCollections( "IsMultiplicativeElementWithObjectsCollColl" ); 
##  DeclareSynonyms ??? 

############################################################################# 
## 
#C  IsMultiplicativeElementWithObjectsAndOnes( <elt> ) 
## 
##  An identity element at object $o$ is an element $1_o$ which is a left 
##  identity for $e$ when $te=o$ and a right identity for $e$ when $he=o$. 
DeclareCategory( "IsMultiplicativeElementWithObjectsAndOnes", 
    IsMultiplicativeElementWithObjects ); 
DeclareCategoryCollections( "IsMultiplicativeElementWithObjectsAndOnes" ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndOnesCollection" ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndOnesCollColl" ); 

############################################################################# 
## 
#C  IsMultiplicativeElementWithObjectsAndInversesIfNonzero( <elt> ) 
## 
##  An element $e$ has inverse $f$ provided $e*f=1_{te}$ and $f*e=1_{he}$. 
DeclareCategory( "IsMultiplicativeElementWithObjectsAndInversesIfNonzero", 
    IsMultiplicativeElementWithObjectsAndOnes ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndInversesIfNonzero" ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndInversesIfNonzeroCollection" ); 
DeclareCategoryCollections(     
    "IsMultiplicativeElementWithObjectsAndInversesIfNonzeroCollColl" ); 

############################################################################# 
## 
#C  IsMultiplicativeElementWithObjectsAndInverses( <elt> ) 
## 
DeclareCategory( "IsMultiplicativeElementWithObjectsAndInverses", 
    IsMultiplicativeElementWithObjectsAndInversesIfNonzero ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndInverses" ); 
DeclareCategoryCollections( 
    "IsMultiplicativeElementWithObjectsAndInversesCollection" ); 
DeclareCategoryCollections(     
    "IsMultiplicativeElementWithObjectsAndInversesCollColl" ); 

############################################################################# 
## 
#R  IsMultiplicativeElementWithObjectsPosRep 
## 
##  DeclareRepresentation( "IsMultiplicativeElementWithObjectsPosRep", 
##    IsPositionalObjectRep and IsMultiplicativeElementWithObjects, [1,2,3] ); 

############################################################################## 
## 
#A  Arrowelt( <ewo> ) 
#A  Arrowtail( <ewo> ) 
#A  Arrowhead( <ewo> ) 
## 
DeclareOperation( "Arrowelt", [ IsMultiplicativeElementWithObjects ] ); 
DeclareOperation( "Arrowtail", [ IsMultiplicativeElementWithObjects ] ); 
DeclareOperation( "Arrowhead", [ IsMultiplicativeElementWithObjects ] ); 



###########################  MAGMA WITH OBJECTS  ############################ 

############################################################################# 
## 
#C  IsMagmaWithObjects( <dwo> )  . . . test if object is a magma with objects 
#C  IsMagmaWithObjectsAndOnes( <dwo> ) . . . . . . . . . . . . . and has ones
#C  IsMagmaWithObjectsAndInversesIfNonzero( <dwo> ) . . and has some inverses
#C  IsMagmaWithObjectsAndInverses( <dwo> ) . . . . . . . . . and has inverses
##
##  A *magma with objects* in {\GAP} is a domain $M$ with (not necessarily 
##  associative) partial mutliplication. 
## 
DeclareCategory( "IsMagmaWithObjects", IsDomainWithObjects and 
    IsMagma and IsMultiplicativeElementWithObjectsCollection ); 
DeclareCategory( "IsMagmaWithObjectsAndOnes", 
    IsMagmaWithObjects and 
    IsMultiplicativeElementWithObjectsAndOnesCollection ); 
DeclareCategory( "IsMagmaWithObjectsAndInversesIfNonzero", 
    IsMagmaWithObjectsAndOnes and 
    IsMultiplicativeElementWithObjectsAndInversesIfNonzeroCollection ); 
DeclareCategory( "IsMagmaWithObjectsAndInverses", 
    IsMagmaWithObjectsAndInversesIfNonzero and 
    IsMultiplicativeElementWithObjectsAndInversesCollection ); 

############################################################################# 
## 
#P  IsSinglePiece( <mwo> )
#P  IsDiscrete( <mwo> ) 
#P  IsDirectProductWithCompleteGraph( <mwo> )
## 
DeclareSynonymAttr( "IsSinglePiece", 
    IsMagmaWithObjects and IsSinglePieceDomain );
DeclareSynonymAttr( "IsDiscrete", 
    IsMagmaWithObjects and IsDiscreteDomain );
DeclareSynonymAttr( "IsDirectProductWithCompleteGraph", 
    IsMagmaWithObjects and IsDirectProductWithCompleteGraphDomain );

############################################################################ 
## 
#F  MagmaWithObjects( <mag>, <obs> ) 
##
##  A standard single piece magma with objects has elements $(e,t,h)$ 
##  where $e$ is an element of <mag> and $t$, $h$ are the tail and head. 
##  Multiplication is given by  $(e,t,h)*(f,h,k) = (e*f,t,k)$. 
##  Other constructors are possible. 
## 
DeclareGlobalFunction( "MagmaWithObjects" ); 

############################################################################# 
## 
#A  GeneratorsOfMagmaWithObjects( <mwo> ) 
#A  GeneratorsOfMagmaWithObjectsAndOnes( <mwo> ) 
#A  FamilyOfMagmaWithObjects( <mwo> ) 
## 
DeclareAttribute( "GeneratorsOfMagmaWithObjects", IsMagmaWithObjects ); 
DeclareAttribute( "GeneratorsOfMagmaWithObjectsAndOnes", 
    IsMagmaWithObjectsAndOnes ); 
DeclareAttribute( "FamilyOfMagmaWithObjects", IsMagmaWithObjects ); 

############################################################################# 
## 
#R  IsMWOSinglePieceRep 
## 
#?  Is .eltsfam still needed ??
##
DeclareRepresentation( "IsMWOSinglePieceRep", 
    IsComponentObjectRep and IsAttributeStoringRep and IsMagmaWithObjects, 
    [ "objects", "magma", "eltsfam" ] ); 

############################################################################# 
## 
#O  SinglePieceMagmaWithObjects( <mag>, <obs> ) 
#O  DomainWithSingleObject( <mag>, <obj> )
## 
DeclareOperation( "SinglePieceMagmaWithObjects", [ IsMagma, IsCollection ] ); 
DeclareOperation( "DomainWithSingleObject", [ IsDomain, IsObject ] );    


############################################################################# 
## 
#O  MultiplicativeElementWithObjects( <mwo>, <elt>, <tail>, <head> ) 
#O  MultiplicativeElementWithObjectsNC( <mwo>, <elt>, <tail>, <head> ) 
## 
DeclareOperation( "MultiplicativeElementWithObjects", 
    [ IsMagmaWithObjects, IsMultiplicativeElement, IsScalar, IsScalar ] ); 
DeclareOperation( "MultiplicativeElementWithObjectsNC", 
    [ IsMagmaWithObjects, IsMultiplicativeElement, IsScalar, IsScalar ] ); 
    


################################  SEMIGROUPS  ###############################

#############################################################################
##
#P  IsSemigroupWithObjects( <mwo> )
##
##  returns `true' if the object <obj> is a semigroup & a magma with objects.
##
#?  why SynonymAttr ??  surely a category ?? 
##
DeclareSynonymAttr( "IsSemigroupWithObjects",
    IsMagmaWithObjects and IsAssociative );

############################################################################ 
## 
#F  SemigroupWithObjects( <mag>, <obs> )  
##
##  This is a magma with objects where the vertex magmas are semigroups. 
## 
DeclareGlobalFunction( "SemigroupWithObjects" ); 

############################################################################# 
## 
#O  SinglePieceSemigroupWithObjects( <sgp>, <obs> ) 
## 
DeclareOperation( "SinglePieceSemigroupWithObjects", 
    [ IsSemigroup, IsCollection ] ); 



#################################  MONOIDS  #################################

#############################################################################
##
#P  IsMonoidWithObjects( <mwo> )
##
##  returns `true' if the object <obj> is a monoid and a magma with objects.
##
#?  why SynonymAttr -- see above ??
##
DeclareSynonymAttr( "IsMonoidWithObjects", 
    IsMagmaWithObjectsAndOnes and IsAssociative );

############################################################################ 
## 
#F  MonoidWithObjects( <mag>, <obs> )  
##
##  This is a magma with objects where the vertex magmas are monoids. 
## 
DeclareGlobalFunction( "MonoidWithObjects" ); 

############################################################################# 
## 
#O  SinglePieceMonoidWithObjects( <mon>, <obs> ) 
## 
DeclareOperation( "SinglePieceMonoidWithObjects", 
    [ IsMonoid, IsCollection ] ); 



#################################  GROUPS  ##################################

##  A *group with objects* is a magma with objects where 
##  the vertex magmas are groups, and every arrow has an inverse, 
##  and so is a *groupoid* - see file gpd.gd.




#################################  SUBDOMAINS  ############################## 

############################################################################# 
## 
#O  IsSubdomainWithObjects( <D>, <U> )
#F  SubdomainWithObjects( <args> )              
## 
DeclareOperation( "IsSubdomainWithObjects", 
    [ IsDomainWithObjects, IsDomainWithObjects ] );
DeclareGlobalFunction( "SubdomainWithObjects" );

############################################################################# 
## 
#O  SubdomainByPieces( <dwo>, <comp> )              
#O  PiecePositions( <dwo>, <sdwo> )
#O  DiscreteSubdomain( <dwo>, <obs>, <doms> )              
#A  MaximalDiscreteSubdomain( <dwo> )  
#O  FullSubdomain( <dwo>, <obs> )              
## 
DeclareOperation( "SubdomainByPieces",
    [ IsDomainWithObjects, IsHomogeneousList ] );
DeclareOperation( "PiecePositions", 
    [ IsDomainWithObjects, IsDomainWithObjects ] );
DeclareOperation( "DiscreteSubdomain",
    [ IsDomainWithObjects, IsHomogeneousList, IsHomogeneousList ] );
DeclareAttribute( "MaximalDiscreteSubdomain", IsDomainWithObjects );
DeclareOperation( "FullSubdomain", [IsDomainWithObjects,IsHomogeneousList] );

############################################################################## 
## 
#P  IsWide( <dwo> )                            
## 
DeclareProperty( "IsWide", IsDomainWithObjects ); 


################################  SUBMAGMAS  ################################ 

############################################################################# 
## 
#R  IsSubmagmaWithObjectsTableRep 
## 
#?  Is .eltsfam still needed ??
##
DeclareRepresentation( "IsSubmagmaWithObjectsTableRep", 
    IsComponentObjectRep and IsAttributeStoringRep and IsMagmaWithObjects, 
    [ "objects", "magma", "table", "eltsfam" ] ); 

############################################################################ 
## 
#O  IsSubmagmaWithObjectsGeneratingTable( <swo>, <A> )  
#O  SubmagmaWithObjectsElementsTable( <mag>, <A> )  
#O  SubmagmaWithObjectsByElementsTable( <swo>, <A> )  

DeclareOperation( "IsSubmagmaWithObjectsGeneratingTable", [IsMagma,IsList] );
DeclareOperation( "SubmagmaWithObjectsElementsTable", [IsMagma,IsList] );
DeclareOperation( "SubmagmaWithObjectsByElementsTable", 
    [ IsMagmaWithObjects, IsList ] );



################################ UTILITIES ################################### 

############################################################################# 
##                         
#O  Ancestor( <dwo> ) 
## 
DeclareOperation( "Ancestor", [ IsDomainWithObjects ] );    

#############################################################################
##
#E  mwo.gd  . . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
##  
