I've been thinking more about how featurep( ., real) should work:
The function rectform contains the logic that featurep( . , real) needs.
Duplication is bad. Thus I'm leaning towards making
featurep(e, real) := freeof(%i, rectform(e)).
As rectform improves, so will featurep(., real). That's a good thing. I
see
no compelling reason for featurep(., real) to partially duplicate the
knowledge
contained in rectform.
(2) Rectform should obey the value of domain. Thus making featurep also
obey
the value of domain.
(3) For a function that maps the reals to the reals and the complex
numbers to the
complex numbers, we should have something like
declare(F, real_domain, reals)
declare(F, real_codomain, reals)
declare(F, complex_domain, complex)
declare(F, complex_codomain, complex)
And ...
declare(log10, real_domain, (0,inf))
declare(G, real_codomain, reals)
And rectform should heed these declarations.
(4) Maxima should signal domain errors ASAP. If I start to fill my car
up with diesel fuel, I want a error message before the first drop. I don't
an engine light to come on in Ogallala, Nebraska (seconds before the
fire). So yes, signum(%i) should signal an error. As for cos(a # b),
well
GIGO, I suppose.
Barton