'Return True if expr is bounded, False if not and None if unknown.
Truth Table:
|   | B | U |   ?    |
|   |   |   | s | /s |
| B | B | U |   ?    |
| U |   | U | U | ?  |
* B = Bounded
* U = Unbounded
* ? = unknown boundedness
* s = signed (hence nonzero)
* /s = not signed'

@staticmethod
def Mul(expr, assumptions):

    result = True
    for arg in expr.args:
        _bounded = ask(Q.finite(arg), assumptions)
        if _bounded:
            continue
        elif (_bounded is None):
            if (result is None):
                return None
            if (ask(Q.nonzero(arg), assumptions) is None):
                return None
            if (result is not False):
                result = None
        else:
            result = False
    return result
