  
  [1X3 [33X[0;0YMorphisms[133X[101X
  
  [33X[0;0YAny  GAP  object satisfying [10XIsCapCategoryMorphism[110X can be added to a category
  and then becomes a morphism in this category. Any morphism can belong to one
  or  no category. After a GAP object is added to the category, it knows which
  things  can be computed in its category and to which category it belongs. It
  knows   categorical   properties  and  attributes,  and  the  functions  for
  existential quantifiers can be applied to the morphism.[133X
  
  
  [1X3.1 [33X[0;0YAttributes for the Type of Morphisms[133X[101X
  
  [1X3.1-1 CapCategory[101X
  
  [33X[1;0Y[29X[2XCapCategory[102X( [3Xalpha[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Ya category[133X
  
  [33X[0;0YThe  argument is a morphism [23X\alpha[123X. The output is the category [23X\mathbf{C}[123X to
  which [23X\alpha[123X was added.[133X
  
  [1X3.1-2 Source[101X
  
  [33X[1;0Y[29X[2XSource[102X( [3Xalpha[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Yan object[133X
  
  [33X[0;0YThe argument is a morphism [23X\alpha: a \rightarrow b[123X. The output is its source
  [23Xa[123X.[133X
  
  [1X3.1-3 Range[101X
  
  [33X[1;0Y[29X[2XRange[102X( [3Xalpha[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Yan object[133X
  
  [33X[0;0YThe  argument is a morphism [23X\alpha: a \rightarrow b[123X. The output is its range
  [23Xb[123X.[133X
  
  
  [1X3.2 [33X[0;0YCategorical Properties of Morphisms[133X[101X
  
  [1X3.2-1 AddIsMonomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsMonomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XIsMonomorphism[110X. [23XF:
  \alpha \mapsto \mathtt{IsMonomorphism}(\alpha)[123X.[133X
  
  [1X3.2-2 AddIsEpimorphism[101X
  
  [33X[1;0Y[29X[2XAddIsEpimorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X to the category for the basic operation [10XIsEpimorphism[110X. [23XF:
  \alpha \mapsto \mathtt{IsEpimorphism}(\alpha)[123X.[133X
  
  [1X3.2-3 AddIsIsomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsIsomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X to the category for the basic operation [10XIsIsomorphism[110X. [23XF:
  \alpha \mapsto \mathtt{IsIsomorphism}(\alpha)[123X.[133X
  
  [1X3.2-4 AddIsSplitMonomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsSplitMonomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsSplitMonomorphism[110X. [23XF: \alpha \mapsto \mathtt{IsSplitMonomorphism}(\alpha)[123X.[133X
  
  [1X3.2-5 AddIsSplitEpimorphism[101X
  
  [33X[1;0Y[29X[2XAddIsSplitEpimorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given function [23XF[123X to the category for the basic operation [10XIsSplitEpimorphism[110X.
  [23XF: \alpha \mapsto \mathtt{IsSplitEpimorphism}(\alpha)[123X.[133X
  
  [1X3.2-6 AddIsOne[101X
  
  [33X[1;0Y[29X[2XAddIsOne[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to the category for the basic operation [10XIsOne[110X. [23XF: \alpha
  \mapsto \mathtt{IsOne}(\alpha)[123X.[133X
  
  [1X3.2-7 AddIsIdempotent[101X
  
  [33X[1;0Y[29X[2XAddIsIdempotent[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to the category for the basic operation [10XIsIdempotent[110X. [23XF:
  \alpha \mapsto \mathtt{IsIdempotent}(\alpha)[123X.[133X
  
  
  [1X3.3 [33X[0;0YRandom Morphisms[133X[101X
  
  [33X[0;0YCAP  provides  two  principal  methods  to generate random morphisms with or
  without fixed source and range:[133X
  
  [30X    [33X[0;6Y[13XBy  integers[113X:  The  integer  is simply a parameter that can be used to
        create a random morphism.[133X
  
  [30X    [33X[0;6Y[13XBy  lists[113X: The list is used when creating a random morphism would need
        more  than  one parameter. Lists offer more flexibility at the expense
        of  the genericity of the methods. This happens because lists that are
        valid as input in some category may be not valid for other categories.
        Hence,  these  operations  are  not  thought  to  be  used  in generic
        categorical algorithms.[133X
  
  [1X3.3-1 RandomMorphismWithFixedSourceByInteger[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceByInteger[102X( [3Xa[103X, [3Xn[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments  are an object [23Xa[123X in a category [23XC[123X and an integer [23Xn[123X. The output
  is a random morphism [23X\alpha: a \rightarrow b[123X for some object [23Xb[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-2 AddRandomMorphismWithFixedSourceByInteger[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedSourceByInteger[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedSourceByInteger[110X. The function [23XF[123X maps [23X(a,n)[123X to [10Xfail[110X or
  to a random morphism in [23XC[123X whose source is [23Xa[123X.[133X
  
  [1X3.3-3 RandomMorphismWithFixedSourceByList[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceByList[102X( [3Xa[103X, [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments are an object [23Xa[123X in a category [23XC[123X and a list [23XL[123X. The output is a
  random morphism [23X\alpha: a \rightarrow b[123X for some object [23Xb[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-4 AddRandomMorphismWithFixedSourceByList[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedSourceByList[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedSourceByList[110X. The function [23XF[123X maps [23X(a,L)[123X to [10Xfail[110X or to
  a random morphism in [23XC[123X whose source is [23Xa[123X.[133X
  
  [1X3.3-5 RandomMorphismWithFixedRangeByInteger[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedRangeByInteger[102X( [3Xb[103X, [3Xn[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments  are an object [23Xb[123X in a category [23XC[123X and an integer [23Xn[123X. The output
  is a random morphism [23X\alpha: a \rightarrow b[123X for some object [23Xa[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-6 AddRandomMorphismWithFixedRangeByInteger[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedRangeByInteger[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedRangeByInteger[110X.  The function [23XF[123X maps [23X(b,n)[123X to [10Xfail[110X or
  to a random morphism in [23XC[123X whose range is [23Xb[123X.[133X
  
  [1X3.3-7 RandomMorphismWithFixedRangeByList[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedRangeByList[102X( [3Xb[103X, [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments are an object [23Xb[123X in a category [23XC[123X and a list [23XL[123X. The output is a
  random morphism [23X\alpha: a \rightarrow b[123X for some object [23Xa[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-8 AddRandomMorphismWithFixedRangeByList[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedRangeByList[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedRangeByList[110X.  The function [23XF[123X maps [23X(b,L)[123X to [10Xfail[110X or to
  a random morphism in [23XC[123X whose range is [23Xb[123X.[133X
  
  [1X3.3-9 RandomMorphismWithFixedSourceAndRangeByInteger[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceAndRangeByInteger[102X( [3Xa[103X, [3Xb[103X, [3Xn[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments are two objects [23Xa[123X and [23Xb[123X in a category [23XC[123X and an integer [23Xn[123X. The
  output is a random morphism [23X\alpha: a \rightarrow b[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-10 AddRandomMorphismWithFixedSourceAndRangeByInteger[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedSourceAndRangeByInteger[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedSourceAndRangeByInteger[110X.  The function [23XF[123X maps [23X(a,b,n)[123X
  to [10Xfail[110X or to a random morphism in [23XC[123X from [23Xa[123X to [23Xb[123X.[133X
  
  [1X3.3-11 RandomMorphismWithFixedSourceAndRangeByList[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceAndRangeByList[102X( [3Xa[103X, [3Xb[103X, [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X or [10Xfail[110X[133X
  
  [33X[0;0YThis  operation is not a CAP basic operation The arguments are two objects [23Xa[123X
  and  [23Xb[123X in a category [23XC[123X and a list [23XL[123X. The output is a random morphism [23X\alpha:
  a \rightarrow b[123X in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-12 AddRandomMorphismWithFixedSourceAndRangeByList[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismWithFixedSourceAndRangeByList[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismWithFixedSourceAndRangeByList[110X.  The function [23XF[123X maps [23X(a,b,L)[123X to
  [10Xfail[110X or to a random morphism in [23XC[123X from [23Xa[123X to [23Xb[123X.[133X
  
  [1X3.3-13 RandomMorphismByInteger[101X
  
  [33X[1;0Y[29X[2XRandomMorphismByInteger[102X( [3XC[103X, [3Xn[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism or [10Xfail[110X[133X
  
  [33X[0;0YThe  arguments  are  a  category  [23XC[123X and an integer [23Xn[123X. The output is a random
  morphism   in   [23XC[123X   or   [10Xfail[110X.  If  the  methods  [10XRandomObjectByInteger[110X  and
  [10XRandomMorphismWithFixedSourceByInteger[110X([10XRandomMorphismWithFixedRangeByInteger[110X)
  are  added to the category [23XC[123X, then [10XRandomMorphismByInteger[110X can be derived to
  return  a  random  morphism  of  complexity  [23Xn[123X  with random source(range) of
  complexity [23Xn[123X.[133X
  
  [1X3.3-14 AddRandomMorphismByInteger[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismByInteger[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismByInteger[110X.  The  function  [23XF[123X maps [23X(C,n)[123X to [10Xfail[110X or to a random
  morphism in [23XC[123X.[133X
  
  [1X3.3-15 RandomMorphismByList[101X
  
  [33X[1;0Y[29X[2XRandomMorphismByList[102X( [3XC[103X, [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism or [10Xfail[110X[133X
  
  [33X[0;0YThe arguments are a category [23XC[123X and a list [23XL[123X. The output is a random morphism
  in [23XC[123X or [10Xfail[110X.[133X
  
  [1X3.3-16 AddRandomMorphismByList[101X
  
  [33X[1;0Y[29X[2XAddRandomMorphismByList[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a  category [23XC[123X and a function [23XF[123X. This operation adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XRandomMorphismByList[110X.  The  function  [23XF[123X  maps  [23X(C,L)[123X  to [10Xfail[110X or to a random
  morphism in [23XC[123X.[133X
  
  [1X3.3-17 RandomMorphismWithFixedSource[101X
  
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSource[102X( [3Xa[103X, [3Xn[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSource[102X( [3Xa[103X, [3XL[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphismWithFixedRange[102X( [3Xb[103X, [3Xn[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphismWithFixedRange[102X( [3Xb[103X, [3XL[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceAndRange[102X( [3Xa[103X, [3Xb[103X, [3Xn[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphismWithFixedSourceAndRange[102X( [3Xa[103X, [3Xb[103X, [3XL[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphism[102X( [3XC[103X, [3Xn[103X ) [32X operation[133X
  [33X[1;0Y[29X[2XRandomMorphism[102X( [3XC[103X, [3XL[103X ) [32X operation[133X
  
  [33X[0;0YThese  are  convenient methods and they, depending on the input, delegate to
  one of the above methods.[133X
  
  
  [1X3.4 [33X[0;0YNon-Categorical Properties of Morphisms[133X[101X
  
  [33X[0;0YNon-categorical properties are not stable under equivalences of categories.[133X
  
  [1X3.4-1 IsIdenticalToIdentityMorphism[101X
  
  [33X[1;0Y[29X[2XIsIdenticalToIdentityMorphism[102X( [3Xalpha[103X ) [32X property[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  argument  is  a morphism [23X\alpha: a \rightarrow b[123X. The output is [10Xtrue[110X if
  [23X\alpha = \mathrm{id}_a[123X, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.4-2 AddIsIdenticalToIdentityMorphism[101X
  
  [33X[1;0Y[29X[2XAddIsIdenticalToIdentityMorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsIdenticalToIdentityMorphism[110X.           [23XF:          \alpha          \mapsto
  \mathtt{IsIdenticalToIdentityMorphism}(\alpha)[123X.[133X
  
  [1X3.4-3 IsIdenticalToZeroMorphism[101X
  
  [33X[1;0Y[29X[2XIsIdenticalToZeroMorphism[102X( [3Xalpha[103X ) [32X property[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  argument  is  a morphism [23X\alpha: a \rightarrow b[123X. The output is [10Xtrue[110X if
  [23X\alpha = 0[123X, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.4-4 AddIsIdenticalToZeroMorphism[101X
  
  [33X[1;0Y[29X[2XAddIsIdenticalToZeroMorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsIdenticalToZeroMorphism[110X.            [23XF:            \alpha           \mapsto
  \mathtt{IsIdenticalToZeroMorphism }(\alpha)[123X.[133X
  
  [1X3.4-5 AddIsEndomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsEndomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XIsEndomorphism[110X. [23XF:
  \alpha \mapsto \mathtt{IsEndomorphism}(\alpha)[123X.[133X
  
  [1X3.4-6 AddIsAutomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsAutomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XIsAutomorphism[110X. [23XF:
  \alpha \mapsto \mathtt{IsAutomorphism}(\alpha)[123X.[133X
  
  
  [1X3.5 [33X[0;0YAdding Morphisms to a Category[133X[101X
  
  [1X3.5-1 Add[101X
  
  [33X[1;0Y[29X[2XAdd[102X( [3Xcategory[103X, [3Xmorphism[103X ) [32X operation[133X
  
  [33X[0;0YAdds [3Xmorphism[103X as a morphism to [3Xcategory[103X.[133X
  
  [1X3.5-2 AddMorphism[101X
  
  [33X[1;0Y[29X[2XAddMorphism[102X( [3Xcategory[103X, [3Xmorphism[103X ) [32X operation[133X
  
  [33X[0;0YAdds  [3Xmorphism[103X  as  a  morphism to [3Xcategory[103X. If [3Xmorphism[103X already lies in the
  filter [10XIsCapCategoryMorphism[110X, the operation [2XAdd[102X ([14X3.5-1[114X) can be used instead.[133X
  
  [1X3.5-3 AddMorphismRepresentation[101X
  
  [33X[1;0Y[29X[2XAddMorphismRepresentation[102X( [3Xcategory[103X, [3Xfilter[103X ) [32X operation[133X
  
  [33X[0;0YThe  argument  [3Xfilter[103X  is  used  to  create a morphism type for the category
  [3Xcategory[103X,  which  is  then  used in [10XObjectifyMorphismForCAPWithAttributes[110X to
  objectify morphisms for this category.[133X
  
  [1X3.5-4 ObjectifyMorphismForCAPWithAttributes[101X
  
  [33X[1;0Y[29X[2XObjectifyMorphismForCAPWithAttributes[102X( [3Xmorphism[103X, [3Xcategory[103X[, [3Xattribute1[103X, [3Xvalue1[103X, [3X...[103X] ) [32X function[133X
  
  [33X[0;0YObjectifies the morphism [3Xmorphism[103X with the type created for morphisms in the
  category  [3Xcategory[103X.  The  type  is  created  by  passing a representation to
  [10XAddMorphismRepresentation[110X. Morphisms which are objectified using this method
  do not have to be passed to the [10XAddMorphism[110X function.[133X
  
  [33X[0;0YPlease  note  that  the [10XSource[110X and [10XRange[110X attribute need to be passed to this
  function. The values belonging to these attrbutes will not be objectified.[133X
  
  
  [1X3.6 [33X[0;0YEquality and Congruence for Morphisms[133X[101X
  
  [1X3.6-1 IsCongruentForMorphisms[101X
  
  [33X[1;0Y[29X[2XIsCongruentForMorphisms[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are two morphisms [23X\alpha, \beta: a \rightarrow b[123X. The output
  is [10Xtrue[110X if [23X\alpha \sim_{a,b} \beta[123X, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.6-2 AddIsCongruentForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddIsCongruentForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsCongruentForMorphisms[110X.        [23XF:       (\alpha,       \beta)       \mapsto
  \mathtt{IsCongruentForMorphisms}(\alpha, \beta)[123X.[133X
  
  [1X3.6-3 IsEqualForMorphisms[101X
  
  [33X[1;0Y[29X[2XIsEqualForMorphisms[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are two morphisms [23X\alpha, \beta: a \rightarrow b[123X. The output
  is [10Xtrue[110X if [23X\alpha = \beta[123X, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.6-4 AddIsEqualForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddIsEqualForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsEqualForMorphisms[110X.         [23XF:        (\alpha,        \beta)        \mapsto
  \mathtt{IsEqualForMorphisms}(\alpha, \beta)[123X.[133X
  
  [1X3.6-5 IsEqualForMorphismsOnMor[101X
  
  [33X[1;0Y[29X[2XIsEqualForMorphismsOnMor[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  b,  \beta:  c
  \rightarrow d[123X. The output is [10Xtrue[110X if [23X\alpha = \beta[123X, otherwise the output is
  [10Xfalse[110X.[133X
  
  [1X3.6-6 AddIsEqualForMorphismsOnMor[101X
  
  [33X[1;0Y[29X[2XAddIsEqualForMorphismsOnMor[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsEqualForMorphismsOnMor[110X.       [23XF:       (\alpha,       \beta)       \mapsto
  \mathtt{IsEqualForMorphismsOnMor}(\alpha, \beta)[123X.[133X
  
  
  [1X3.7 [33X[0;0YBasic Operations for Morphisms in Ab-Categories[133X[101X
  
  [1X3.7-1 IsZeroForMorphisms[101X
  
  [33X[1;0Y[29X[2XIsZeroForMorphisms[102X( [3Xalpha[103X ) [32X property[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  argument  is  a morphism [23X\alpha: a \rightarrow b[123X. The output is [10Xtrue[110X if
  [23X\alpha \sim_{a,b} 0[123X, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.7-2 AddIsZeroForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddIsZeroForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given function [23XF[123X to the category for the basic operation [10XIsZeroForMorphisms[110X.
  [23XF: \alpha \mapsto \mathtt{IsZeroForMorphisms}(\alpha)[123X.[133X
  
  [1X3.7-3 AdditionForMorphisms[101X
  
  [33X[1;0Y[29X[2XAdditionForMorphisms[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X[133X
  
  [33X[0;0YThe  arguments  are two morphisms [23X\alpha, \beta: a \rightarrow b[123X. The output
  is the addition [23X\alpha + \beta[123X.[133X
  
  [1X3.7-4 AddAdditionForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddAdditionForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XAdditionForMorphisms[110X. [23XF: (\alpha, \beta) \mapsto \alpha + \beta[123X.[133X
  
  [1X3.7-5 SubtractionForMorphisms[101X
  
  [33X[1;0Y[29X[2XSubtractionForMorphisms[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X[133X
  
  [33X[0;0YThe  arguments  are two morphisms [23X\alpha, \beta: a \rightarrow b[123X. The output
  is the addition [23X\alpha - \beta[123X.[133X
  
  [1X3.7-6 AddSubtractionForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddSubtractionForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XSubtractionForMorphisms[110X. [23XF: (\alpha, \beta) \mapsto \alpha - \beta[123X.[133X
  
  [1X3.7-7 AdditiveInverseForMorphisms[101X
  
  [33X[1;0Y[29X[2XAdditiveInverseForMorphisms[102X( [3Xalpha[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X[133X
  
  [33X[0;0YThe  argument  is  a  morphism  [23X\alpha:  a  \rightarrow b[123X. The output is its
  additive inverse [23X-\alpha[123X.[133X
  
  [1X3.7-8 AddAdditiveInverseForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddAdditiveInverseForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XAdditiveInverseForMorphisms[110X. [23XF: \alpha \mapsto -\alpha[123X.[133X
  
  [1X3.7-9 MultiplyWithElementOfCommutativeRingForMorphisms[101X
  
  [33X[1;0Y[29X[2XMultiplyWithElementOfCommutativeRingForMorphisms[102X( [3Xr[103X, [3Xalpha[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X[133X
  
  [33X[0;0YThe  arguments are an element [23Xr[123X of a commutative ring and a morphism [23X\alpha:
  a  \rightarrow  b[123X.  The output is the multiplication with the ring element [23Xr
  \cdot \alpha[123X.[133X
  
  [1X3.7-10 AddMultiplyWithElementOfCommutativeRingForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddMultiplyWithElementOfCommutativeRingForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XMultiplyWithElementOfCommutativeRingForMorphisms[110X.  [23XF:  (r, \alpha) \mapsto r
  \cdot \alpha[123X.[133X
  
  [1X3.7-11 ZeroMorphism[101X
  
  [33X[1;0Y[29X[2XZeroMorphism[102X( [3Xa[103X, [3Xb[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b)[123X[133X
  
  [33X[0;0YThe  arguments are two objects [23Xa[123X and [23Xb[123X. The output is the zero morphism [23X0: a
  \rightarrow b[123X.[133X
  
  [1X3.7-12 AddZeroMorphism[101X
  
  [33X[1;0Y[29X[2XAddZeroMorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to the category for the basic operation [10XZeroMorphism[110X. [23XF:
  (a,b) \mapsto (0: a \rightarrow b)[123X.[133X
  
  
  [1X3.8 [33X[0;0YSubobject and Factorobject Operations[133X[101X
  
  [33X[0;0YSubobjects  of  an  object  [23Xc[123X  are  monomorphisms with range [23Xc[123X and a special
  function  for  comparision.  Similarly,  factorobjects  of  an  object [23Xc[123X are
  epimorphisms with source [23Xc[123X and a special function for comparision.[133X
  
  [1X3.8-1 IsEqualAsSubobjects[101X
  
  [33X[1;0Y[29X[2XIsEqualAsSubobjects[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are  two  subobjects  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  b
  \rightarrow  c[123X.  The  output is [10Xtrue[110X if there exists an isomorphism [23X\iota: a
  \rightarrow  b[123X  such that [23X\beta \circ \iota \sim_{a,c} \alpha[123X, otherwise the
  output is [10Xfalse[110X.[133X
  
  [1X3.8-2 AddIsEqualAsSubobjects[101X
  
  [33X[1;0Y[29X[2XAddIsEqualAsSubobjects[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsEqualAsSubobjects[110X.         [23XF:        (\alpha,        \beta)        \mapsto
  \mathtt{IsEqualAsSubobjects}(\alpha,\beta)[123X.[133X
  
  [1X3.8-3 IsEqualAsFactorobjects[101X
  
  [33X[1;0Y[29X[2XIsEqualAsFactorobjects[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are  two  factorobjects  [23X\alpha:  c  \rightarrow a[123X, [23X\beta: c
  \rightarrow  b[123X.  The  output is [10Xtrue[110X if there exists an isomorphism [23X\iota: b
  \rightarrow  a[123X  such that [23X\iota \circ \beta \sim_{c,a} \alpha[123X, otherwise the
  output is [10Xfalse[110X.[133X
  
  [1X3.8-4 AddIsEqualAsFactorobjects[101X
  
  [33X[1;0Y[29X[2XAddIsEqualAsFactorobjects[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsEqualAsFactorobjects[110X.        [23XF:        (\alpha,       \beta)       \mapsto
  \mathtt{IsEqualAsFactorobjects}(\alpha,\beta)[123X.[133X
  
  [1X3.8-5 IsDominating[101X
  
  [33X[1;0Y[29X[2XIsDominating[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YIn  short:  Returns [10Xtrue[110X iff [23X\alpha[123X is smaller than [23X\beta[123X. Full description:
  The  arguments  are  two  subobjects  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  b
  \rightarrow  c[123X.  The  output  is  [10Xtrue[110X  if  there exists a morphism [23X\iota: a
  \rightarrow  b[123X  such that [23X\beta \circ \iota \sim_{a,c} \alpha[123X, otherwise the
  output is [10Xfalse[110X.[133X
  
  [1X3.8-6 AddIsDominating[101X
  
  [33X[1;0Y[29X[2XAddIsDominating[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to the category for the basic operation [10XIsDominating[110X. [23XF:
  (\alpha, \beta) \mapsto \mathtt{IsDominating}(\alpha,\beta)[123X.[133X
  
  [1X3.8-7 IsCodominating[101X
  
  [33X[1;0Y[29X[2XIsCodominating[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YIn  short:  Returns [10Xtrue[110X iff [23X\alpha[123X is smaller than [23X\beta[123X. Full description:
  The  arguments  are  two  factorobjects  [23X\alpha:  c  \rightarrow a[123X, [23X\beta: c
  \rightarrow  b[123X.  The  output  is  [10Xtrue[110X  if  there exists a morphism [23X\iota: b
  \rightarrow  a[123X  such that [23X\iota \circ \beta \sim_{c,a} \alpha[123X, otherwise the
  output is [10Xfalse[110X.[133X
  
  [1X3.8-8 AddIsCodominating[101X
  
  [33X[1;0Y[29X[2XAddIsCodominating[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XIsCodominating[110X. [23XF:
  (\alpha, \beta) \mapsto \mathtt{IsCodominating}(\alpha,\beta)[123X.[133X
  
  
  [1X3.9 [33X[0;0YIdentity Morphism and Composition of Morphisms[133X[101X
  
  [1X3.9-1 IdentityMorphism[101X
  
  [33X[1;0Y[29X[2XIdentityMorphism[102X( [3Xa[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,a)[123X[133X
  
  [33X[0;0YThe   argument  is  an  object  [23Xa[123X.  The  output  is  its  identity  morphism
  [23X\mathrm{id}_a[123X.[133X
  
  [1X3.9-2 AddIdentityMorphism[101X
  
  [33X[1;0Y[29X[2XAddIdentityMorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X to the category for the basic operation [10XIdentityMorphism[110X.
  [23XF: a \mapsto \mathrm{id}_a[123X.[133X
  
  [1X3.9-3 PreCompose[101X
  
  [33X[1;0Y[29X[2XPreCompose[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}( a, c )[123X[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  b[123X,  [23X\beta:  b
  \rightarrow  c[123X.  The  output  is  the  composition  [23X\beta  \circ  \alpha:  a
  \rightarrow c[123X.[133X
  
  [1X3.9-4 PreCompose[101X
  
  [33X[1;0Y[29X[2XPreCompose[102X( [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a_1, a_{n+1})[123X[133X
  
  [33X[0;0YThis  is  a  convenience  method.  The argument is a list of morphisms [23XL = (
  \alpha_1:  a_1  \rightarrow  a_2,  \alpha_2:  a_2  \rightarrow  a_3,  \dots,
  \alpha_n:   a_n  \rightarrow  a_{n+1}  )[123X.  The  output  is  the  composition
  [23X\alpha_{n}  \circ ( \alpha_{n-1} \circ ( \dots ( \alpha_2 \circ \alpha_1 ) )
  )[123X.[133X
  
  [1X3.9-5 AddPreCompose[101X
  
  [33X[1;0Y[29X[2XAddPreCompose[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to  the  category for the basic operation [10XPreCompose[110X. [23XF:
  (\alpha, \beta) \mapsto \beta \circ \alpha[123X.[133X
  
  [1X3.9-6 PostCompose[101X
  
  [33X[1;0Y[29X[2XPostCompose[102X( [3Xbeta[103X, [3Xalpha[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}( a, c )[123X[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\beta:  b  \rightarrow  c[123X,  [23X\alpha:  a
  \rightarrow  b[123X.  The  output  is  the  composition  [23X\beta  \circ  \alpha:  a
  \rightarrow c[123X.[133X
  
  [1X3.9-7 PostCompose[101X
  
  [33X[1;0Y[29X[2XPostCompose[102X( [3XL[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a_1, a_{n+1})[123X[133X
  
  [33X[0;0YThis  is  a  convenience  method.  The argument is a list of morphisms [23XL = (
  \alpha_n:  a_n  \rightarrow  a_{n+1}, \alpha_{n-1}: a_{n-1} \rightarrow a_n,
  \dots,  \alpha_1:  a_1  \rightarrow  a_2  )[123X.  The  output is the composition
  [23X((\alpha_{n} \circ \alpha_{n-1}) \circ \dots \alpha_2) \circ \alpha_1[123X.[133X
  
  [1X3.9-8 AddPostCompose[101X
  
  [33X[1;0Y[29X[2XAddPostCompose[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to  the category for the basic operation [10XPostCompose[110X. [23XF:
  (\alpha, \beta) \mapsto \alpha \circ \beta[123X.[133X
  
  
  [1X3.10 [33X[0;0YWell-Definedness of Morphisms[133X[101X
  
  [1X3.10-1 IsWellDefinedForMorphisms[101X
  
  [33X[1;0Y[29X[2XIsWellDefinedForMorphisms[102X( [3Xalpha[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  argument  is  a  morphism  [23X\alpha[123X.  The  output  is  [10Xtrue[110X  if [23X\alpha[123X is
  well-defined, otherwise the output is [10Xfalse[110X.[133X
  
  [1X3.10-2 AddIsWellDefinedForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddIsWellDefinedForMorphisms[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsWellDefinedForMorphisms[110X.            [23XF:            \alpha           \mapsto
  \mathtt{IsWellDefinedForMorphisms}( \alpha )[123X.[133X
  
  
  [1X3.11 [33X[0;0YLift/Colift[133X[101X
  
  [30X    [33X[0;6YFor   any  pair  of  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  b
        \rightarrow  c[123X,  we call each morphism [23X\alpha / \beta: a \rightarrow b[123X
        such  that  [23X\beta  \circ  (\alpha / \beta) \sim_{a,c} \alpha[123X a [13Xlift of
        [23X\alpha[123X along [23X\beta[123X[113X.[133X
  
  [30X    [33X[0;6YFor   any  pair  of  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  a
        \rightarrow  b[123X,  we  call  each  morphism  [23X\alpha  \backslash \beta: c
        \rightarrow  b[123X  such  that  [23X(\alpha  \backslash  \beta)  \circ  \alpha
        \sim_{a,b} \beta[123X a [13X colift of [23X\beta[123X along [23X\alpha[123X[113X.[133X
  
  [33X[0;0YNote  that  such lifts (or colifts) do not have to be unique. So in general,
  we  do  not expect that algorithms computing lifts (or colifts) do this in a
  functorial  way.  Thus  the operations [23X\mathtt{Lift}[123X and [23X\mathtt{Colift}[123X are
  not   regarded   as   categorical  operations,  but  only  as  set-theoretic
  operations.[133X
  
  [1X3.11-1 LiftAlongMonomorphism[101X
  
  [33X[1;0Y[29X[2XLiftAlongMonomorphism[102X( [3Xiota[103X, [3Xtau[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(t,k)[123X[133X
  
  [33X[0;0YThe  arguments  are a monomorphism [23X\iota: k \hookrightarrow a[123X and a morphism
  [23X\tau:  t \rightarrow a[123X such that there is a morphism [23Xu: t \rightarrow k[123X with
  [23X\iota \circ u \sim_{t,a} \tau[123X. The output is such a [23Xu[123X.[133X
  
  [1X3.11-2 AddLiftAlongMonomorphism[101X
  
  [33X[1;0Y[29X[2XAddLiftAlongMonomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XLiftAlongMonomorphism[110X. The function [23XF[123X maps a pair [23X(\iota, \tau)[123X to a lift [23Xu[123X.[133X
  
  [1X3.11-3 ColiftAlongEpimorphism[101X
  
  [33X[1;0Y[29X[2XColiftAlongEpimorphism[102X( [3Xepsilon[103X, [3Xtau[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(c,t)[123X[133X
  
  [33X[0;0YThe  arguments  are  an epimorphism [23X\epsilon: a \rightarrow c[123X and a morphism
  [23X\tau:  a \rightarrow t[123X such that there is a morphism [23Xu: c \rightarrow t[123X with
  [23Xu \circ \epsilon \sim_{a,t} \tau[123X. The output is such a [23Xu[123X.[133X
  
  [1X3.11-4 AddColiftAlongEpimorphism[101X
  
  [33X[1;0Y[29X[2XAddColiftAlongEpimorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XColiftAlongEpimorphism[110X.  The  function  [23XF[123X  maps a pair [23X(\epsilon, \tau)[123X to a
  lift [23Xu[123X.[133X
  
  [1X3.11-5 IsLiftableAlongMonomorphism[101X
  
  [33X[1;0Y[29X[2XIsLiftableAlongMonomorphism[102X( [3Xiota[103X, [3Xtau[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are a monomorphism [23X\iota: k \hookrightarrow a[123X and a morphism
  [23X\tau:  t  \rightarrow  a[123X. The output is [10Xtrue[110X if there exists a morphism [23Xu: t
  \rightarrow  k[123X  with [23X\iota \circ u \sim_{t,a} \tau[123X. Otherwise, the output is
  [10Xfalse[110X.[133X
  
  [1X3.11-6 AddIsLiftableAlongMonomorphism[101X
  
  [33X[1;0Y[29X[2XAddIsLiftableAlongMonomorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsLiftableAlongMonomorphism[110X.       [23XF:       (\iota,       \tau)      \mapsto
  \texttt{IsLiftableAlongMonomorphism}( \iota, \tau )[123X.[133X
  
  [1X3.11-7 IsColiftableAlongEpimorphism[101X
  
  [33X[1;0Y[29X[2XIsColiftableAlongEpimorphism[102X( [3Xepsilon[103X, [3Xtau[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe  arguments  are  an epimorphism [23X\epsilon: a \rightarrow c[123X and a morphism
  [23X\tau:  a  \rightarrow  t[123X. The output is [10Xtrue[110X if there exists a morphism [23Xu: c
  \rightarrow  t[123X  with [23Xu \circ \epsilon \sim_{a,t} \tau[123X. Otherwise, the output
  is [10Xfalse[110X.[133X
  
  [1X3.11-8 AddIsColiftableAlongEpimorphism[101X
  
  [33X[1;0Y[29X[2XAddIsColiftableAlongEpimorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XIsColiftableAlongEpimorphism[110X.      [23XF:      (\epsilon,      \tau)     \mapsto
  \texttt{IsColiftableAlongEpimorphism}( \epsilon, \tau )[123X.[133X
  
  [1X3.11-9 Lift[101X
  
  [33X[1;0Y[29X[2XLift[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(a,b) + \{ \mathtt{fail} \}[123X[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  b
  \rightarrow  c[123X.  The  output  is  a  lift [23X\alpha / \beta: a \rightarrow b[123X of
  [23X\alpha[123X  along  [23X\beta[123X  if  such a lift exists or [23X\mathtt{fail}[123X if it doesn't.
  Recall  that a lift [23X\alpha / \beta: a \rightarrow b[123X of [23X\alpha[123X along [23X\beta[123X is
  a morphism such that [23X\beta \circ (\alpha / \beta) \sim_{a,c} \alpha[123X.[133X
  
  [1X3.11-10 AddLift[101X
  
  [33X[1;0Y[29X[2XAddLift[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XLift[110X. The function
  [23XF[123X  maps a pair [23X(\alpha, \beta)[123X to a lift [23X\alpha / \beta[123X if it exists, and to
  [10Xfail[110X otherwise.[133X
  
  [1X3.11-11 Colift[101X
  
  [33X[1;0Y[29X[2XColift[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}(c,b) + \{ \mathtt{fail} \}[123X[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  a
  \rightarrow b[123X. The output is a colift [23X\alpha \backslash \beta: c \rightarrow
  b[123X  of  [23X\beta[123X  along  [23X\alpha[123X  if  such a colift exists or [23X\mathtt{fail}[123X if it
  doesn't.  Recall  that  a colift [23X\alpha \backslash \beta: c \rightarrow b[123X of
  [23X\beta[123X  along  [23X\alpha[123X is a morphism such that [23X(\alpha \backslash \beta) \circ
  \alpha \sim_{a,b} \beta[123X.[133X
  
  [1X3.11-12 AddColift[101X
  
  [33X[1;0Y[29X[2XAddColift[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to  the  category  for  the  basic operation [10XColift[110X. The
  function  [23XF[123X  maps a pair [23X(\alpha, \beta)[123X to a colift [23X\alpha \backslash \beta[123X
  if it exists, and to [10Xfail[110X otherwise.[133X
  
  [1X3.11-13 IsLiftable[101X
  
  [33X[1;0Y[29X[2XIsLiftable[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  b
  \rightarrow  c[123X.  The output is [10Xtrue[110X if there exists a lift [23X\alpha / \beta: a
  \rightarrow  b[123X of [23X\alpha[123X along [23X\beta[123X, i.e., a morphism such that [23X\beta \circ
  (\alpha / \beta) \sim_{a,c} \alpha[123X. Otherwise, the output is [10Xfalse[110X.[133X
  
  [1X3.11-14 AddIsLiftable[101X
  
  [33X[1;0Y[29X[2XAddIsLiftable[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function  [23XF[123X  to the category for the basic operation [10XIsLiftable[110X. [23XF: (
  \alpha, \beta ) \mapsto \mathtt{IsLiftable}( \alpha, \beta )[123X.[133X
  
  [1X3.11-15 IsColiftable[101X
  
  [33X[1;0Y[29X[2XIsColiftable[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya boolean[133X
  
  [33X[0;0YThe   arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  c[123X,  [23X\beta:  a
  \rightarrow b[123X. The output is [10Xtrue[110X if there exists a colift [23X\alpha \backslash
  \beta:  c  \rightarrow  b[123X of [23X\beta[123X along [23X\alpha[123X., i.e., a morphism such that
  [23X(\alpha  \backslash  \beta)  \circ  \alpha  \sim_{a,b} \beta[123X. Otherwise, the
  output is [10Xfalse[110X.[133X
  
  [1X3.11-16 AddIsColiftable[101X
  
  [33X[1;0Y[29X[2XAddIsColiftable[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XIsColiftable[110X. [23XF: (
  \alpha, \beta ) \mapsto \mathtt{IsColiftable}( \alpha, \beta )[123X.[133X
  
  
  [1X3.12 [33X[0;0YInverses[133X[101X
  
  [33X[0;0YLet  [23X\alpha:  a  \rightarrow  b[123X  be  a  morphism.  An inverse of [23X\alpha[123X is a
  morphism  [23X\alpha^{-1}:  b  \rightarrow  a[123X such that [23X\alpha \circ \alpha^{-1}
  \sim_{b,b}   \mathrm{id}_b[123X   and   [23X\alpha^{-1}   \circ   \alpha   \sim_{a,a}
  \mathrm{id}_a[123X.[133X
  
  [1X3.12-1 AddInverse[101X
  
  [33X[1;0Y[29X[2XAddInverse[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given  function [23XF[123X to the category for the basic operation [10XInverse[110X. [23XF: \alpha
  \mapsto \alpha^{-1}[123X.[133X
  
  
  [1X3.13 [33X[0;0YTool functions for caches[133X[101X
  
  [1X3.13-1 IsEqualForCacheForMorphisms[101X
  
  [33X[1;0Y[29X[2XIsEqualForCacheForMorphisms[102X( [3Xphi[103X, [3Xpsi[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ytrue or false[133X
  
  [33X[0;0YCompares two objects in the cache[133X
  
  [1X3.13-2 AddIsEqualForCacheForMorphisms[101X
  
  [33X[1;0Y[29X[2XAddIsEqualForCacheForMorphisms[102X( [3Xc[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynorthing[133X
  
  [33X[0;0YBy  default,  CAP uses caches to store the values of Categorical operations.
  To  get  a value out of the cache, one needs to compare the input of a basic
  operation  with  its  previous  input. To compare morphisms in the category,
  IsEqualForCacheForMorphism  is  used.  By  default  this  is  an  alias  for
  IsEqualForMorphismsOnMor,  where  fail is substituted by false. If you add a
  function,  this  function  used  instead.  A function [23XF: a,b \mapsto bool[123X is
  expected  here.  The  output has to be true or false. Fail is not allowed in
  this context.[133X
  
  
  [1X3.14 [33X[0;0YHomomorphism structures[133X[101X
  
  [33X[0;0YHomomorphism  structures  are way to "oversee" the homomorphisms between two
  given  objects.  Let  [23XC[123X,  [23XD[123X  be categories. A [23XD[123X-homomorphism structure for [23XC[123X
  consists of the following data:[133X
  
  [30X    [33X[0;6Ya  functor [23XH: C^{\mathrm{op}} \times C \rightarrow D[123X (when [23XC[123X and [23XD[123X are
        Ab-categories, [23XH[123X is assumed to be bilinear).[133X
  
  [30X    [33X[0;6Yan object [23X1 \in D[123X, called the distinguished object,[133X
  
  [30X    [33X[0;6Ya  bijection  [23X\nu:  \mathrm{Hom}_{C}(a,b)  \simeq  \mathrm{Hom}_{D}(1,
        H(a,b))[123X natural in [23Xa,b \in C[123X.[133X
  
  [1X3.14-1 HomomorphismStructureOnObjects[101X
  
  [33X[1;0Y[29X[2XHomomorphismStructureOnObjects[102X( [3Xa[103X, [3Xb[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Yan object in [23XD[123X[133X
  
  [33X[0;0YThe  arguments  are  two  objects  [23Xa, b[123X in [23XC[123X. The output is the value of the
  homomorphism structure on objects [23XH(a,b)[123X.[133X
  
  [1X3.14-2 AddHomomorphismStructureOnObjects[101X
  
  [33X[1;0Y[29X[2XAddHomomorphismStructureOnObjects[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XHomomorphismStructureOnObjects[110X. [23XF: (a,b) \mapsto H(a,b)[123X.[133X
  
  [1X3.14-3 HomomorphismStructureOnMorphisms[101X
  
  [33X[1;0Y[29X[2XHomomorphismStructureOnMorphisms[102X( [3Xalpha[103X, [3Xbeta[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}_{D}(H(a',b), H(a,b'))[123X[133X
  
  [33X[0;0YThe  arguments  are  two  morphisms  [23X\alpha:  a  \rightarrow  a',  \beta:  b
  \rightarrow  b'[123X  in [23XC[123X. The output is the value of the homomorphism structure
  on morphisms [23XH(\alpha, \beta )[123X.[133X
  
  [1X3.14-4 HomomorphismStructureOnMorphismsWithGivenObjects[101X
  
  [33X[1;0Y[29X[2XHomomorphismStructureOnMorphismsWithGivenObjects[102X( [3Xs[103X, [3Xalpha[103X, [3Xbeta[103X, [3Xr[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}_{D}(H(a',b), H(a,b'))[123X[133X
  
  [33X[0;0YThe  arguments  are  an  object  [23Xs  =  H(a',b)[123X in [23XD[123X, two morphisms [23X\alpha: a
  \rightarrow  a',  \beta: b \rightarrow b'[123X in [23XC[123X, and an object [23Xr = H(a,b')[123X in
  [23XD[123X.  The  output  is  the  value  of  the homomorphism structure on morphisms
  [23XH(\alpha, \beta )[123X.[133X
  
  [1X3.14-5 AddHomomorphismStructureOnMorphismsWithGivenObjects[101X
  
  [33X[1;0Y[29X[2XAddHomomorphismStructureOnMorphismsWithGivenObjects[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XHomomorphismStructureOnMorphismsWithGivenObjects[110X.   [23XF:   (   s,   \alpha:  a
  \rightarrow a', \beta: b \rightarrow b', r ) \mapsto H( \alpha, \beta )[123X.[133X
  
  [1X3.14-6 DistinguishedObjectOfHomomorphismStructure[101X
  
  [33X[1;0Y[29X[2XDistinguishedObjectOfHomomorphismStructure[102X( [3XC[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Yan object in [23XD[123X[133X
  
  [33X[0;0YThe  argument is a category [23XC[123X. The output is the distinguished object [23X1[123X in [23XD[123X
  of the homomorphism structure.[133X
  
  [1X3.14-7 AddDistinguishedObjectOfHomomorphismStructure[101X
  
  [33X[1;0Y[29X[2XAddDistinguishedObjectOfHomomorphismStructure[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XDistinguishedObjectOfHomomorphismStructure[110X. [23XF: ( ) \mapsto 1[123X.[133X
  
  [1X3.14-8 InterpretMorphismAsMorphismFromDinstinguishedObjectToHomomorphismStructure[101X
  
  [33X[1;0Y[29X[2XInterpretMorphismAsMorphismFromDinstinguishedObjectToHomomorphismStructure[102X( [3Xalpha[103X ) [32X attribute[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}_{D}(1, H(a,a'))[123X[133X
  
  [33X[0;0YThe  argument is a morphism [23X\alpha: a \rightarrow a'[123X in [23XC[123X. The output is the
  corresponding  morphism  [23X\nu(  \alpha  ):  1 \rightarrow H(a,a')[123X in [23XD[123X of the
  homomorphism structure.[133X
  
  [1X3.14-9 AddInterpretMorphismAsMorphismFromDinstinguishedObjectToHomomorphismStructure[101X
  
  [33X[1;0Y[29X[2XAddInterpretMorphismAsMorphismFromDinstinguishedObjectToHomomorphismStructure[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XInterpretMorphismAsMorphismFromDinstinguishedObjectToHomomorphismStructure[110X.
  [23XF: (\alpha: a \rightarrow a') \mapsto (\nu(\alpha):1 \rightarrow H(a,a'))[123X.[133X
  
  [1X3.14-10 InterpretMorphismFromDinstinguishedObjectToHomomorphismStructureAsMorphism[101X
  
  [33X[1;0Y[29X[2XInterpretMorphismFromDinstinguishedObjectToHomomorphismStructureAsMorphism[102X( [3Xa[103X, [3Xa'[103X, [3Xiota[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya morphism in [23X\mathrm{Hom}_{C}(a,a')[123X[133X
  
  [33X[0;0YThe  arguments  are  objects  [23Xa,a'[123X  in [23XC[123X and a morphism [23X\iota: 1 \rightarrow
  H(a,a')[123X  in  [23XD[123X.  The output is the corresponding morphism [23X\nu^{-1}(\iota): a
  \rightarrow a'[123X in [23XC[123X of the homomorphism structure.[133X
  
  [1X3.14-11 AddInterpretMorphismFromDinstinguishedObjectToHomomorphismStructureAsMorphism[101X
  
  [33X[1;0Y[29X[2XAddInterpretMorphismFromDinstinguishedObjectToHomomorphismStructureAsMorphism[102X( [3XC[103X, [3XF[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  arguments  are  a category [23XC[123X and a function [23XF[123X. This operations adds the
  given    function    [23XF[123X   to   the   category   for   the   basic   operation
  [10XInterpretMorphismFromDinstinguishedObjectToHomomorphismStructureAsMorphism[110X.
  [23XF:   (a,a',\iota:   1   \rightarrow  H(a,a'))  \mapsto  (\nu^{-1}(\iota):  a
  \rightarrow a')[123X.[133X
  
  [1X3.14-12 SolveLinearSystemInAbCategory[101X
  
  [33X[1;0Y[29X[2XSolveLinearSystemInAbCategory[102X( [3Xalpha[103X, [3Xbeta[103X, [3Xgamma[103X ) [32X operation[133X
  [6XReturns:[106X  [33X[0;10Ya list of morphisms [23X[X_1, \dots, X_n][123X[133X
  
  [33X[0;0YThe  arguments  are  three  lists  [23X\alpha[123X, [23X\beta[123X, and [23X\gamma[123X. The first list
  [23X\alpha[123X  (the  left coefficients) is a list of list of morphisms [23X\alpha_{ij}:
  A_i  \rightarrow B_j[123X, where [23Xi = 1 \dots m[123X and [23Xj = 1 \dots n[123X for integers [23Xm,n
  \geq  1[123X. The second list [23X\beta[123X (the right coefficients) is a list of list of
  morphisms  [23X\beta_{ij}:  C_j  \rightarrow  D_i[123X, where [23Xi = 1 \dots m[123X and [23Xj = 1
  \dots  n[123X.  The  third  list  [23X\gamma[123X  (the right side) is a list of morphisms
  [23X\gamma_i: A_i \rightarrow D_i[123X, where [23Xi = 1, \dots, m[123X. The output is either a
  list of morphisms [23XX_j: B_j \rightarrow C_j[123X for [23Xj=1\dots n[123X solving the linear
  system   defined   by   [23X\alpha[123X,   [23X\beta[123X,   [23X\gamma[123X,   i.e.,  [23X\sum_{j  =  1}^n
  \alpha_{ij}\cdot  X_j  \cdot \beta_{ij} = \gamma_i[123X for all [23Xi = 1 \dots m[123X, or
  [23X\texttt{fail}[123X if no such solution exists.[133X
  
