(expr, assumptions)
Integer*Integer      -> Integer
        Integer*Irrational   -> !Integer
        Odd/Even             -> !Integer
        Integer*Rational     -> ?
Integer*Integer      -> Integer
        Integer*Irrational   -> !Integer
        Odd/Even             -> !Integer
        Integer*Rational     -> ?
Integer * Integer - > Integer Integer * Irrational - > !Integer Odd / Even - > !Integer Integer * Rational - > ?
def Mul(expr, assumptions):
        """
        Integer*Integer      -> Integer
        Integer*Irrational   -> !Integer
        Odd/Even             -> !Integer
        Integer*Rational     -> ?
        """
        if expr.is_number:
            return AskIntegerHandler._number(expr, assumptions)
        _output = True
        for arg in expr.args:
            if not ask(Q.integer(arg), assumptions):
                if arg.is_Rational:
                    if arg.q == 2:
                        return ask(Q.even(2*expr), assumptions)
                    if ~(arg.q & 1):
                        return None
                elif ask(Q.irrational(arg), assumptions):
                    if _output:
                        _output = False
                    else:
                        return
                else:
                    return
        else:
            return _output
def Mul ( expr , assumptions ) : if expr . is_number : return AskIntegerHandler . _number ( expr , assumptions ) _output = True for arg in expr . args : if not ask ( Q . integer ( arg ) , assumptions ) : if arg . is_Rational : if arg . q == 2 : return ask ( Q . even ( 2 * expr ) , assumptions ) if ~ ( arg . q & 1 ) : return None elif ask ( Q . irrational ( arg ) , assumptions ) : if _output : _output = False else : return else : return else : return _output