我正在使用z3的python API来解决查看一组约束是否可满足的问题。 我有条件作为字符串,我想尽可能直接将它们传递给z3,只是为了节省转码的处理时间。 如果约束是a = b这样的赋值,那么输入它的最佳方法是什么。 我想要像
这样的东西 str1 = "a = b"
a = BitVec('a', 3)
b = BitVec('b', 3)
s = Solver()
s.push()
s.add(str1)
该程序将错误视为“预期的True,False或Z3布尔表达式” 请让我知道最好的方法。
答案 0 :(得分:3)
您需要将Z3表达式传递给大多数API函数(如Solver.add(expr)
),而不是字符串。对于您的示例(z3py link:http://rise4fun.com/Z3Py/iu0):
str1 = "a = b"
a = BitVec('a', 3)
b = BitVec('b', 3)
constraint1 = a == b # sets constraint1 to be the z3 expression a == b
s = Solver()
s.push()
# s.add(str1) # error: 'True, False or Z3 Boolean expression expected'
s.add(constraint1)
print constraint1
如果你想传递以中缀表示法编码的字符串(比如“a = b”),你应该可以使用Python的eval
,虽然这可能无法完全通用,所以你可能要写解析器,由于清理程序,你不能在rise4fun上使用eval
:
constraint2 = eval(str1)
以下是有关使用eval
:z3python: converting string to expression
如果您使用SMT-LIB标准编码的字符串(使用前缀表示法,例如“(= a b)”),则可以使用parse_smt2_string
API函数。以上是继续上述的示例:
cstr1 = "(assert (= a b))"
ds = { 'a' : a, 'b' : b }
constraint3 = parse_smt2_string(cstr1, decls=ds)
print constraint3
prove(constraint1 == constraint3)
以下是parse_smt2_string
:http://research.microsoft.com/en-us/um/redmond/projects/z3/z3.html#-parse_smt2_string
另请参阅有关使用中缀输出Z3表达式的相关问题和答案:how to convert z3 expression to infix expression?