We have to have a definition of `foo.is_number`: currently it just means `not foo.free_symbols` and it is supposed to be a cheap answer. It can't prove that expressions do not simplify to 0 in all cases (though it could in some cases by applying expensive routines like simplify, `is_constant` or doit). That is beyond the scope of `is_number`. For this reason I feel that the current behavior is fine and that the `Integral.is_number` routine should be modified as I have indicated.