Keep the gradient flowing

Query module - finally in trunk

The query module is finally in the main SymPy repository. I made substantial changes since last post, most of them at the user interface level (thanks to Vinzent and Mateusz for many insightful comments). Main function is ask(), which replaces the old expression.is_* syntax. You can ask many things. For example, you can ask if a given expression is integer, prime or real: [cc lang="python"] >>> ask(2, Q.integer) True >>> ask(x**2, Q.integer) None >>> ask(x**2, Q.integer, Assume(x, Q.integer)) True >>> ask(sqrt(2)*x, Q.integer, Assume(x, Q.integer)) >>> ask(I*x, Q.real, Assume(x, Q.imaginary)) True >>> ask(x*y, Q.prime, Assume(x, Q.prime) & Assume(y, Q.prime)) False [/cc] as you see, it returns True when it is sure that the expression is an integer, None if it does not know, and False if it is certainly not an integer. The second argument, which we will call 'key' specifies what we want to ask about. For example, Q.integer ask wether expression is an integer, Q.negative wether it's a negative, etc. For a complete list of all the keys available, see doc/src/modules/queries.txt in sympy codebase. It also accepts an optional third argument where you can specify assumptions that symbols in expr satisfy. That can be any kind of boolean expression involving assumptions, for example: Assume(x, Q.positive) & Assume(x, Q.integer) or Assume(x, Q.positive) | Assume(x, Q.negative), or even NAnd(Assume(x, Q.positive), Assume(x, Q.integer)