'Unbounded ** NonZero -> Unbounded
Bounded ** Bounded -> Bounded
Abs()<=1 ** Positive -> Bounded
Abs()>=1 ** Negative -> Bounded
Otherwise unknown'

@staticmethod
def Pow(expr, assumptions):

    base_bounded = ask(Q.finite(expr.base), assumptions)
    exp_bounded = ask(Q.finite(expr.exp), assumptions)
    if ((base_bounded is None) and (exp_bounded is None)):
        return None
    if ((base_bounded is False) and ask(Q.nonzero(expr.exp), assumptions)):
        return False
    if (base_bounded and exp_bounded):
        return True
    if (((abs(expr.base) <= 1) == True) and ask(Q.positive(expr.exp), assumptions)):
        return True
    if (((abs(expr.base) >= 1) == True) and ask(Q.negative(expr.exp), assumptions)):
        return True
    if (((abs(expr.base) >= 1) == True) and (exp_bounded is False)):
        return False
    return None
