我对(例如{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))
如果有另一个可以检查的库,那也可以!
答案 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]