我有以下布尔表达式 x> 5和y> 10
C:\>python Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36)Type "help", "copyright", "credits" or "license" for more information.
>>> x = 3
>>> y = 11
>>> eval("x>5 and y > 10") False
>>> x = 6
>>> eval("x>5 and y > 10") True
>>>
当x> 5和y> 10评估公式被评估为“真实”。
当x == 6且y == 5时,公式被评估为“假”,因为y <0。 10.
我想知道是否有一个库/软件(python用作示例,语言不是问题),它可以回答调用者哪些值满足公式。
答案 0 :(得分:1)
SMT求解器很适合这个法案。这是使用Python绑定到z3编码的问题:
from z3 import *
def getResult (s):
r = s.check()
if r == sat:
print True
print s.model()
elif r == unsat:
print False
elif r == unknown:
print "Solver said unknown!"
else:
print "Unexpected result!"
print r
x, y = Ints('x y')
s1 = Solver()
s1.add(x == 3)
s1.add(y == 11)
s1.add (x > 5)
s1.add (y > 10)
getResult(s1)
s2 = Solver()
s2.add (x == 6)
s2.add (y == 11)
s2.add (x > 5)
s2.add (y > 10)
getResult (s2)
运行时,会打印:
False
True
[y = 11, x = 6]
当然这是一个愚蠢的例子;您根本不必指定x
和y
的值;如果你不这样做,z3会给你一些满足约束的价值。
在此处详细了解z3:https://rise4fun.com/z3/tutorial
在此处阅读有关SMT解决方案的更多信息:http://smtlib.cs.uiowa.edu/
z3是开源的,可从以下网址下载:https://github.com/Z3Prover/z3
z3可以用多种语言编写脚本; SMTLib / C / C ++ / Java / Python / Scala甚至Haskell。一般而言,语言越高,使用界面就越容易。