如何在sympy中检查基本整数顺序关系?

时间:2019-04-30 21:35:33

标签: numbers integer sympy

我对(例如{x > -1, x < 5, x != 2, y > 0, x-2 < y}这样的多个 integers 有一个(可能相对较大的)假设,我想检查像{x > -5, x == 3, ...}这样的某些其他命题是否正确,错误或两者皆有。

文档说不支持像Q.is_true(x < 3)这样的显式关系,因此我尝试使用.positive属性,但是没有运气,例如

#    x > -1 => x > -3   - ?
x = sympy.Symbol('x')
with sympy.assuming(sympy.Q.positive(x+1), sympy.Q.integer(x)):
  print(sympy.ask(sympy.Q.positive(x+3)))

产生

None

这意味着检查者放弃了检查。

精炼似乎也无济于事(无论如何可能使用假设)

sympy.refine(x > 0, sympy.Q.is_true(x > -1))

如果有另一个可以检查的库,那也可以!

1 个答案:

答案 0 :(得分:2)

我发现z3求解器的python绑定最适合我的问题。只需从github页面下载二进制发行版,然后将包含的文件夹添加到$PYTHONPATH中,例如

LD_LIBRARY_PATH=${Z3FOLDER}/bin PYTHONPATH=${Z3FOLDER}/bin/python python

然后可以将这些关系检查为

from z3 import *
x = Int('x')
s = Solver()
s.add(x > 10)
s.add(x > 12)
print(s)           // [x > 10, x > 12]
print(s.check())   // sat
print(s.model())   // [x = 13]