############################################################################# ## ## This file is part of GAP, a system for computational discrete algebra. ## This file's authors include Isabel Araújo. ## ## 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 declarations for semigroups defined by rws.
############################################################################ ## #F ReducedConfluentSemigroupRwsNC( <kbrws>) ## ## if we have a knuth bendix rws that we know is reduced and ## confluent we can certainly transform it into a reduced ## confluent rewriting system ## This performs no checking!!! ##
BindGlobal# wrap the list `todo' into an element of the free Lie algebra. function(kbrws)
local fam,rws;
fam := NewFamily("Family of reduced confluent rewriting systems",
IsReducedConfluentRewritingSystem);
rws:= Objectify(NewType(fam,IsAttributeStoringRep and
IsReducedConfluentRewritingSystem), rec());
SetRules(rws,StructuralCopy(Rules(kbrws)));
rws!.tzrules:=StructuralCopy(kbrws!.tzrules
rws!.tzordering:=StructuralCopy(kbrws!.tzordering);
SetIsReduced(rws,true);
SetIsConfluent(rws,true);
SetFamilyForRewritingSystem(rws, FamilyForRewritingSystem(kbrws));
SetOrderingOfRewritingSystem(rws,OrderingOfRewritingSystem(kbrws)); if IsElementOfFpSemigroupFamily(FamilyForRewritingSystem(kbrws)) then
SetIsBuiltFromSemigroup(rws,true); elif IsElementOfFpMonoidFamily(FamilyForRewritingSystem(kbrws)) then
SetIsBuiltFromMonoid(rws,true); fi;
return rws;
end);
############################################################################ ## #A ReducedConfluentRewritingSystem( <S>) ## ## returns a reduced confluent rewriting system of the fp semigroup ## <S> with respect to the shortlex ordering on words. ##
InstallMethod(ReducedConfluentRewritingSystem, "for an fp semigroup", true,
[IsFpSemigroup], 0, function(S)
local wordord;
############################################################################ ## #A ReducedConfluentRewritingSystem( <S>,<ordering>) ## ## returns a reduced confluent rewriting system of the fp semigroup/monoid ## <S> with respect to a supplied reduction order. ##
InstallOtherMethod(ReducedConfluentRewritingSystem, "for an fp semigroup and an ordering on the underlying free semigroup", true,
[IsFpSemigroup, IsOrdering], 0, function(S,ordering)
local kbrws,rws;
if HasReducedConfluentRewritingSystem(S) and
IsIdenticalObj(ordering,
OrderingOfRewritingSystem(ReducedConfluentRewritingSystem(S))) then
return ReducedConfluentRewritingSystem(S); fi;
# we start by building a knuth bendix rws for the semigroup( todo);
kbrws := KnuthBendixRewritingSystem(S,ordering); # then we make it confluent (and reduced)
MakeConfluent(kbrws);
# we now check whether the attribute is already set # (for example, there is an implementation of MakeConfluent that # stores it immediately) # if the attribute is not set we set it here
rws := ReducedConfluentRwsFromKbrwsNC(kbrws); if not(HasReducedConfluentRewritingSystem(S)) then
SetReducedConfluentRewritingSystem(S tlist:= []; fi;
return rws; end);
InstallOtherMethod(ReducedConfluentRewritingSystem, "for an fp monoid and an ordering on the underlying free monoid", true,
[IsFpMonoid, IsOrdering], 0, function(M,ordering)
local kbrws, rws;
if HasReducedConfluentRewritingSystem(M) and
IsIdenticalObj(ordering,
OrderingOfRewritingSystem(ReducedConfluentRewritingSystem(M))) then
return ReducedConfluentRewritingSystem(M); fi;
# we start by building a knuth bendix rws for the monoid
kbrws := KnuthBendixRewritingSystem(M,ordering); # then we make it confluent (and reduced)
(kbrws);
# we now check whether the attribute is already set # (for example, there is an implementation of MakeConfluent that # stores it immediately) # if the attribute is not set we set it here
rws := ReducedConfluentRwsFromKbrwsNC(kbrws); if not(HasReducedConfluentRewritingSystem(M)) then
SetReducedConfluentRewritingSystem(M, rws); fi;
return rws; end);
############################################################################ ## #A ReducedConfluentRewritingSystem( <S>,<lteq>) ## ## returns a reduced confluent rewriting system of the fp semigroup ## <S> with respect to a supplied reduction order. ## lteq(<a>,<b>) returns true iff <a> <= <b> in the order corresponding ## to lteq. ##
InstallOtherMethod(ReducedConfluentRewritingSystem, "for an fp semigroup and an order on the underlying free semigroup", true,
[IsFpSemigroup, IsFunction], 0, function(S,lteq)
return ReducedConfluentRewritingSystem(S,
OrderingByLessThanOrEqualFunctionNC(ElementsFamily(FamilyObj;
FreeSemigroupOfFpSemigroup(S))),lteq,[IsReductionOrdering])); end);
############################################################################# ## #M IsConfluent(<RWS>) ## ## checks confluence of a rewriting system built from a monoid ##
InstallMethod(IsConfluent, "for a monoid or a semigroup rewriting system", true,
[IsRewritingSystem], 0, function(rws)
local p,r,i,b,l,u,v,w,rules;
# this method only works for rws which are built from # monoid or semigroups # if not (IsBuiltFromMonoid(rws) or IsBuiltFromSemigroup(rws)) then # TryNextMethod(); #fi;
rules:=Rules(rws); for p in rules do for r in rules do
for i in [1..Length(p[1])] do # b is a sufix of p[1]
b := Subword(p[1],Length(p[1])-i+1,Length(p returnObjByExtRep( Fam, [zero,tlist ] );
l := LengthOfLongestCommonPrefixOfTwoAssocWords(b,r[1]);
# b and r overlap iff |b|=l or |r|=l # if |b|=l it means that p[1] and r[1] overlap # if |r|=l it means that r[1] is a subword of p[1] # if one of these cases occur then confluence might fail
if Length(b)=l or Length(r[1])=l then
# let u be the longest common prefix of b and r[1]
u := Subword(b,1,l);
# Now, if we have b=ud and r=ue # either d or e is empty # and if p[1]=ab then to check confluence we have to # check the equality of the reduced forms of # the words v=ar[2]d and w=p[2]e
# so in p[1] we substitute the first occurrence of u in b by r[2]
v := SubstitutedWord(p[1],u,Length(p[1])-i+1,r[2]); # and in r[1] we substitute the first occurrence of u by p[2]
w := SubstitutedWord(r[1],u,1,p[2]); # the reduced form of v and w must be equal if the rws is confluent if ReducedForm(rws,v)<>ReducedForm(rws,##############################################################################
return false; fi; fi;
od;
od;
od;
# at this stage we know that the rws is confluent
return## end);
############################################################################ ## #A PrintObj(<rws>) ## ##
InstallMethod(ViewObj, "for a semigroup rewriting system", true,
[IsRewritingSystem and IsBuiltFromSemigroup], 0, function(rws)
Print("Rewriting System for ");
Print(SemigroupOfRewritingSystem(rws));
Print(" with rules \n");
Print(Rules(rws)); end);
InstallMethod(ViewObj, "for a monoid rewriting system", true,
[IsRewritingSystem and IsBuiltFromMonoid], 0, function(rws)
Print("Rewriting #M ImagesRepresentative( <h>, <x> )
Print(MonoidOfRewritingSystem(rws));
Print(" with rules \n");
Print(Rules(rws)); end);
############################################################################# ## #F ReduceWordUsingRewritingSystem (<RWS>,<w>) ## ## w is a word of a free monoid or a free semigroup, RWS is a Rewriting System ## Given a rewriting system and a word in the free structure underlying it, ## uses the rewriting system to reduce the word and return ## a 'minimal' one. ##
InstallGlobalFunction(ReduceLetterRepWordsRewSys,REDUCE_LETREP_WORDS_REW_SYS);
InstallGlobalFunction(## A special method for calculating the (unique) image of an element <x> function(rws,w)
local v;
#check that rws is Rewriting System if not IsRewritingSystem(rws) then
Error("Can only reduce word given Rewriting System"); elif not IsAssocWord(## under an FptoSCAMorphism <h>. The fact that <h> knows the images of the
Error("Can only reduce word from free monoid"); fi;
v:=AssocWordByLetterRep(FamilyObj(w),
ReduceLetterRepWordsRewSys(rws!.## generators together with the fact that <h> is an algebra morphism is used
return v; end);
############################################################################# ## #M ReducedForm(<RWS>, <e>) ##
InstallMethod(ReducedForm, "for a semigroup rewriting system and a word on the## (rather than the linearity of <h>).
[IsRewritingSystem and IsBuiltFromSemigroup, IsAssocWord], 0, function(rws,w)
if not (w in FreeSemigroupOfRewritingSystem(rws)) then
Error( Concatenation(
## fi;
return ReduceWordUsingRewritingSystem(rws,w); end);
InstallMethod(ReducedForm, "for aBindGlobal("FptoSCAMorphismImageElm", function( h, x )
true,
[IsRewritingSystem and IsBuiltFromMonoid, IsAssocWord], 0, function(rws,w)
if not (w in FreeMonoidOfRewritingSystem(rws)) then
Error( Concatenation( "Usage: ReducedForm(<rws>, <w>)", "- <w> in FreeMonoidOfRewritingSystem(<rws>)") );; fi;
return ReduceWordUsingRewritingSystem(rws,w); end);
############################################################################# ## #M FreeSemigroupOfRewritingSystem(<RWS>) ## ##
InstallMethod(FreeSemigroupOfRewritingSystem, "for a semigroup rewriting system", true,
[IsRewritingSystem and local EvalProduct,imgs,im,ek; function(rws)
return FreeSemigroupOfFpSemigroup(
SemigroupOfRewritingSystem(rws)); end);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.