Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  invsgp.gi   Sprache: unbekannt

 
#############################################################################
##
##  This file is part of GAP, a system for computational discrete algebra.
##  This file's authors include J. D. Mitchell.
##
##  Copyright of GAP belongs to its developers, whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
##  This file contains the declaration of operations for inverse semigroups.
##

InstallMethod(GeneratorsOfInverseSemigroup,
"for a group with known generators",
[IsGroup and HasGeneratorsOfGroup],
GeneratorsOfGroup);

InstallMethod(GeneratorsOfInverseMonoid,
"for a group with known generators",
[IsGroup and HasGeneratorsOfGroup],
GeneratorsOfGroup);

InstallImmediateMethod(GeneratorsOfSemigroup,
IsInverseSemigroup and HasGeneratorsOfInverseSemigroup, 0,
function(S)
  local gens, out, x;
  gens := GeneratorsOfInverseSemigroup(S);
  out := ShallowCopy(gens);
  for x in gens do
    if not IsIdempotent(x) then
      Add(out, x ^ -1);
    fi;
  od;
  MakeImmutable(out);
  return out;
end);

#

InstallMethod(IsInverseSubsemigroup, "for a semigroup and a semigroup",
[IsSemigroup, IsSemigroup],
function(s, t)
  return IsSubsemigroup(s, t) and IsInverseSemigroup(t);
end);

#

InstallMethod(AsInverseMonoid, "for an inverse monoid",
[IsInverseMonoid], 100, IdFunc );

#

InstallMethod(AsInverseMonoid,
"for an inverse semigroup with known generators",
[IsInverseSemigroup and HasGeneratorsOfInverseSemigroup],
function(S)
  local gens, pos;

  if not (IsMultiplicativeElementWithOneCollection(S)
          and One(S) <> fail and One(S) in S) then
    return fail;
  fi;

  gens := GeneratorsOfInverseSemigroup(S);

  if CanEasilyCompareElements(gens) then
    pos := Position(gens, One(S));
    if pos <> fail then
      gens := ShallowCopy(gens);
      Remove(gens, pos);
    fi;
  fi;
  return InverseMonoid(gens);
end);

#

InstallOtherMethod(IsInverseSemigroup, "for an object", [IsObject], ReturnFalse);

#

InstallMethod(\.,"for an inverse semigroup with generators and pos int",
[IsInverseSemigroup and HasGeneratorsOfInverseSemigroup, IsPosInt],
function(s, n)
  s:=GeneratorsOfInverseSemigroup(s);
  n:=NameRNam(n);
  n:=Int(n);
  if n=fail or Length(s)<n then
    Error("the second argument should be a positive integer not greater than",
     " the number of generators of the semigroup in the first argument");
  fi;
  return s[n];
end);

#

InstallMethod(\., "for an inverse monoid with generators and pos int",
[IsInverseMonoid and HasGeneratorsOfInverseMonoid, IsPosInt],
function(s, n)
  s:=GeneratorsOfInverseMonoid(s);
  n:=NameRNam(n);
  n:=Int(n);
  if n=fail or Length(s)<n then
    Error("usage: the second argument should be a pos int not greater than",
     " the number of generators of the semigroup in the first argument");
  fi;
  return s[n];
end);

#

