Compare:
(1) -> K := kernels([x,exp(x), log(x)])
x
(1) [x, %e , log(x)]
Type: List(Kernel(Expression(Integer)))
(2) -> validExponential(K, 2*log(x), x)
2
(2) x
Type: Union(Expression(Integer),...)
validExponential assumes that f is in field generated by K, otherwise
it does not work. This assumption is required by Risch structure
theorem. 'validExponential' is a convenience function for
integrator. Logarithm needs somewhat different handling during
integration so there are no similar routine. In fact, internally
FriCAS uses a routine which is very similar to 'validExponential'
but is not exposed to users. Main routine for general use is
'rischNormalize': in general you need to call it before calling
'validExponential', otherwise results may be invalid. Namely
Risch structure theorem requires a field and data structure that
FriCAS uses is guarented to be a field only _after_ running
'rischNormalize'.
--
Waldek Hebisch