Module for querying SymPy objects about assumptions.
This class contains all the supported keys by ask.
Algebraic number predicate.
Q.algebraic(x) is true iff x belongs to the set of algebraic numbers. x is algebraic if there is some polynomial in p(x)\in \mathbb\{Q\}[x] such that p(x) = 0.
References
[R1] | http://en.wikipedia.org/wiki/Algebraic_number |
Examples
>>> from sympy import ask, Q, sqrt, I, pi
>>> ask(Q.algebraic(sqrt(2)))
True
>>> ask(Q.algebraic(I))
True
>>> ask(Q.algebraic(pi))
False
Antihermitian predicate.
Q.antihermitian(x) is true iff x belongs to the field of antihermitian operators, i.e., operators in the form x*I, where x is Hermitian.
References
[R2] | http://mathworld.wolfram.com/HermitianOperator.html |
Commutative predicate.
ask(Q.commutative(x)) is true iff x commutes with any other object with respect to multiplication operation.
Complex number predicate.
Q.complex(x) is true iff x belongs to the set of complex numbers. Note that every complex number is finite.
References
[R3] | https://en.wikipedia.org/wiki/Complex_number |
Examples
>>> from sympy import Q, Symbol, ask, I, oo
>>> x = Symbol('x')
>>> ask(Q.complex(0))
True
>>> ask(Q.complex(2 + 3*I))
True
>>> ask(Q.complex(oo))
False
Complex elements matrix predicate.
Q.complex_elements(x) is true iff all the elements of x are complex numbers.
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.complex(X[1, 2]), Q.complex_elements(X))
True
>>> ask(Q.complex_elements(X), Q.integer_elements(X))
True
Composite number predicate.
ask(Q.composite(x)) is true iff x is a positive integer and has at least one positive divisor other than 1 and the number itself.
Examples
>>> from sympy import Q, ask
>>> ask(Q.composite(0))
False
>>> ask(Q.composite(1))
False
>>> ask(Q.composite(2))
False
>>> ask(Q.composite(20))
True
Diagonal matrix predicate.
Q.diagonal(x) is true iff x is a diagonal matrix. A diagonal matrix is a matrix in which the entries outside the main diagonal are all zero.
References
[R4] | https://en.wikipedia.org/wiki/Diagonal_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol, ZeroMatrix
>>> X = MatrixSymbol('X', 2, 2)
>>> ask(Q.diagonal(ZeroMatrix(3, 3)))
True
>>> ask(Q.diagonal(X), Q.lower_triangular(X) &
... Q.upper_triangular(X))
True
Even number predicate.
ask(Q.even(x)) is true iff x belongs to the set of even integers.
Examples
>>> from sympy import Q, ask, pi
>>> ask(Q.even(0))
True
>>> ask(Q.even(2))
True
>>> ask(Q.even(3))
False
>>> ask(Q.even(pi))
False
Extended real predicate.
Q.extended_real(x) is true iff x is a real number or \(\{-\infty, \infty\}\).
See documentation of Q.real for more information about related facts.
Examples
>>> from sympy import ask, Q, oo, I
>>> ask(Q.extended_real(1))
True
>>> ask(Q.extended_real(I))
False
>>> ask(Q.extended_real(oo))
True
Finite predicate.
Q.finite(x) is true if x is neither an infinity nor a NaN. In other words, ask(Q.finite(x)) is true for all x having a bounded absolute value.
References
[R5] | https://en.wikipedia.org/wiki/Finite |
Examples
>>> from sympy import Q, ask, Symbol, S, oo, I
>>> x = Symbol('x')
>>> ask(Q.finite(S.NaN))
False
>>> ask(Q.finite(oo))
False
>>> ask(Q.finite(1))
True
>>> ask(Q.finite(2 + 3*I))
True
Fullrank matrix predicate.
Q.fullrank(x) is true iff x is a full rank matrix. A matrix is full rank if all rows and columns of the matrix are linearly independent. A square matrix is full rank iff its determinant is nonzero.
Examples
>>> from sympy import Q, ask, MatrixSymbol, ZeroMatrix, Identity
>>> X = MatrixSymbol('X', 2, 2)
>>> ask(Q.fullrank(X.T), Q.fullrank(X))
True
>>> ask(Q.fullrank(ZeroMatrix(3, 3)))
False
>>> ask(Q.fullrank(Identity(3)))
True
Hermitian predicate.
ask(Q.hermitian(x)) is true iff x belongs to the set of Hermitian operators.
References
[R6] | http://mathworld.wolfram.com/HermitianOperator.html |
Imaginary number predicate.
Q.imaginary(x) is true iff x can be written as a real number multiplied by the imaginary unit I. Please note that 0 is not considered to be an imaginary number.
References
[R7] | https://en.wikipedia.org/wiki/Imaginary_number |
Examples
>>> from sympy import Q, ask, I
>>> ask(Q.imaginary(3*I))
True
>>> ask(Q.imaginary(2 + 3*I))
False
>>> ask(Q.imaginary(0))
False
Infinite number predicate.
Q.infinite(x) is true iff the absolute value of x is infinity.
Integer predicate.
Q.integer(x) is true iff x belongs to the set of integer numbers.
References
[R8] | https://en.wikipedia.org/wiki/Integer |
Examples
>>> from sympy import Q, ask, S
>>> ask(Q.integer(5))
True
>>> ask(Q.integer(S(1)/2))
False
Integer elements matrix predicate.
Q.integer_elements(x) is true iff all the elements of x are integers.
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.integer(X[1, 2]), Q.integer_elements(X))
True
Invertible matrix predicate.
Q.invertible(x) is true iff x is an invertible matrix. A square matrix is called invertible only if its determinant is 0.
References
[R9] | https://en.wikipedia.org/wiki/Invertible_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('Y', 2, 3)
>>> Z = MatrixSymbol('Z', 2, 2)
>>> ask(Q.invertible(X*Y), Q.invertible(X))
False
>>> ask(Q.invertible(X*Z), Q.invertible(X) & Q.invertible(Z))
True
>>> ask(Q.invertible(X), Q.fullrank(X) & Q.square(X))
True
Irrational number predicate.
Q.irrational(x) is true iff x is any real number that cannot be expressed as a ratio of integers.
References
[R10] | https://en.wikipedia.org/wiki/Irrational_number |
Examples
>>> from sympy import ask, Q, pi, S, I
>>> ask(Q.irrational(0))
False
>>> ask(Q.irrational(S(1)/2))
False
>>> ask(Q.irrational(pi))
True
>>> ask(Q.irrational(I))
False
Generic predicate.
ask(Q.is_true(x)) is true iff x is true. This only makes sense if x is a predicate.
Examples
>>> from sympy import ask, Q, symbols
>>> x = symbols('x')
>>> ask(Q.is_true(True))
True
Lower triangular matrix predicate.
A matrix M is called lower triangular matrix if \(a_{ij}=0\) for \(i>j\).
References
[R11] | http://mathworld.wolfram.com/LowerTriangularMatrix.html |
Examples
>>> from sympy import Q, ask, ZeroMatrix, Identity
>>> ask(Q.lower_triangular(Identity(3)))
True
>>> ask(Q.lower_triangular(ZeroMatrix(3, 3)))
True
Negative number predicate.
Q.negative(x) is true iff x is a real number and \(x < 0\), that is, it is in the interval \((-\infty, 0)\). Note in particular that negative infinity is not negative.
A few important facts about negative numbers:
Examples
>>> from sympy import Q, ask, symbols, I
>>> x = symbols('x')
>>> ask(Q.negative(x), Q.real(x) & ~Q.positive(x) & ~Q.zero(x))
True
>>> ask(Q.negative(-1))
True
>>> ask(Q.nonnegative(I))
False
>>> ask(~Q.negative(I))
True
Nonnegative real number predicate.
ask(Q.nonnegative(x)) is true iff x belongs to the set of positive numbers including zero.
Examples
>>> from sympy import Q, ask, I
>>> ask(Q.nonnegative(1))
True
>>> ask(Q.nonnegative(0))
True
>>> ask(Q.nonnegative(-1))
False
>>> ask(Q.nonnegative(I))
False
>>> ask(Q.nonnegative(-I))
False
Nonpositive real number predicate.
ask(Q.nonpositive(x)) is true iff x belongs to the set of negative numbers including zero.
Examples
>>> from sympy import Q, ask, I
>>> ask(Q.nonpositive(-1))
True
>>> ask(Q.nonpositive(0))
True
>>> ask(Q.nonpositive(1))
False
>>> ask(Q.nonpositive(I))
False
>>> ask(Q.nonpositive(-I))
False
Nonzero real number predicate.
ask(Q.nonzero(x)) is true iff x is real and x is not zero. Note in particular that Q.nonzero(x) is false if x is not real. Use ~Q.zero(x) if you want the negation of being zero without any real assumptions.
A few important facts about nonzero numbers:
Examples
>>> from sympy import Q, ask, symbols, I, oo
>>> x = symbols('x')
>>> print(ask(Q.nonzero(x), ~Q.zero(x)))
None
>>> ask(Q.nonzero(x), Q.positive(x))
True
>>> ask(Q.nonzero(x), Q.zero(x))
False
>>> ask(Q.nonzero(0))
False
>>> ask(Q.nonzero(I))
False
>>> ask(~Q.zero(I))
True
>>> ask(Q.nonzero(oo))
False
Normal matrix predicate.
A matrix is normal if it commutes with its conjugate transpose.
References
[R12] | https://en.wikipedia.org/wiki/Normal_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.normal(X), Q.unitary(X))
True
Odd number predicate.
ask(Q.odd(x)) is true iff x belongs to the set of odd numbers.
Examples
>>> from sympy import Q, ask, pi
>>> ask(Q.odd(0))
False
>>> ask(Q.odd(2))
False
>>> ask(Q.odd(3))
True
>>> ask(Q.odd(pi))
False
Orthogonal matrix predicate.
Q.orthogonal(x) is true iff x is an orthogonal matrix. A square matrix M is an orthogonal matrix if it satisfies M^TM = MM^T = I where M^T is the transpose matrix of M and I is an identity matrix. Note that an orthogonal matrix is necessarily invertible.
References
[R13] | https://en.wikipedia.org/wiki/Orthogonal_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol, Identity
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('Y', 2, 3)
>>> Z = MatrixSymbol('Z', 2, 2)
>>> ask(Q.orthogonal(Y))
False
>>> ask(Q.orthogonal(X*Z*X), Q.orthogonal(X) & Q.orthogonal(Z))
True
>>> ask(Q.orthogonal(Identity(3)))
True
>>> ask(Q.invertible(X), Q.orthogonal(X))
True
Positive real number predicate.
Q.positive(x) is true iff x is real and \(x > 0\), that is if x is in the interval \((0, \infty)\). In particular, infinity is not positive.
A few important facts about positive numbers:
Examples
>>> from sympy import Q, ask, symbols, I
>>> x = symbols('x')
>>> ask(Q.positive(x), Q.real(x) & ~Q.negative(x) & ~Q.zero(x))
True
>>> ask(Q.positive(1))
True
>>> ask(Q.nonpositive(I))
False
>>> ask(~Q.positive(I))
True
Positive definite matrix predicate.
If M is a :math:n \times n symmetric real matrix, it is said to be positive definite if \(Z^TMZ\) is positive for every non-zero column vector Z of n real numbers.
References
[R14] | https://en.wikipedia.org/wiki/Positive-definite_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol, Identity
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('Y', 2, 3)
>>> Z = MatrixSymbol('Z', 2, 2)
>>> ask(Q.positive_definite(Y))
False
>>> ask(Q.positive_definite(Identity(3)))
True
>>> ask(Q.positive_definite(X + Z), Q.positive_definite(X) &
... Q.positive_definite(Z))
True
Prime number predicate.
ask(Q.prime(x)) is true iff x is a natural number greater than 1 that has no positive divisors other than 1 and the number itself.
Examples
>>> from sympy import Q, ask
>>> ask(Q.prime(0))
False
>>> ask(Q.prime(1))
False
>>> ask(Q.prime(2))
True
>>> ask(Q.prime(20))
False
>>> ask(Q.prime(-3))
False
Rational number predicate.
Q.rational(x) is true iff x belongs to the set of rational numbers.
References
https://en.wikipedia.org/wiki/Rational_number
Examples
>>> from sympy import ask, Q, pi, S
>>> ask(Q.rational(0))
True
>>> ask(Q.rational(S(1)/2))
True
>>> ask(Q.rational(pi))
False
Real number predicate.
Q.real(x) is true iff x is a real number, i.e., it is in the interval \((-\infty, \infty)\). Note that, in particular the infinities are not real. Use Q.extended_real if you want to consider those as well.
A few important facts about reals:
References
[R15] | https://en.wikipedia.org/wiki/Real_number |
Examples
>>> from sympy import Q, ask, symbols
>>> x = symbols('x')
>>> ask(Q.real(x), Q.positive(x))
True
>>> ask(Q.real(0))
True
Real elements matrix predicate.
Q.real_elements(x) is true iff all the elements of x are real numbers.
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.real(X[1, 2]), Q.real_elements(X))
True
Singular matrix predicate.
A matrix is singular iff the value of its determinant is 0.
References
[R16] | http://mathworld.wolfram.com/SingularMatrix.html |
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.singular(X), Q.invertible(X))
False
>>> ask(Q.singular(X), ~Q.invertible(X))
True
Square matrix predicate.
Q.square(x) is true iff x is a square matrix. A square matrix is a matrix with the same number of rows and columns.
References
[R17] | https://en.wikipedia.org/wiki/Square_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol, ZeroMatrix, Identity
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('X', 2, 3)
>>> ask(Q.square(X))
True
>>> ask(Q.square(Y))
False
>>> ask(Q.square(ZeroMatrix(3, 3)))
True
>>> ask(Q.square(Identity(3)))
True
Symmetric matrix predicate.
Q.symmetric(x) is true iff x is a square matrix and is equal to its transpose. Every square diagonal matrix is a symmetric matrix.
References
[R18] | https://en.wikipedia.org/wiki/Symmetric_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('Y', 2, 3)
>>> Z = MatrixSymbol('Z', 2, 2)
>>> ask(Q.symmetric(X*Z), Q.symmetric(X) & Q.symmetric(Z))
True
>>> ask(Q.symmetric(X + Z), Q.symmetric(X) & Q.symmetric(Z))
True
>>> ask(Q.symmetric(Y))
False
Transcedental number predicate.
Q.transcendental(x) is true iff x belongs to the set of transcendental numbers. A transcendental number is a real or complex number that is not algebraic.
Triangular matrix predicate.
Q.triangular(X) is true if X is one that is either lower triangular or upper triangular.
References
[R19] | https://en.wikipedia.org/wiki/Triangular_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.triangular(X), Q.upper_triangular(X))
True
>>> ask(Q.triangular(X), Q.lower_triangular(X))
True
Unit triangular matrix predicate.
A unit triangular matrix is a triangular matrix with 1s on the diagonal.
Examples
>>> from sympy import Q, ask, MatrixSymbol
>>> X = MatrixSymbol('X', 4, 4)
>>> ask(Q.triangular(X), Q.unit_triangular(X))
True
Unitary matrix predicate.
Q.unitary(x) is true iff x is a unitary matrix. Unitary matrix is an analogue to orthogonal matrix. A square matrix M with complex elements is unitary if :math:M^TM = MM^T= I where :math:M^T is the conjugate transpose matrix of M.
References
[R20] | https://en.wikipedia.org/wiki/Unitary_matrix |
Examples
>>> from sympy import Q, ask, MatrixSymbol, Identity
>>> X = MatrixSymbol('X', 2, 2)
>>> Y = MatrixSymbol('Y', 2, 3)
>>> Z = MatrixSymbol('Z', 2, 2)
>>> ask(Q.unitary(Y))
False
>>> ask(Q.unitary(X*Z*X), Q.unitary(X) & Q.unitary(Z))
True
>>> ask(Q.unitary(Identity(3)))
True
Upper triangular matrix predicate.
A matrix M is called upper triangular matrix if \(M_{ij}=0\) for \(i<j\).
References
[R21] | http://mathworld.wolfram.com/UpperTriangularMatrix.html |
Examples
>>> from sympy import Q, ask, ZeroMatrix, Identity
>>> ask(Q.upper_triangular(Identity(3)))
True
>>> ask(Q.upper_triangular(ZeroMatrix(3, 3)))
True
Zero number predicate.
ask(Q.zero(x)) is true iff the value of x is zero.
Examples
>>> from sympy import ask, Q, oo, symbols
>>> x, y = symbols('x, y')
>>> ask(Q.zero(0))
True
>>> ask(Q.zero(1/oo))
True
>>> ask(Q.zero(0*oo))
False
>>> ask(Q.zero(1))
False
>>> ask(Q.zero(x*y), Q.zero(x) | Q.zero(y))
True
Method for inferring properties about objects.
Syntax
ask(proposition)
ask(proposition, assumptions)
where proposition is any boolean expression
Examples
>>> from sympy import ask, Q, pi
>>> from sympy.abc import x, y
>>> ask(Q.rational(pi))
False
>>> ask(Q.even(x*y), Q.even(x) & Q.integer(y))
True
>>> ask(Q.prime(x*y), Q.integer(x) & Q.integer(y))
False
Relations in assumptions are not implemented (yet), so the following will not give a meaningful result.
>>> ask(Q.positive(x), Q.is_true(x > 0))
It is however a work in progress.
Method for inferring properties about objects.
Compute the various forms of knowledge compilation used by the assumptions system.
This function is typically applied to the results of the get_known_facts and get_known_facts_keys functions defined at the bottom of this file.
Register a handler in the ask system. key must be a string and handler a class inheriting from AskHandler:
>>> from sympy.assumptions import register_handler, ask, Q
>>> from sympy.assumptions.handlers import AskHandler
>>> class MersenneHandler(AskHandler):
... # Mersenne numbers are in the form 2**n + 1, n integer
... @staticmethod
... def Integer(expr, assumptions):
... from sympy import log
... return ask(Q.integer(log(expr + 1, 2)))
>>> register_handler('mersenne', MersenneHandler)
>>> ask(Q.mersenne(7))
True