  
  [1X4 Green's Relations[0X
  
  
  [1X4.1 Introduction[0X
  
  This chapter contains instructions on how to use the functions for computing
  Green's  relations  and  related  notions  for transformation semigroups and
  monoids that are implemented in [5XMONOID[0m.
  
  The  theory  behind  these  algorithms  is  developed  in  [LPRR98]  and the
  algorithms  themselves  are  described  in  [LPRR02].  Another  reference is
  [LM90].
  
  Green's  relations  can  be  calculated when [5XMONOID[0m is loaded using the same
  commands  that  you  would  used  when [5XMONOID[0m is not loaded; see [14X'Reference:
  Semigroups'[0m. For example, in [5XGAP[0m with the [5XMONOID[0m package loaded:
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> a:=Transformation([2,1,1,2,1]);;[0X
    [4Xgap> b:=Transformation([3,4,3,4,4]);;[0X
    [4Xgap> c:=Transformation([3,4,3,4,3]);;[0X
    [4Xgap> d:=Transformation([4,3,3,4,4]);;[0X
    [4Xgap> S:=Semigroup(a,b,c,d);[0X
    [4X<semigroup with 4 generators>[0X
    [4Xgap> GreensRClasses(S);[0X
    [4X[ {Transformation( [ 2, 1, 1, 2, 1 ] )}, {Transformation( [ 1, 2, 1, 2, 2 ] )}[0X
    [4X  , {Transformation( [ 1, 2, 1, 2, 1 ] )}, [0X
    [4X{Transformation( [ 2, 1, 1, 2, 2 ] )} ][0X
  [4X------------------------------------------------------------------[0X
  
  Without the [5XMONOID[0m package loaded:
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> a:=Transformation([2,1,1,2,1]);;[0X
    [4Xgap> b:=Transformation([3,4,3,4,4]);;[0X
    [4Xgap> c:=Transformation([3,4,3,4,3]);;[0X
    [4Xgap> d:=Transformation([4,3,3,4,4]);;[0X
    [4Xgap> S:=Semigroup(a,b,c,d);[0X
    [4X<semigroup with 4 generators>[0X
    [4Xgap> GreensRClasses(S);[0X
    [4X[ {Transformation( [ 1, 2, 1, 2, 1 ] )}, {Transformation( [ 1, 2, 1, 2, 2 ] )}[0X
    [4X  , {Transformation( [ 1, 2, 2, 1, 1 ] )}, [0X
    [4X{Transformation( [ 1, 2, 2, 1, 2 ] )} ][0X
  [4X------------------------------------------------------------------[0X
  
  The  only  noticable  differences are the representatives of the classes and
  the  order  the  classes appear in the list. These differences are caused by
  the  differences  in  the  methods for [10XGreensRClasses[0m in [5XMONOID [0m and the [5XGAP[0m
  library.
  
  Most  of  the  commands  in this section relate to how Green's relations are
  calculated  in [5XMONOID[0m. Although some of the commands might be used for other
  purposes, if all that is required is to calculate Green's classes, relations
  and so on, then this is done in the exactly the same way as described in the
  [5XGAP[0m manual; see [14X'Reference: Green's Relations'[0m.
  
  Due  to  inherent  difficulties with computing Green's L- and D-classes, the
  methods  used  to  compute  with Green's R-classes are the most efficient in
  [5XMONOID[0m.  Thus wherever possible it is advisable to use the commands relating
  to  Green's  R-classes  rather  than  those  relating  to Green's L-classes,
  D-classes, or H-classes.
  
  For small examples of semigroups, say with fewer than 40 elements, it may be
  more  efficient  to  use  the methods from the library than those in [5XMONOID[0m.
  This stems from the fact that there are higher overheads in the methods used
  in  [5XMONOID[0m.  In  either  case,  with  such  small examples computing Green's
  relations does not take much time.
  
  The  methods  in  [5XMONOID[0m allow the computation of individual Green's classes
  without the need to compute all the elements of the underlying semigroup. It
  is  also  possible  to compute all the R-classes, the number of elements and
  test  membership  in  a  transformation  semigroup without computing all the
  elements.  This  may  be  useful if you want to study a very large semigroup
  where computing all the elements of the semigroup is infeasible.
  
  
  [1X4.2 Data Structures[0X
  
  [1X4.2-1 GreensData[0m
  
  [2X> GreensData( [0X[3XC[0X[2X ) _________________________________________________[0Xoperation
  
  --    if   [10XC[0m  satisfies  [2XIsGreensRClass[0m  ([14XReference:  IsGreensRClass[0m),  then
        [10XGreensData[0m returns the value of [2XGreensRClassData[0m ([14X4.2-2[0m) with argument
        [10XC[0m.
  
  --    if   [10XC[0m  satisfies  [2XIsGreensLClass[0m  ([14XReference:  IsGreensLClass[0m),  then
        [10XGreensData[0m returns the value of [2XGreensLClassData[0m ([14X4.2-3[0m) with argument
        [10XC[0m.
  
  --    if   [10XC[0m  satisfies  [2XIsGreensHClass[0m  ([14XReference:  IsGreensHClass[0m),  then
        [10XGreensData[0m returns the value of [2XGreensHClassData[0m ([14X4.2-4[0m) with argument
        [10XC[0m.
  
  --    if   [10XC[0m  satisfies  [2XIsGreensDClass[0m  ([14XReference:  IsGreensDClass[0m),  then
        [10XGreensData[0m returns the value of [2XGreensDClassData[0m ([14X4.2-5[0m) with argument
        [10XC[0m.
  
  [1X4.2-2 GreensRClassData[0m
  
  [2X> GreensRClassData( [0X[3XC[0X[2X ) ___________________________________________[0Xattribute
  
  if    [10XC[0m   satisfies   [2XIsGreensRClass[0m   ([14XReference:   IsGreensRClass[0m),   then
  [10XGreensRClassData[0m  returns  an  object  in  the  category  [2XIsGreensRClassData[0m
  ([14X4.2-6[0m)  with representation [2XIsGreensRClassDataRep[0m ([14X4.2-8[0m) and the following
  four components:
  
  --    [10Xrep[0m the representative of the R-class.
  
  --    [10Xstrongorb[0m the strong orbit of the image of [10Xrep[0m under the action of the
        semigroup on sets.
  
  --    [10Xperms[0m  a  list  of  permutations  that  map  the  image  of [10Xrep[0m to the
        corresponding   image  in  [10Xstrongorb[0m,  that  is,  [10XOnSets(strongorb[i],
        perms[i])=strongorb[1][0m.
  
  --    [10Xschutz[0m  the  group  of  permutations  arising  from  elements  of  the
        semigroup  that  stabilise the image of [10Xrep[0m (called the [13X (generalized)
        right Schutzenberger group[0m).
  
  The  components [10Xstrongorb[0m, [10Xperms[0m, and [10Xschutz[0m are obtained using the function
  [2XStrongOrbitOfImage[0m  ([14X3.4-5[0m). Further details can be found in Algorithm C, D,
  E, F, and U of [LPRR02].
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> a:=Transformation( [ 2, 1, 4, 5, 6, 3 ] );;[0X
    [4Xgap> b:=Transformation( [ 2, 3, 1, 5, 4, 1 ] );;[0X
    [4Xgap> M:=Semigroup(a,b);;[0X
    [4Xgap> rc:=GreensRClassOfElement(M, a*b*a);[0X
    [4X{Transformation( [ 4, 1, 6, 5, 2, 2 ] )}[0X
    [4Xgap> GreensRClassData(rc);[0X
    [4XGreensRClassData( Transformation( [ 4, 1, 6, 5, 2, 2 ] ), [ [ 1, 2, 4, 5, 6 ], [0X
    [4X[ 1, 2, 3, 5, 6 ], [ 1, 2, 3, 4, 6 ], [ 1, 2, 3, 4, 5 ] ], [ (), (1,2)[0X
    [4X(3,6,5,4), (3,5)(4,6), (1,6,3,2)(4,5) ], Group( [ (), (2,4,6), (2,6,4), [0X
    [4X(1,2,6)(4,5) ] ) )[0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-3 GreensLClassData[0m
  
  [2X> GreensLClassData( [0X[3XS, f[0X[2X ) ________________________________________[0Xattribute
  
  if    [10XC[0m   satisfies   [2XIsGreensLClass[0m   ([14XReference:   IsGreensLClass[0m),   then
  [10XGreensLClassData[0m  returns  an  object  in  the  category  [2XIsGreensLClassData[0m
  ([14X4.2-6[0m)  with representation [2XIsGreensLClassDataRep[0m ([14X4.2-8[0m) and the following
  five components:
  
  --    [10Xrep[0m the representative of the L-class.
  
  --    [10Xstrongorb[0m  the  strong  orbit of the kernel of [10Xrep[0m under the action of
        the semigroup by [2XOnTuplesOfSetsAntiAction[0m ([14X3.2-1[0m).
  
  --    [10Xrelts[0m a list of relations such that
  
  KernelOfTransformation(relts[i]*x)=strongorb[1]
  
        whenever [10Xx[0m has
  
  KernelOfTransformation(x)=strongorb[i].
  
  --    [10Xinvrelts[0m the inverses of the relations [10Xrelts[0m, so that
  
  KernelOfTransformation(invrelts[i]*rep)=strongorb[i].
  
  --    [10Xschutz[0m the (generalised) left Schutzenberger group.
  
  Further details can be found in Algorithm G, H, I, and J of [LPRR02].
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> gens:=[ Transformation( [ 4, 1, 4, 5, 3 ] ),[0X
    [4X> Transformation( [ 5, 3, 5, 4, 3 ] ) ];;[0X
    [4Xgap> S:=Semigroup(gens);;[0X
    [4Xgap> C:=GreensLClassOfElement(S, gens[1]*gens[2]*gens[1]);[0X
    [4X{Transformation( [ 5, 3, 5, 4, 3 ] )}[0X
    [4Xgap> GreensLClassData(C);[0X
    [4XGreensLClassData( Transformation( [ 5, 3, 5, 4, 3 ] ), [0X
    [4X[ [ [ 1, 3 ], [ 2, 5 ], [ 4 ] ] ], [ Binary Relation on 5 points ], [0X
    [4X[ Binary Relation on 5 points ], Group( [ (), (3,5,4), (3,5) ] ) )[0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-4 GreensHClassData[0m
  
  [2X> GreensHClassData( [0X[3XS, f[0X[2X ) ________________________________________[0Xattribute
  
  if    [10XC[0m   satisfies   [2XIsGreensHClass[0m   ([14XReference:   IsGreensHClass[0m),   then
  [10XGreensLClassData[0m  returns  an  object  in  the  category  [2XIsGreensHClassData[0m
  ([14X4.2-6[0m)  with representation [2XIsGreensHClassDataRep[0m ([14X4.2-8[0m) and the following
  two components:
  
  --    [10Xrep[0m the representative of the H-class.
  
  --    [10Xschutz[0m  the  intersection  of  the left Schutzenberger group and right
        Schutzenberger  group  of  the  L-class  and  R-class  containing  the
        representative  [10Xrep[0m (that is, the intersection of the [10Xschutz[0m component
        of    [2XGreensRClassData[0m   ([14X4.2-2[0m)   and   the   [10Xschutz[0m   component   of
        [2XGreensLClassData[0m ([14X4.2-3[0m)).
  
  Further details can be found in Algorithm K, L, M, and N of [LPRR02].
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> gens:=[ Transformation( [ 2, 2, 5, 2, 3 ] ), [0X
    [4X> Transformation( [ 2, 5, 3, 5, 3 ] ) ];;[0X
    [4Xgap> S:=Semigroup(gens);;[0X
    [4Xgap> f:=Transformation( [ 5, 5, 3, 5, 3 ] );;[0X
    [4Xgap> GreensHClassData(GreensHClassOfElement(S, f));[0X
    [4XGreensHClassData( Transformation( [ 5, 5, 3, 5, 3 ] ), Group( () ) )[0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-5 GreensDClassData[0m
  
  [2X> GreensDClassData( [0X[3XS, f[0X[2X ) ________________________________________[0Xattribute
  
  if    [10XC[0m   satisfies   [2XIsGreensDClass[0m   ([14XReference:   IsGreensDClass[0m),   then
  [10XGreensDClassData[0m  returns  an  object  in  the  category  [2XIsGreensDClassData[0m
  ([14X4.2-6[0m)  with representation [2XIsGreensDClassDataRep[0m ([14X4.2-8[0m) and the following
  five components:
  
  --    [10Xrep[0m the representative of the D-class.
  
  --    [10XR[0m the result of [2XGreensRClassData[0m ([14X4.2-2[0m) with argument [10Xrep[0m.
  
  --    [10XL[0m the result of [2XGreensLClassData[0m ([14X4.2-3[0m) with argument [10Xrep[0m.
  
  --    [10XH[0m the result of [2XGreensHClassData[0m ([14X4.2-4[0m) with argument [10Xrep[0m.
  
  --    [10Xcosets[0m  a transversal of right cosets of the Schutzenberger group of [10XH[0m
        in the Schutzenberger group of [10XR[0m.
  
  Note that only the first three components are displayed. Further details can
  be found in Algorithm O, P, Q, R, S, and T of [LPRR02].
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> gens:=[ Transformation( [ 4, 1, 5, 2, 4 ] ), [0X
    [4X> Transformation( [ 4, 4, 1, 5, 3 ] ) ];;[0X
    [4Xgap> S:=Semigroup(gens);;[0X
    [4Xgap> f:=Transformation( [ 5, 5, 3, 3, 3 ] );;[0X
    [4Xgap> GreensDClassData(GreensDClassOfElement(S, f));[0X
    [4XGreensDClassData( Transformation( [ 5, 5, 3, 3, 3 [0X
    [4X] ), GreensRClassData( Transformation( [ 5, 5, 3, 3, 3 [0X
    [4X] ) ), GreensLClassData( Transformation( [ 5, 5, 3, 3, 3 ] ) ) )[0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X4.2-6 IsGreensData[0X
  
  [2X> IsGreensData( [0X[3Xobj[0X[2X ) ______________________________________________[0XCategory
  [2X> IsGreensRClassData( [0X[3Xobj[0X[2X ) ________________________________________[0XCategory
  [2X> IsGreensLClassData( [0X[3Xobj[0X[2X ) ________________________________________[0XCategory
  [2X> IsGreensHClassData( [0X[3Xobj[0X[2X ) ________________________________________[0XCategory
  [2X> IsGreensDClassData( [0X[3Xobj[0X[2X ) ________________________________________[0XCategory
  
  returns  [10Xtrue[0m  if [10Xobj[0m lies in the category [10XIsGreensData[0m, [10XIsGreensRClassData[0m,
  [10XIsGreensLClassData[0m,  [10XIsGreensHClassData[0m,  [10XIsGreensDClassData[0m,  respectively.
  The  objects  created  using  the  functions  [2XRClassData[0m ([14X4.2-7[0m), [2XLClassData[0m
  ([14X4.2-7[0m),  [2XHClassData[0m  ([14X4.2-7[0m),  and [2XDClassData[0m ([14X4.2-7[0m) lie in the categories
  [10XIsGreensRClassData[0m,          [10XIsGreensLClassData[0m,         [10XIsGreensHClassData[0m,
  [10XIsGreensDClassData[0m,  respectively, and all these categories are contained in
  the category [10XIsGreensData[0m.
  
  
  [1X4.2-7 XClassData[0X
  
  [2X> RClassData( [0X[3Xrec[0X[2X ) ________________________________________________[0Xfunction
  [2X> LClassData( [0X[3Xrec[0X[2X ) ________________________________________________[0Xfunction
  [2X> HClassData( [0X[3Xrec[0X[2X ) ________________________________________________[0Xfunction
  [2X> DClassData( [0X[3Xrec[0X[2X ) ________________________________________________[0Xfunction
  
  These  function  construct  objects  in  the  categories  [2XIsGreensRClassData[0m
  ([14X4.2-6[0m),   [2XIsGreensLClassData[0m   ([14X4.2-6[0m),   [2XIsGreensHClassData[0m  ([14X4.2-6[0m),  and
  [2XIsGreensDClassData[0m  ([14X4.2-6[0m)  subcategories of [2XIsGreensData[0m ([14X4.2-6[0m) using the
  output    from    [2XGreensRClassData[0m    ([14X4.2-2[0m),   [2XGreensLClassData[0m   ([14X4.2-3[0m),
  [2XGreensHClassData[0m ([14X4.2-4[0m), [2XGreensDClassData[0m ([14X4.2-5[0m).
  
  
  [1X4.2-8 IsGreensXClassDataRep[0X
  
  [2X> IsGreensRClassDataRep( [0X[3Xobj[0X[2X ) _______________________________[0XRepresentation
  [2X> IsGreensLClassDataRep( [0X[3Xobj[0X[2X ) _______________________________[0XRepresentation
  [2X> IsGreensHClassDataRep( [0X[3Xobj[0X[2X ) _______________________________[0XRepresentation
  [2X> IsGreensDClassDataRep( [0X[3Xobj[0X[2X ) _______________________________[0XRepresentation
  
  returns   [10Xtrue[0m  if  [10Xobj[0m  has  [10XIsGreensRClassDataRep[0m,  [10XIsGreensLClassDataRep[0m,
  [10XIsGreensHClassDataRep[0m,   or   [10XIsGreensDClassDataRep[0m,   respectively   as   a
  representation.
  
  These   representations   each   have   several   components   detailed   in
  [2XGreensRClassData[0m   ([14X4.2-2[0m),   [2XGreensLClassData[0m   ([14X4.2-3[0m),   [2XGreensHClassData[0m
  ([14X4.2-4[0m), [2XGreensDClassData[0m ([14X4.2-5[0m), respectively.
  
  [1X4.2-9 IsAssociatedSemigpTransSemigp[0m
  
  [2X> IsAssociatedSemigpTransSemigp( [0X[3XC[0X[2X ) _______________________________[0Xproperty
  
  returns  [10Xtrue[0m  if  [10XC[0m  is  a  Green's class of a transformation semigroup and
  returns [10Xfalse[0m otherwise.
  
  This attribute is required so that a Green's class knowns that it belongs to
  a  transformation  semigroup,  so that the methods defined in the [5XMONOID[0m are
  used in preference to those in the library.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> a:=Transformation( [ 2, 1, 4, 5, 6, 3 ] );;[0X
    [4Xgap> b:=Transformation( [ 2, 3, 1, 5, 4, 1 ] );;[0X
    [4Xgap> M:=Semigroup(a,b);;[0X
    [4Xgap> GreensLClassOfElement(M,a);[0X
    [4X{Transformation( [ 2, 1, 4, 5, 6, 3 ] )}[0X
    [4Xgap> IsAssociatedSemigpTransSemigp(last);[0X
    [4Xtrue[0X
    [4Xgap> f:=FreeSemigroup(3);;[0X
    [4Xgap> a:=f.1;; b:=f.2;; c:=f.3;; [0X
    [4Xgap> s:=f/[[a^2, a], [b^2,b], [c^2,c], [a*b,a], [b*a,b], [a*c,a], [0X
    [4X> [c*a,c], [b*c,b],[c*b,c]];[0X
    [4X<fp semigroup on the generators [ s1, s2, s3 ]>[0X
    [4Xgap> Size(s);[0X
    [4X3[0X
    [4Xgap> GreensLClassOfElement(s,a);[0X
    [4X{s1}[0X
    [4Xgap> IsAssociatedSemigpTransSemigp(last);[0X
    [4Xfalse[0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-10 SchutzenbergerGroup[0m
  
  [2X> SchutzenbergerGroup( [0X[3XD[0X[2X ) ________________________________________[0Xattribute
  
  if  [10XD[0m  satisfies  [2XIsGreensRClassData[0m  ([14X4.2-6[0m),  [2XIsGreensLClassData[0m  ([14X4.2-6[0m),
  [2XIsGreensHClassData[0m    ([14X4.2-6[0m),    or    [2XIsGreensDClassData[0m   ([14X4.2-6[0m),   then
  [10XSchutzenbergerGroup[0m returns the [10Xschutz[0m component of [10XD[0m.
  
  If  [10XD[0m  satisfies  [2XIsGreensRClass[0m ([14XReference: IsGreensRClass[0m), [2XIsGreensLClass[0m
  ([14XReference:  IsGreensLClass[0m),  [2XIsGreensHClass[0m  ([14XReference:  IsGreensHClass[0m),
  [2XIsGreensDClass[0m ([14XReference: IsGreensDClass[0m), then [10XSchutzenbergerGroup[0m returns
  the [10Xschutz[0m component of [10XGreensData[0m with argument [10XD[0m.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> gens:=[ Transformation( [ 4, 4, 3, 5, 3 ] ), [0X
    [4X> Transformation( [ 5, 1, 1, 4, 1 ] ), [0X
    [4X> Transformation( [ 5, 5, 4, 4, 5 ] ) ];;[0X
    [4Xgap> f:=Transformation( [ 4, 5, 5, 5, 5 ] );;[0X
    [4Xgap> SchutzenbergerGroup(GreensDClassOfElement(S, f));[0X
    [4XGroup([ (), (4,5) ])[0X
    [4Xgap> SchutzenbergerGroup(GreensRClassOfElement(S, f));[0X
    [4XGroup([ (), (4,5) ])[0X
    [4Xgap> SchutzenbergerGroup(GreensLClassOfElement(S, f));[0X
    [4XGroup([ (), (4,5) ])[0X
    [4Xgap> SchutzenbergerGroup(GreensHClassOfElement(S, f));[0X
    [4XGroup([ (), (4,5) ])[0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-11 Idempotents[0m
  
  [2X> Idempotents( [0X[3XX[, n][0X[2X ) ____________________________________________[0Xfunction
  
  returns a list of the idempotents in the transformation semigroup or Green's
  class [10XX[0m.
  
  If the optional second argument [10Xn[0m is present, then a list of the idempotents
  in [10XS[0m of rank [10Xn[0m is returned. If you are only interested in the idempotents of
  a given rank, then the second version of the function will likely be faster.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> S:=Semigroup([ Transformation( [ 2, 3, 4, 1 ] ), [0X
    [4X> Transformation( [ 3, 3, 1, 1 ] ) ]);;[0X
    [4Xgap> Idempotents(S, 1);[0X
    [4X[  ][0X
    [4Xgap> Idempotents(S, 2);                        [0X
    [4X[ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 1, 3, 3, 1 ] ), [0X
    [4X  Transformation( [ 2, 2, 4, 4 ] ), Transformation( [ 4, 2, 2, 4 ] ) ][0X
    [4Xgap> Idempotents(S, 3);                        [0X
    [4X[  ][0X
    [4Xgap> Idempotents(S, 4);                        [0X
    [4X[ Transformation( [ 1, 2, 3, 4 ] ) ][0X
    [4Xgap> Idempotents(S);[0X
    [4X[ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 1, 2, 3, 4 ] ), [0X
    [4X  Transformation( [ 1, 3, 3, 1 ] ), Transformation( [ 2, 2, 4, 4 ] ), [0X
    [4X  Transformation( [ 4, 2, 2, 4 ] ) ][0X
  [4X------------------------------------------------------------------[0X
  
  [1X4.2-12 PartialOrderOfDClasses[0m
  
  [2X> PartialOrderOfDClasses( [0X[3XS[0X[2X ) _____________________________________[0Xattribute
  
  returns  the  partial  order  of  the  [10XD[0m-classes of [10XS[0m as a directed graph in
  [5XGRAPE[0m, if it is installed, using the command
  
  [4X---------------------------  Example  ----------------------------[0X
    [4XGraph(Group(()), [1..Length(GreensDClasses(S))], OnPoints, function(x,y)[0X
    [4Xreturn y in poset[x]; end, true); ;[0X
  [4X------------------------------------------------------------------[0X
  
  where [10Xy[0m in [10Xposet[x][0m if and only if [10XS^1yS^1[0m is a subset of [10XS^1 xS^1[0m.
  
  If [5XGRAPE[0m is not loaded, then the list [10Xposet[0m is returned instead.
  
