<Chapter><Heading> Commutative diagrams and abstract categories</Heading>

<Br/><B>COMMUTATIVE DIAGRAMS</B>
<Br/><Br/>

<Table Align="|l|" >



<Row>
<Item>
<Index> HomomorphismChainToCommutativeDiagram </Index>
<C>HomomorphismChainToCommutativeDiagram(H) </C>
<P/>

Inputs a list <M>H=[h_1,h_2,...,h_n]</M> of mappings such that the composite <M>h_1h_2...h_n</M> is defined.  
 It returns the list  of composable homomorphism as a commutative diagram.
</Item>
</Row>

<Row>
<Item>
<Index> NormalSeriesToQuotientDiagram </Index>
<C>NormalSeriesToQuotientDiagram(L) </C>
<C>NormalSeriesToQuotientDiagram(L,M)</C>
<P/>

Inputs  an increasing (or decreasing)
 list <M>L=[L_1,L_2,...,L_n]</M> of normal subgroups of a group <M>G</M> with <M>G=L_n</M>. It returns the chain of quotient homomorphisms <M>G/L_i \rightarrow G/L_{i+1}</M> as a commutative diagram.
 
<P/>
Optionally a subseries <M>M</M> of <M>L</M> can be entered as a second variable. Then the resulting diagram of quotient groups
 has two rows of horizontal arrows and one row of vertical arrows. 
</Item>
</Row>

<Row>
<Item>
<Index> NerveOfCommutativeDiagram </Index>
<C>NerveOfCommutativeDiagram(D) </C>
<P/>

Inputs  a commutative diagram <M>D</M> and returns the commutative diagram <M>ND</M> consisting of all possible composites of the arrows in <M>D</M>.
</Item>
</Row>

<Row>
<Item>
<Index> GroupHomologyOfCommutativeDiagram </Index>
<C>GroupHomologyOfCommutativeDiagram(D,n) </C>
<C>GroupHomologyOfCommutativeDiagram(D,n,prime) </C>
<C>GroupHomologyOfCommutativeDiagram(D,n,prime,Resolution_Algorithm) </C>
<P/>

Inputs  a commutative diagram <M>D</M> of <M>p</M>-groups and positive integer <M>n</M>. It returns the commutative diagram of vector spaces obtained by applying mod p homology.
   
<P/>
Non-prime power groups can also be handled if a prime <M>p</M>
is entered as the third argument. Integral homology can be obtained by setting <M>p=0</M>. For <M>p=0</M> the result is a diagram of groups.

<P/> A particular resolution algorithm, such as ResolutionNilpotentGroup, can be entered as a fourth argument. For positive <M>p</M> the default is ResolutionPrimePowerGroup. For <M>p=0</M> the default is ResolutionFiniteGroup.
</Item>
</Row>

<Row>
<Item>
<Index> PersistentHomologyOfCommutativeDiagramOfPGroups </Index>
<C>PersistentHomologyOfCommutativeDiagramOfPGroups(D,n) </C>
<P/>

Inputs  a commutative diagram <M>D</M> of finite <M>p</M>-groups and a positive integer <M>n</M>. It
returns a list containing, for each homomorphism in the nerve of <M>D</M>,
a triple <M>[k,l,m]</M> where <M>k</M> is
 the dimension of the source of the induced mod <M>p</M> homology map in degree <M>n</M>, <M>l</M> is the dimension of the image, and <M>m</M> is
 the dimension of the cokernel.  
</Item>
</Row>

</Table>


<B>ABSTRACT CATEGORIES</B>
<Br/><Br/>

<Table Align="|l|" >
<Row>
<Item>
<Index> CategoricalEnrichment </Index>
<C>CategoricalEnrichment(X,Name) </C>
<P/>
Inputs a structure <M>X</M> such as a group or group homomorphism, together with the name of some existing category  such as  Name:=Category_of_Groups or Category_of_Abelian_Groups. It returns, as appropriate, an object or arrow in the named category.
</Item>
</Row>

<Row>
<Item>
<Index> IdentityArrow </Index>
<C>IdentityArrow(X) </C>
<P/>
Inputs an object <M>X</M> in some category, and returns the identity arrow on the object <M>X</M>. 
</Item>
</Row>

<Row>
<Item>
<Index> InitialArrow </Index>
<C>InitialArrow(X) </C>
<P/>
Inputs an object <M>X</M> in some category, and returns the  arrow from the initial object in the category to <M>X</M>.
</Item>
</Row>

<Row>
<Item>
<Index> TerminalArrow </Index>
<C>TerminalArrow(X) </C>
<P/>
Inputs an object <M>X</M> in some category, and returns the  arrow from <M>X</M> to the terminal  object in the category.
</Item>
</Row>

<Row>
<Item>
<Index> HasInitialObject </Index>
<C>HasInitialObject(Name) </C>
<P/>
Inputs the name of a category and returns true or false depending on whether the category has an initial object. 
</Item>
</Row>

<Row>
<Item>
<Index> HasTerminalObject </Index>
<C>HasTerminalObject(Name) </C>
<P/>
Inputs the name of a category and returns true or false depending on whether the category has a terminal object.
</Item>
</Row>


<Row>
<Item>
<Index> Source </Index>
<C>Source(f) </C>
<P/>
Inputs an arrow  <M>f</M> in some category, and returns its source.
</Item>
</Row>

<Row>
<Item>
<Index> Target </Index>
<C>Target(f) </C>
<P/>
Inputs an arrow  <M>f</M> in some category, and returns its target. </Item>
</Row>

<Row>
<Item>
<Index> CategoryName </Index>
<C>CategoryName(X) </C>
<P/>
Inputs an object or arrow  <M>X</M> in some category, and returns the name of the category. </Item>
</Row>


<Row>
<Item>
<C>"*", "=", "+", "-" </C>
<P/>
Composition of suitable arrows <M>f,g</M> is given by 
<M>f*g</M> when the source of <M>f</M>  equals the target of <M>g</M>. (Warning: this differes to the standard GAP convention.)

<P/> 
Equality is tested using <M>f=g</M>. 

<P/>In an additive category the sum and difference of suitable
arrows is given by <M>f+g</M> and <M>f-g</M>.
</Item>
</Row>


<Row>
<Item>
<Index> Object </Index>
<C>Object(X) </C>
<P/>
Inputs an object  <M>X</M> in some category, and returns the GAP structure <M>Y</M> such that <M>X=CategoricalEnrichment(Y,CategoryName(X))</M>.
</Item>
</Row>

<Row>
<Item>
<Index> Mapping </Index>
<C>Mapping(X) </C>
<P/>
Inputs an arrow  <M>f</M> in some category, and returns the GAP structure <M>Y</M> such that <M>f=CategoricalEnrichment(Y,CategoryName(X))</M>.
</Item>
</Row>


<Row>
<Item>
<Index> IsCategoryObject </Index>
<C>IsCategoryObject(X) </C>
<P/>
Inputs   <M>X</M> and returns true if <M>X</M> is an object in some category. 
</Item>
</Row>

<Row>
<Item>
<Index> IsCategoryArrow </Index>
<C>IsCategoryArrow(X) </C>
<P/>
Inputs   <M>X</M> and returns true if <M>X</M> is an arrow in some category.
</Item>
</Row>






</Table>
</Chapter>

