############################################################################
##
#W lpres.gi 			NQL				Rene Hartung
##
#H   @(#)$Id: lpres.gd,v 1.4 2007/04/23 12:56:45 gap Exp $
##

############################################################################
##
#C IsElementOfLpGroup
##
DeclareCategory( "IsElementOfLpGroup", 
   IsMultiplicativeElementWithInverse and IsAssociativeElement);

############################################################################
##
#C IsElementOfLpGroupCollection
##
DeclareCategoryCollections( "IsElementOfLpGroup" );

############################################################################
##
#C IsElementOfLpGroupFamily
##
DeclareCategoryFamily( "IsElementOfLpGroup" );

############################################################################
##
#C IsLpGroup
##
DeclareCategory("IsLpGroup",IsSubgroupFgGroup);

############################################################################
##
#C IsLpGroup
##
InstallTrueMethod(IsLpGroup,IsGroup and IsElementOfLpGroupCollection);

############################################################################
##
#O ElementOfLpGroup( <fam>, <word> )
##
## If <fam> is the elements family of an L-presented group and <word> is a 
## word in the free generators underlying this L-presented group, this 
## operation created the element with the representative <word> in the 
## free group.
## 
DeclareOperation("ElementOfLpGroup",
                [ IsElementOfLpGroupFamily, IsAssocWordWithInverse ]);

############################################################################
##
#P IsInvariantLPresentation ( <G> )
##
DeclareProperty( "IsInvariantLPresentation", IsLpGroup );

############################################################################
##
#P  IsAscendingLPresentation ( <G> )
##
DeclareProperty( "IsAscendingLPresentation", IsLpGroup);

#############################################################################
##
#A  FreeGeneratorsOfLpGroup( <G> )
##
##  `FreeGeneratorsOfLpGroup' returns the underlying free generators
##  corresponding to the generators of the L-presented group <G>.
##
DeclareAttribute( "FreeGeneratorsOfLpGroup", IsLpGroup and IsGroupOfFamily  );

############################################################################
##
#A  FixedRelatorsOfLpGroup(<G>)
##
##  returns the fixed relators of the L-presented group <G> as words
##  in the free generators provided by `FreeGeneratorsOfFpGroup(<G>)'.
##
DeclareAttribute("FixedRelatorsOfLpGroup",IsLpGroup and IsGroupOfFamily);

############################################################################
##
#A  EndomorphismsOfLpGroup(<G>)
##
##  returns the endomorphisms of the L-presented group <G> as mapping 
##  on the free generators.
##
DeclareAttribute("EndomorphismsOfLpGroup",IsLpGroup and IsGroupOfFamily);

############################################################################
##
#A  IteratedRelatorsOfLpGroup(<G>)
##
##  returns the iterated relators of the L-presented group <G> as words
##  in the free generators provided by `FreeGeneratorsOfFpGroup(<G>)'.
##
DeclareAttribute("IteratedRelatorsOfLpGroup",IsLpGroup and IsGroupOfFamily);

############################################################################
##
#A  FreeGroupOfLpGroup(<G>)
##
##  returns the underlying free group of the L-presented group <G>.
##  This is the group generated by the free generators provided by
##  `FreeGeneratorsOfFpGroup(<G>)'.
##
DeclareAttribute("FreeGroupOfLpGroup",IsLpGroup and IsGroupOfFamily);

############################################################################
##
#F  LPresentedGroup ( <FreeGroup>, <rels>, <endos>, <itrels> )
##
## Constructs the L-presented group on the generators of <FreeGroup> with 
## the fixed relators <rels>, the free group endomorphisms <endos>, 
## and the iterated relators <itrels>.
##
DeclareGlobalFunction("LPresentedGroup");

############################################################################
##
#A  UnderlyingInvariantLPresentation( <LpGroup> )
##
##  The invariant-part of an L-presentation. In general this is the 
##  ascending part of <LpGroup>.
##
DeclareAttribute("UnderlyingInvariantLPresentation", IsLpGroup);

############################################################################
##
#A  EmbeddingOfAscendingSubgroup ( <LpGroup> )
##
##  An attribute which contains an embedding of an ascending L-presented 
##  subgroup of the L-presented group <LpGroup>.
##
DeclareAttribute("EmbeddingOfAscendingSubgroup", IsLpGroup);

############################################################################
##
#O  EpimorphismFromFpGroup ( <LpGroup>, <n> )
##
##  returns an epimorphism from a finitely presented group G that is achieved
##  from <LpGroup> by applying the endomorphisms at most <n> times into the 
##  L-presented group <LpGroup>
##
DeclareOperation("EpimorphismFromFpGroup",[IsLpGroup, IsPosInt]);

############################################################################
##
#O  SplitExtensionByAutomorphismsLpGroup ( <G>, <H>, <auts> )
##
##  returns the split extension of <G> by <H> where the action of <H> on 
##  <G> is given by the automorphisms <aut>: <H> -> <G> in <auts>.
##
DeclareOperation("SplitExtensionByAutomorphismsLpGroup",
                 [ IsLpGroup, IsGroup, IsList ]);