InstallGlobalFunction(InverseMonoid,
function(arg)
  local out, i;

  if Length(arg) = 0 or (Length(arg) = 1 and HasIsEmpty(arg[1])
      and IsEmpty(arg[1])) then
    ErrorNoReturn("Usage: cannot create an inverse monoid with no ",
                  "generators,");
  fi;

  out := [];
  for i in [1 .. Length(arg)] do
    if i = Length(arg) and IsRecord(arg[i]) then
      if not IsGeneratorsOfInverseSemigroup(out) then
        ErrorNoReturn("Usage: InverseMonoid(<gen>,...), ",
                      "InverseMonoid(<gens>), InverseMonoid(<D>),");
      fi;
      return InverseMonoidByGenerators(out, arg[i]);
    elif IsMultiplicativeElementWithOne(arg[i]) or IsMatrix(arg[i]) then
      Add(out, arg[i]);
    elif IsListOrCollection(arg[i]) then
      if IsGeneratorsOfInverseSemigroup(arg[i]) then
        if HasGeneratorsOfInverseSemigroup(arg[i]) then
          Append(out, GeneratorsOfInverseSemigroup(arg[i]));
        elif HasGeneratorsOfSemigroup(arg[i]) or IsMagmaIdeal(arg[i]) then
          Append(out, GeneratorsOfSemigroup(arg[i]));
        elif IsList(arg[i]) then
          Append(out, arg[i]);
        else
          Append(out, AsList(arg[i]));
        fi;
      elif not IsEmpty(arg[i]) then
          ErrorNoReturn("Usage: InverseMonoid(<gen>,...), ",
                        "InverseMonoid(<gens>), InverseMonoid(<D>),");
      fi;
    else
        ErrorNoReturn("Usage: InverseMonoid(<gen>,...), ",
                      "InverseMonoid(<gens>), InverseMonoid(<D>),");
    fi;
  od;
  if not IsGeneratorsOfInverseSemigroup(out) then
    ErrorNoReturn("Usage: InverseMonoid(<gen>,...), ",
                  "InverseMonoid(<gens>), InverseMonoid(<D>),");
  fi;
  return InverseMonoidByGenerators(out);
end);

#

InstallGlobalFunction(InverseSemigroup,
function(arg)
  local out, i;

  if Length(arg) = 0 or (Length(arg) = 1 and HasIsEmpty(arg[1])
      and IsEmpty(arg[1])) then
    ErrorNoReturn("Usage: cannot create an inverse semigroup with no ",
                  "generators,");
  fi;

  out := [];
  for i in [1 .. Length(arg)] do
    if i = Length(arg) and IsRecord(arg[i]) then
      if not IsGeneratorsOfInverseSemigroup(out) then
        ErrorNoReturn("Usage: InverseSemigroup(<gen>, ...), ",
                      "InverseSemigroup(<gens>), InverseSemigroup(<D>),");
      fi;
      return InverseSemigroupByGenerators(out, arg[i]);
    elif IsMultiplicativeElement(arg[i]) or IsMatrix(arg[i]) then
      Add(out, arg[i]);
    elif IsListOrCollection(arg[i]) then
      if IsGeneratorsOfInverseSemigroup(arg[i]) then
        if HasGeneratorsOfInverseSemigroup(arg[i]) then
          Append(out, GeneratorsOfInverseSemigroup(arg[i]));
        elif HasGeneratorsOfSemigroup(arg[i]) or IsMagmaIdeal(arg[i]) then
          Append(out, GeneratorsOfSemigroup(arg[i]));
        elif IsList(arg[i]) then
          Append(out, arg[i]);
        else
          Append(out, AsList(arg[i]));
        fi;
      elif not IsEmpty(arg[i]) then
          ErrorNoReturn("Usage: InverseSemigroup(<gen>, ...), ",
                        "InverseSemigroup(<gens>), InverseSemigroup(<D>),");
      fi;
    else
      ErrorNoReturn("Usage: InverseSemigroup(<gen>, ...), ",
                    "InverseSemigroup(<gens>), InverseSemigroup(<D>),");
    fi;
  od;
  if not IsGeneratorsOfInverseSemigroup(out) then
    ErrorNoReturn("Usage: InverseSemigroup(<gen >, ...), ",
                  "InverseSemigroup(<gens>), InverseSemigroup(<D>),");
  fi;
  return InverseSemigroupByGenerators(out);
end);

#

InstallMethod(InverseMonoidByGenerators,
[IsCollection],
function(gens)
  local S, one, pos;

  S := Objectify(NewType(FamilyObj(gens), IsMagmaWithOne
                                          and IsInverseSemigroup
                                          and IsAttributeStoringRep), rec());

  gens := AsList(gens);

  if CanEasilyCompareElements(gens) and IsFinite(gens)
      and IsMultiplicativeElementWithOneCollection(gens) then
    one := One(gens);
    SetOne(S, one);
    pos := Position(gens, one);
    if pos <> fail  then
      SetGeneratorsOfInverseSemigroup(S, gens);
      if Length(gens) = 1 then # Length(gens) <> 0 since One(gens) in gens
        SetIsTrivial(S, true);
      elif not IsPartialPermCollection(gens) or One(gens) =
        One(gens{Concatenation([1 .. pos - 1], [pos + 1 .. Length(gens)])}) then
        # if gens = [PartialPerm([1,2]), PartialPerm([1])], then removing the One
        # = gens[1] from this, it is not possible to recreate the semigroup using
        # Monoid(PartialPerm([1])) (since the One in this case is
        # PartialPerm([1]) not PartialPerm([1,2]) as it should be.
        gens := ShallowCopy(gens);
        Remove(gens, pos);
      fi;
      SetGeneratorsOfInverseMonoid(S, gens);
    else
      SetGeneratorsOfInverseMonoid(S, gens);
      gens := ShallowCopy(gens);
      Add(gens, one);
      SetGeneratorsOfInverseSemigroup(S, gens);
    fi;
  else
    SetGeneratorsOfInverseMonoid(S, gens);
  fi;

  return S;
end);

