Ask¶
Module for querying SymPy objects about assumptions.
-
class
sympy.assumptions.ask.
AssumptionKeys
[source]¶ This class contains all the supported keys by
ask
.-
algebraic
¶ Algebraic number predicate.
Q.algebraic(x)
is true iffx
belongs to the set of algebraic numbers.x
is algebraic if there is some polynomial inp(x)\in \mathbb\{Q\}[x]
such thatp(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
¶ Antihermitian predicate.
Q.antihermitian(x)
is true iffx
belongs to the field of antihermitian operators, i.e., operators in the formx*I
, wherex
is Hermitian.References
[R2] http://mathworld.wolfram.com/HermitianOperator.html
-
bounded
¶ See documentation of
Q.finite
.
-
commutative
¶ Commutative predicate.
ask(Q.commutative(x))
is true iffx
commutes with any other object with respect to multiplication operation.
-
complex
¶ Complex number predicate.
Q.complex(x)
is true iffx
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
¶ Complex elements matrix predicate.
Q.complex_elements(x)
is true iff all the elements ofx
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
¶ Composite number predicate.
ask(Q.composite(x))
is true iffx
is a positive integer and has at least one positive divisor other than1
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
¶ Diagonal matrix predicate.
Q.diagonal(x)
is true iffx
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
¶ Even number predicate.
ask(Q.even(x))
is true iffx
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
¶ Extended real predicate.
Q.extended_real(x)
is true iffx
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
¶ Finite predicate.
Q.finite(x)
is true ifx
is neither an infinity nor aNaN
. In other words,ask(Q.finite(x))
is true for allx
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
¶ Fullrank matrix predicate.
Q.fullrank(x)
is true iffx
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
¶ Hermitian predicate.
ask(Q.hermitian(x))
is true iffx
belongs to the set of Hermitian operators.References
[R6] http://mathworld.wolfram.com/HermitianOperator.html
-
imaginary
¶ Imaginary number predicate.
Q.imaginary(x)
is true iffx
can be written as a real number multiplied by the imaginary unitI
. Please note that0
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
¶ Infinite number predicate.
Q.infinite(x)
is true iff the absolute value ofx
is infinity.
-
infinitesimal
¶ See documentation of
Q.zero
.
-
infinity
¶ See documentation of
Q.infinite
.
-
integer
¶ Integer predicate.
Q.integer(x)
is true iffx
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
¶ Integer elements matrix predicate.
Q.integer_elements(x)
is true iff all the elements ofx
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
¶ Invertible matrix predicate.
Q.invertible(x)
is true iffx
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
¶ Irrational number predicate.
Q.irrational(x)
is true iffx
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
-
is_true
¶ Generic predicate.
ask(Q.is_true(x))
is true iffx
is true. This only makes sense ifx
is a predicate.Examples
>>> from sympy import ask, Q, symbols >>> x = symbols('x') >>> ask(Q.is_true(True)) True
-
lower_triangular
¶ 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
¶ Negative number predicate.
Q.negative(x)
is true iffx
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:
- Note that
Q.nonnegative
and~Q.negative
are not the same thing.~Q.negative(x)
simply means thatx
is not negative, whereasQ.nonnegative(x)
means thatx
is real and not negative, i.e.,Q.nonnegative(x)
is logically equivalent toQ.zero(x) | Q.positive(x)
. So for example,~Q.negative(I)
is true, whereasQ.nonnegative(I)
is false. - See the documentation of
Q.real
for more information about related facts.
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
- Note that
-
nonnegative
¶ Nonnegative real number predicate.
ask(Q.nonnegative(x))
is true iffx
belongs to the set of positive numbers including zero.- Note that
Q.nonnegative
and~Q.negative
are not the same thing.~Q.negative(x)
simply means thatx
is not negative, whereasQ.nonnegative(x)
means thatx
is real and not negative, i.e.,Q.nonnegative(x)
is logically equivalent toQ.zero(x) | Q.positive(x)
. So for example,~Q.negative(I)
is true, whereasQ.nonnegative(I)
is false.
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
- Note that
-
nonpositive
¶ Nonpositive real number predicate.
ask(Q.nonpositive(x))
is true iffx
belongs to the set of negative numbers including zero.- Note that
Q.nonpositive
and~Q.positive
are not the same thing.~Q.positive(x)
simply means thatx
is not positive, whereasQ.nonpositive(x)
means thatx
is real and not positive, i.e.,Q.nonpositive(x)
is logically equivalent to \(Q.negative(x) | Q.zero(x)`\). So for example,~Q.positive(I)
is true, whereasQ.nonpositive(I)
is false.
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
- Note that
-
nonzero
¶ Nonzero real number predicate.
ask(Q.nonzero(x))
is true iffx
is real andx
is not zero. Note in particular thatQ.nonzero(x)
is false ifx
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:
Q.nonzero
is logically equivalent toQ.positive | Q.negative
.- See the documentation of
Q.real
for more information about related facts.
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
¶ 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
¶ Odd number predicate.
ask(Q.odd(x))
is true iffx
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
¶ Orthogonal matrix predicate.
Q.orthogonal(x)
is true iffx
is an orthogonal matrix. A square matrixM
is an orthogonal matrix if it satisfiesM^TM = MM^T = I
whereM^T
is the transpose matrix ofM
andI
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
¶ Positive real number predicate.
Q.positive(x)
is true iffx
is real and \(x > 0\), that is ifx
is in the interval \((0, \infty)\). In particular, infinity is not positive.A few important facts about positive numbers:
- Note that
Q.nonpositive
and~Q.positive
are not the same thing.~Q.positive(x)
simply means thatx
is not positive, whereasQ.nonpositive(x)
means thatx
is real and not positive, i.e.,Q.nonpositive(x)
is logically equivalent to \(Q.negative(x) | Q.zero(x)`\). So for example,~Q.positive(I)
is true, whereasQ.nonpositive(I)
is false. - See the documentation of
Q.real
for more information about related facts.
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
- Note that
-
positive_definite
¶ 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 vectorZ
ofn
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
¶ Prime number predicate.
ask(Q.prime(x))
is true iffx
is a natural number greater than 1 that has no positive divisors other than1
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
¶ Rational number predicate.
Q.rational(x)
is true iffx
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
¶ Real number predicate.
Q.real(x)
is true iffx
is a real number, i.e., it is in the interval \((-\infty, \infty)\). Note that, in particular the infinities are not real. UseQ.extended_real
if you want to consider those as well.A few important facts about reals:
- Every real number is positive, negative, or zero. Furthermore, because these sets are pairwise disjoint, each real number is exactly one of those three.
- Every real number is also complex.
- Every real number is finite.
- Every real number is either rational or irrational.
- Every real number is either algebraic or transcendental.
- The facts
Q.negative
,Q.zero
,Q.positive
,Q.nonnegative
,Q.nonpositive
,Q.nonzero
,Q.integer
,Q.rational
, andQ.irrational
all implyQ.real
, as do all facts that imply those facts. - The facts
Q.algebraic
, andQ.transcendental
do not implyQ.real
; they implyQ.complex
. An algebraic or transcendental number may or may not be real. - The “non” facts (i.e.,
Q.nonnegative
,Q.nonzero
,Q.nonpositive
andQ.noninteger
) are not equivalent to not the fact, but rather, not the fact andQ.real
. For example,Q.nonnegative
means~Q.negative & Q.real
. So for example,I
is not nonnegative, nonzero, or nonpositive.
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
¶ Real elements matrix predicate.
Q.real_elements(x)
is true iff all the elements ofx
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
¶ 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
¶ Square matrix predicate.
Q.square(x)
is true iffx
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
¶ Symmetric matrix predicate.
Q.symmetric(x)
is true iffx
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
-
transcendental
¶ Transcedental number predicate.
Q.transcendental(x)
is true iffx
belongs to the set of transcendental numbers. A transcendental number is a real or complex number that is not algebraic.
-
triangular
¶ Triangular matrix predicate.
Q.triangular(X)
is true ifX
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
¶ 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
¶ Unitary matrix predicate.
Q.unitary(x)
is true iffx
is a unitary matrix. Unitary matrix is an analogue to orthogonal matrix. A square matrixM
with complex elements is unitary if :math:M^TM = MM^T= I
where :math:M^T
is the conjugate transpose matrix ofM
.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
¶ 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
¶ Zero number predicate.
ask(Q.zero(x))
is true iff the value ofx
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
-
-
sympy.assumptions.ask.
ask
(proposition, assumptions=True, context=AssumptionsContext([]))[source]¶ 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
- Remarks
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.
-
sympy.assumptions.ask.
ask_full_inference
(proposition, assumptions, known_facts_cnf)[source]¶ Method for inferring properties about objects.
-
sympy.assumptions.ask.
compute_known_facts
(known_facts, known_facts_keys)[source]¶ 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
andget_known_facts_keys
functions defined at the bottom of this file.
-
sympy.assumptions.ask.
register_handler
(key, handler)[source]¶ 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