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


Quelle  kbrws.gi   Sprache: unbekannt

 
##############################################################################
##
#W  kbrws.gi                   Kan Package                     Chris Wensley
#W                                                           & Anne Heyworth
#Y  Copyright (C) 1996-2023, Chris Wensley and Anne Heyworth 
##
##  This file contains functions taken from the library files
##  rws.gi and kbsemi.gi, and modified to allow partial rewrite systems
##

#############################################################################
####     these functions taken from rws.gi or kbsemi.gi and modified     ####
############################################################################# 

#############################################################################
##
#G  LimitedMakeKnuthBendixRewritingSystemConfluent
#M  MakeConfluent
#M  KnuthBendixRewritingSystem
#M  ReducedConfluentRewritingSystem
##
BindGlobal("LimitedMakeKnuthBendixRewritingSystemConfluent",
function( kbrws, limit )

    local   pn,lp,rl,p,i,ok;              #loop variables

    if ( limit < 0 ) then
        Error( "limit must be non-negative" );
    fi;
    # if kbrws!.reduced is true then it means that the system knows 
    # it is reduced: if it is false it _might_ be reduced or not.
    if not kbrws!.reduced then
        ReduceRules(kbrws);
    fi;

    # we check all pairs of relations for overlaps. In most cases there will
    # be no overlaps. Therefore cally an inde xp in the pairs list and reduce
    # this list, only if `AddRules' gets called. This avoids creating a lot 
    # of garbage lists.
    ok := true;
    p := 1;
    rl := 50;
    pn := Length(kbrws!.pairs2check);
    lp := Length(kbrws!.pairs2check);
    while ok do
        i := kbrws!.pairs2check[p];
        ## Print(">>>>> sending ",i," to KBOverlaps\n");
        p := KBOverlaps(i[1],i[2],kbrws,p)+1;
        lp := Length(kbrws!.pairs2check);
        if ( Length(kbrws!.tzrules) > rl ) or ( AbsInt(lp-pn) > 10000 ) then
            Info( InfoKnuthBendix, 1, Length(kbrws!.tzrules),
                " rules, and ", lp, " pairs" );
            rl := Length(kbrws!.tzrules)+50;
            pn := lp;
        fi;
        ok  :=  ( ( lp >= p ) and 
                  ( ( limit = 0 ) or ( Length(kbrws!.tzrules) <= limit ) ) );
    od;
    Info( InfoKnuthBendix, 2, "Leaving LimitedKBRSC with ", 
        Length(kbrws!.tzrules), " rules, and limit = ", limit );
    if ( ( limit > 0 ) and ( Length(kbrws!.tzrules) >= limit ) 
         and ( InfoLevel( InfoKnuthBendix ) > 0 ) ) then 
        Print( "#I WARNING: reached supplied limit ", limit, 
               " on number of rules\n" );
        if ( lp < 800 ) then
            Info( InfoKan, 2, "pairs2check: ", kbrws!.pairs2check );
        else
            Info( InfoKan, 2, "pairs2check has length ", lp );
        fi;
    else
        kbrws!.pairs2check := [];
    fi;
end );

InstallOtherMethod( MakeConfluent, "for Knuth Bendix Rewriting System",
    true, [ IsKnuthBendixRewritingSystem and IsKnuthBendixRewritingSystemRep 
            and IsMutable and IsBuiltFromMonoid, IsInt ], 0,
function( kbrws, limit )
    local rws;

    LimitedMakeKnuthBendixRewritingSystemConfluent( kbrws, limit );
    # if the monoid of the kbrws does not have a ReducedConfluentRws 
    # build one from kbrws and then store it in the monoid 
    if not HasReducedConfluentRewritingSystem(
                      MonoidOfRewritingSystem(kbrws) ) then
        rws := ReducedConfluentRwsFromKbrwsNC(kbrws);
    SetReducedConfluentRewritingSystem(MonoidOfRewritingSystem(kbrws),rws);
    fi;
end );

InstallOtherMethod( KnuthBendixRewritingSystem, 
    "generic method for an fp-group", true, 
    [ IsFpGroup, IsString, IsHomogeneousList, IsString ], 0,
function( G, order, gensord, alph )

    local  fG, rels, genG, genfG, numgenG, numgenfG, i, 
           mhom, M, genM, numgenM, range, fM, ord, rws;

    if HasInitialRewritingSystem( G ) then
        return InitialRewritingSystem( G );
    fi;
    fG := FreeGroupOfFpGroup( G );
    rels := RelatorsOfFpGroup( G );
    genG := GeneratorsOfGroup( G );
    genfG := GeneratorsOfGroup( fG );
    numgenG := Length( genG );
    numgenfG := Length( genfG );
    if ( numgenG <> numgenfG ) then
        Error( "unequal numbers of generators" );
    fi;
    mhom := IsomorphismFpMonoid( G );
    M := Image( mhom );
    SetConstructedFromFpGroup( M, G );
    genM := GeneratorsOfMonoid( M );
    numgenM := Length( genM );
    Info( InfoKan, 3, "using gens order = ", gensord );
    fM := FreeMonoidOfFpMonoid( M );
    if ( order = "shortlex" ) then
        ord := ShortLexOrdering( fM, gensord );
    elif ( order = "wreath" ) then
        ord := BasicWreathProductOrdering( fM, gensord );
    else
        Error( "the given order should be \"shortlex\" or \"wreath\"" );
    fi;
    ## Print("~~~~ in KBRws with M, ord = ", M, ord, IsOrdering(ord), "\n" );
    rws := KnuthBendixRewritingSystem( M, ord );
    rws!.alphabet := alph;
    rws!.gensperm := PermList( gensord );
    SetInitialRewritingSystem( G, rws );
    return rws;
end );

