gap icon indicating copy to clipboard operation
gap copied to clipboard

`DeclareOperation` and `DeclareProperty` do not commute, should they?

Open fingolfin opened this issue 3 years ago • 2 comments

Observe:

gap> DeclareProperty("IsFoo", IsMatrixGroup); IsFoo;
<Property "IsFoo">
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Property "IsFoo">

works fine, but this gives an error:

gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Operation "IsFoo">
gap> DeclareProperty("IsFoo", IsMatrixGroup);
Error, operation `IsFoo' was not created as a property, use `DeclareOperation'

As a consequence, the numericalsgps package does

DeclareOperation("IsIrreducible",[IsIrreducibleNumericalSemigroup]);

because the irredsol package (which usually is loaded first) does

DeclareOperation("IsIrreducible", [IsMatrixGroup, IsField]);

Now one could modify irredsol to workaround this by inserting a DeclareProperty("IsIrreducible", SOME_FILTER_DUNNO);, but this is somewhat unsatisfactory.

Also note that DeclareOperation does "commute" with DeclareAttribute: this

gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Operation "IsFoo">
gap> DeclareAttribute("IsFoo", IsMatrixGroup); IsFoo;
<Attribute "IsFoo">

gives the "same" result as this:

gap> DeclareAttribute("IsFoo", IsMatrixGroup); IsFoo;
<Attribute "IsFoo">
gap> DeclareOperation("IsFoo", [IsMatrixGroup, IsField]); IsFoo;
<Attribute "IsFoo">

fingolfin avatar Mar 08 '22 13:03 fingolfin

For attributes, there is ConvertToAttribute which takes care of the "upgrade" of an operation to an attribute. It is backed by the kernel functions OPER_TO_ATTRIBUTE resp. OPER_TO_MUTABLE_ATTRIBUTE, which call into the C functions ConvertOperationIntoAttribute. Perhaps a similar function could be added for properties.

fingolfin avatar Mar 08 '22 13:03 fingolfin

Note that in the above examples, it is important that the operation has a number of arguments different from 1. Otherwise, there are more errors, e.g.:

#
gap> DeclareProperty("IsF1", IsMatrixGroup);
gap> DeclareOperation("IsF1", [IsMatrixGroup, IsField]);

#
gap> DeclareOperation("IsF2", [IsMatrixGroup, IsField]);
gap> DeclareProperty("IsF2", IsMatrixGroup);
Error, operation `IsF2' was not created as a property, use `DeclareOperation'

#
gap> DeclareAttribute("IsF3", IsMatrixGroup);
gap> DeclareOperation("IsF3", [IsMatrixGroup, IsField]);

#
gap> DeclareOperation("IsF4", [IsMatrixGroup, IsField]);
gap> DeclareAttribute("IsF4", IsMatrixGroup);

#
gap> DeclareProperty("IsF5", IsMatrixGroup);
gap> DeclareOperation("IsF5", [IsRationalFunction]);
Error, operation `IsF5' was created as a property, use `DeclareProperty'

#
gap> DeclareOperation("IsF6", [IsRationalFunction]);
gap> DeclareProperty("IsF6", IsMatrixGroup);
Error, operation `IsF6' was not created as a property, use `DeclareOperation'

#
gap> DeclareAttribute("IsF7", IsMatrixGroup);
gap> DeclareOperation("IsF7", [IsRationalFunction]);
Error, operation `IsF7' was created as an attribute, use `DeclareAttribute'

#
gap> DeclareOperation("IsF8", [IsRationalFunction]);
gap> DeclareAttribute("IsF8", IsMatrixGroup);
Error, operation `IsF8' has been declared as a one argument Operation and cannot also be an Attribute

fingolfin avatar Jan 10 '23 12:01 fingolfin