.. _assumptions_module:

===========
Assumptions
===========

.. automodule:: sympy.assumptions


Predicate
=========

.. autoclass:: sympy.assumptions.assume::Predicate
   :members:
   :noindex:

.. autoclass:: sympy.assumptions.assume::AppliedPredicate
   :members:
   :noindex:


Querying
========

Queries are used to ask information about expressions. Main method for this
is ``ask()``:

.. autofunction:: sympy.assumptions.ask::ask
   :noindex:

``ask``'s optional second argument should be a boolean expression involving
assumptions about objects in *expr*. Valid values include:

    * ``Q.integer(x)``
    * ``Q.positive(x)``
    * ``Q.integer(x) & Q.positive(x)``
    * etc.

``Q`` is an object holding known predicates.

See documentation for the logic module for a complete list of valid boolean
expressions.

You can also define a context so you don't have to pass that argument
each time to function ``ask()``. This is done by using the assuming context manager
from module sympy.assumptions. ::

     >>> from sympy import *
     >>> x = Symbol('x')
     >>> y = Symbol('y')
     >>> facts = Q.positive(x), Q.positive(y)
     >>> with assuming(*facts):
     ...     print(ask(Q.positive(2*x + y)))
     True


Contents
========

.. toctree::
    :maxdepth: 3

    ask.rst
    assume.rst
    refine.rst
    predicates.rst


Performance improvements
========================

On queries that involve symbolic coefficients, logical inference is used. Work on
improving satisfiable function (sympy.logic.inference.satisfiable) should result
in notable speed improvements.

Logic inference used in one ask could be used to speed up further queries, and
current system does not take advantage of this. For example, a truth maintenance
system (https://en.wikipedia.org/wiki/Truth_maintenance_system) could be implemented.

Misc
====

You can find more examples in the in the form of test under directory
sympy/assumptions/tests/