#############################################################################
##
#M  ReducedConfluentRewritingSystem
##
InstallOtherMethod( ReducedConfluentRewritingSystem,
    "for an fp monoid and an ordering and a limited number of rules", true,
    [ IsFpMonoid, IsOrdering, IsInt ], 0,
function( M, ordering, limit )
    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)
    MakeConfluent( kbrws, limit );
    # 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 );

InstallOtherMethod( ReducedConfluentRewritingSystem,
    "generic method for a group using default ordering",  true, 
    [ IsGroup, IsInt ], 0,
function( G, z )

    local genG, lenG, L, w, alph;
    if HasReducedConfluentRewritingSystem( G ) then 
        return ReducedConfluentRewritingSystem( G ); 
    fi;
    genG := GeneratorsOfGroup( G );
    lenG := Length( genG );
    if ( lenG > 14 ) then 
        Error( "alphabet is larger than is allowed for" );
    fi;
    L := Flat( List( [1..lenG], i -> [i+i,i+i-1] ) );
    w := "aAbBcCdDeEfFgGhHiIjJkKlLmMnN"; 
    alph := w{[1..2*lenG]}; 
    return ReducedConfluentRewritingSystem( G, L, "shortlex", 0, alph );
end );

InstallOtherMethod( ReducedConfluentRewritingSystem,
    "generic method for a group and an ordering",  true, 
    [ IsGroup, IsList, IsString ], 0,
function( G, gensorder, order )
    return ReducedConfluentRewritingSystem( G, gensorder, order, 0, "" );
end );

InstallOtherMethod( ReducedConfluentRewritingSystem,
    "generic method for a group and an ordering",  true, 
    [ IsGroup, IsList, IsString, IsInt ], 0,
function( G, gensorder, order, limit )
    return ReducedConfluentRewritingSystem( G, gensorder, order, limit, "" );
end );

InstallOtherMethod( ReducedConfluentRewritingSystem,
    "generic method for a group, an ordering, a limit and an alphabet", true, 
    [ IsGroup, IsList, IsString, IsInt, IsString ], 0,
function( G, gensorder, order, limit, alph )

    local  fG, rels, genG, genfG, numgenG, numgenfG, i, 
           mhom, M, genM, numgenM, range, fM, ord, rws;

    if ( limit < 0 ) then
        Error( "limit must be non-negative" );
    fi;
    fG := FreeGroupOfFpGroup( G );
    rels := RelatorsOfFpGroup( G );
    genG := GeneratorsOfGroup( G );
    genfG := GeneratorsOfGroup( fG );
    numgenG := Length( genG );
    numgenfG := Length( genfG );
    if ( numgenG <> numgenfG ) then
        Error( "unequal numbers of generators" );
    fi;
    mhom := IsomorphismFpMonoid( G );
    M := Image( mhom );
    SetConstructedFromFpGroup( M, G );
    genM := GeneratorsOfMonoid( M );
    numgenM := Length( genM );
    if ( numgenM = Length( gensorder ) ) then
        range := gensorder;
    else
        range := 0 * [1..numgenM];
        for i in [1..numgenG] do
            range[i] := 2*i;
            range[i+numgenG] := 2*i-1;
        od;
    fi;
    ## range := Reversed( range );
    Info( InfoKan, 3, "using range = ", range );
    fM := FreeMonoidOfFpMonoid( M );
    if ( order = "shortlex" ) then
        ord := ShortLexOrdering( fM, range );
    elif ( order = "wreath" ) then
        ord := BasicWreathProductOrdering( fM, range );
    else
        Error( "the given order should be \"shortlex\" or \"wreath\"" );
    fi;
    rws := ReducedConfluentRewritingSystem( M, ord, limit );
    rws!.gensperm := PermList( gensorder );
    if ( alph <> "" ) then
        rws!.alphabet := alph;
    fi;
    SetReducedConfluentRewritingSystem( G, rws );
    return rws;
end );

InstallOtherMethod( ReducedForm, "generic method for an fp-group with rws", 
    true, [ IsFpGroup, IsElementOfFpGroup ], 0, 
function( G, g )  
    local  rws, hom, fam, mg, r, rmg, rg; 

    if not HasReducedConfluentRewritingSystem( G ) then 
       TryNextMethod(); 
    fi;
    rws := ReducedConfluentRewritingSystem( G ); 
    hom := IsomorphismFpMonoid( G ); 
    fam := FamilyObj( One( Image(hom) ) ); 
    mg := Image( hom, g ); 
    r := ReducedForm( rws, UnderlyingElement(mg) );
    rmg := ElementOfFpMonoid( fam, r ); 
    rg := PreImagesRepresentativeNC( hom, rmg ); 
    return rg; 
end ); 

############################################################################
## 
#E  kbrws.gi  . . .  . . . . . . . . . . . . . . . . . . . . . . . ends here 
## 

[ Dauer der Verarbeitung: 0.37 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