I have been trying to figure out a convenient way to convert a group
presentation into a monoid presentation in GAP (so that inverses can
be regarded as separate generators). The session below demonstrates that
wouldn't it be possible to simply double the number of generators? For
example, one could call the generators "a", "b", ... and "ai", "bi", ...
for the inverses. Or did I missunderstand your question?
gap> f := FreeGroup( "a", "ai" ); Group( a, ai ) gap> f := f / [ f.1^3, f.1*f.2 ]; Group( a, ai ) gap> Size(f); 3
However, GAP will treat f as group and some functions might use inverses
of the generators. So maybe this is not exactly what you need. What
kind of GAP library functions do you have in mind that you want to apply
to this "monoid"?
GAP will always reduce abstract words, so that a*a^-1 (for an abstract
generator a) will be the identity. At the moment, there is no way short
of defining two abstract generators to persuade GAP not to reduce a*a^-1.
2) The fp-group functions clearly don't like having the empty word as
a relator. One might reasonably call that a bug.