找到哪些值满足布尔公式

时间:2018-06-13 15:21:27

标签: python boolean-expression sat

我有以下布尔表达式 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用作示例,语言不是问题),它可以回答调用者哪些值满足公式。

1 个答案:

答案 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]

当然这是一个愚蠢的例子;您根本不必指定xy的值;如果你不这样做,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。一般而言,语言越高,使用界面就越容易。