'Return True if expr is bounded, False if not and None if unknown.
Truth Table:
|       |  B  |     U     |     ?     |
|       |     |\'+\'|\'-\'|\'x\'|\'+\'|\'-\'|\'x\'|
|   B   |  B  |     U     |     ?     |
|   |\'+\'|     | U | ? | ? | U | ? | ? |
| U |\'-\'|     | ? | U | ? | ? | U | ? |
|   |\'x\'|     |     ?     |     ?     |
* \'B\' = Bounded
* \'U\' = Unbounded
* \'?\' = unknown boundedness
* \'+\' = positive sign
* \'-\' = negative sign
* \'x\' = sign unknown
* All Bounded -> True
* 1 Unbounded and the rest Bounded -> False
* >1 Unbounded, all with same known sign -> False
* Any Unknown and unknown sign -> None
* Else -> None
When the signs are not the same you can have an undefined
result as in oo - oo, hence \'bounded\' is also undefined.'

@staticmethod
def Add(expr, assumptions):

    sign = (-1)
    result = True
    for arg in expr.args:
        _bounded = ask(Q.finite(arg), assumptions)
        if _bounded:
            continue
        s = ask(Q.positive(arg), assumptions)
        if (((sign != (-1)) and (s != sign)) or ((s is None) and ((s == _bounded) or (s == sign)))):
            return None
        else:
            sign = s
        if (result is not False):
            result = _bounded
    return result