#

InstallMethod(InverseSemigroupByGenerators, "for a collection",
[IsCollection],
function(gens)
  local S, pos;

  S := Objectify(NewType (FamilyObj(gens), IsMagma
                                           and IsInverseSemigroup
                                           and IsAttributeStoringRep), rec());
  gens := AsList(gens);
  SetGeneratorsOfInverseSemigroup(S, gens);

  if IsMultiplicativeElementWithOneCollection(gens)
      and CanEasilyCompareElements(gens)
      and IsFinite(gens) then
    pos := Position(gens, One(gens));
    if pos <> fail then
      SetFilterObj(S, IsMonoid);
      if Length(gens) = 1 then # Length(gens) <> 0 since One(gens) in gens
        SetIsTrivial(S, true);
      elif not IsPartialPermCollection(gens) or One(gens) =
          One(gens{Concatenation([1 .. pos - 1], [pos + 1 .. Length(gens)])}) then
        # if gens = [PartialPerm([1,2]), PartialPerm([1])], then removing the One
        # = gens[1] from this, it is not possible to recreate the semigroup using
        # Monoid(PartialPerm([1])) (since the One in this case is
        # PartialPerm([1]) not PartialPerm([1,2]) as it should be.
        gens := ShallowCopy(gens);
        Remove(gens, pos);
      fi;
      SetGeneratorsOfInverseMonoid(S, gens);
    fi;
  fi;
  return S;
end);

#

InstallMethod(InverseSubsemigroupNC,
"for an inverse semigroup and collection",
[IsInverseSemigroup, IsCollection],
function(s, gens)
  local t;
  t:=InverseSemigroup(gens);
  SetParent(t, s);
  return t;
end);

#

InstallMethod(InverseSubsemigroup,
"for an inverse semigroup and collection",
[IsInverseSemigroup, IsCollection],
function(s, gens)
  if ForAll(gens, x-> x in s) then
    return InverseSubsemigroupNC(s, gens);
  fi;
  ErrorNoReturn("the specified elements do not belong to the first argument,");
end);

#

InstallMethod(InverseSubmonoidNC,
"for an inverse monoid and collection",
[IsInverseMonoid, IsCollection],
function(s, gens)
  local t;

  t:=InverseMonoid(gens);
  SetParent(t, s);
  return t;
end);

#

InstallMethod(InverseSubmonoid,
"for an inverse monoid and collection",
[IsInverseMonoid, IsCollection],
function(s, gens)
  if ForAll(gens, x-> x in s) then
    if One(s)<>One(gens) then
      Append(gens, One(s));
    fi;
    return InverseSubmonoidNC(s, gens);
  fi;
  ErrorNoReturn("the specified elements do not belong to the first argument,");
end);

#

InstallMethod(IsSubsemigroup,
"for an inverse semigroup and inverse semigroup with generators",
[IsInverseSemigroup, IsInverseSemigroup and HasGeneratorsOfInverseSemigroup],
function(s, t)
  return ForAll(GeneratorsOfInverseSemigroup(t), x-> x in s);
end);

#

InstallMethod(\=, "for an inverse semigroups with generators",
[IsInverseSemigroup and HasGeneratorsOfInverseSemigroup,
IsInverseSemigroup and HasGeneratorsOfInverseSemigroup],
function(s, t)
return ForAll(GeneratorsOfInverseSemigroup(s), x-> x in t)
 and ForAll(GeneratorsOfInverseSemigroup(t), x-> x in s);
end);

InstallMethod( String,
    "for a inverse semigroup",
    [ IsInverseSemigroup ],
    function( S )
    return "InverseSemigroup( ... )";
    end );

InstallMethod( PrintObj,
    "for a inverse semigroup with known generators",
    [ IsInverseSemigroup and HasGeneratorsOfInverseSemigroup ],
    function( S )
    Print( "InverseSemigroup( ", GeneratorsOfInverseSemigroup( S ), " )" );
    end );

InstallMethod( String,
    "for a inverse semigroup with known generators as an inverse semigroup",
    [ IsInverseSemigroup and HasGeneratorsOfInverseSemigroup ],
    function( S )
    return STRINGIFY( "InverseSemigroup( ",
     GeneratorsOfInverseSemigroup( S ), " )" );
    end );

InstallMethod( String,
    "for a inverse semigroup with known generators as a semigroup",
    [ IsInverseSemigroup and HasGeneratorsOfSemigroup ],
    function( S )
    return STRINGIFY( "Semigroup( ",
     GeneratorsOfSemigroup( S ), " )" );
    end );

InstallMethod( PrintString,
    "for a inverse semigroup with known generators",
    [ IsInverseSemigroup and HasGeneratorsOfInverseSemigroup ],
    function( S )
    return PRINT_STRINGIFY( "InverseSemigroup( ",
     GeneratorsOfInverseSemigroup( S ), " )" );
    end );

InstallMethod( ViewString,
    "for a inverse semigroup",
    [ IsInverseSemigroup ],
    function( S )
    return "<inverse semigroup>" ;
    end );

#InstallMethod( ViewString,
#    "for a inverse semigroup with generators",
#    [ IsInverseSemigroup and HasGeneratorsOfInverseSemigroup ],
#    function( S )
#    return STRINGIFY( "<inverse semigroup with ",
#      Pluralize( Length( GeneratorsOfInverseSemigroup( S ) ), "generator" ),
#      ">" );
#    end );

#

InstallMethod( String,
    "for a inverse monoid",
    [ IsInverseMonoid ],
    function( S )
    return "InverseMonoid( ... )";
    end );

InstallMethod( PrintObj,
    "for a inverse monoid with known generators",
    [ IsInverseMonoid and HasGeneratorsOfInverseMonoid ],
    function( S )
    Print( "InverseMonoid( ", GeneratorsOfInverseMonoid( S ), " )" );
    end );

InstallMethod( String,
    "for a inverse monoid with known generators as a monoid",
    [ IsInverseMonoid and HasGeneratorsOfMonoid ],
    function( S )
    return STRINGIFY( "Monoid( ",
     GeneratorsOfMonoid( S ), " )" );
    end );

InstallMethod( String,
    "for a inverse monoid with known generators as an inverse monoid",
    [ IsInverseMonoid and HasGeneratorsOfInverseMonoid ],
    function( S )
    return STRINGIFY( "InverseMonoid( ",
     GeneratorsOfInverseMonoid( S ), " )" );
    end );


InstallMethod( PrintString,
    "for a inverse monoid with known generators",
    [ IsInverseMonoid and HasGeneratorsOfInverseMonoid ],
    function( S )
    return PRINT_STRINGIFY( "InverseMonoid( ",
     GeneratorsOfInverseMonoid( S ), " )" );
    end );

InstallMethod( ViewString,
    "for a inverse monoid",
    [ IsInverseMonoid ],
    function( S )
    return "<inverse monoid>" ;
    end );

#InstallMethod( ViewString,
#    "for a inverse monoid with generators",
#    [ IsInverseMonoid and HasGeneratorsOfInverseMonoid ],
#    function( S )
#    return STRINGIFY( "<inverse monoid with ",
#     Pluralize( Length( GeneratorsOfInverseMonoid( S ) ), "generator" ), ">" );
#    end );

#

InstallMethod( AsInverseSemigroup,
    "for an inverse semigroup",
    [ IsInverseSemigroup ], 100,
    IdFunc );

InstallMethod( AsInverseMonoid,
    "for an inverse monoid",
    [ IsInverseMonoid ], 100,
    IdFunc );


#

InstallMethod( IsRegularSemigroupElement,
"for an inverse semigroup", IsCollsElms,
[IsInverseSemigroup, IsAssociativeElement],
function(s, x)
return x in s;
end);

[ Dauer der Verarbeitung: 0.25 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge