将等式约束放在z3中

时间:2013-05-10 01:48:19

标签: constraints equality z3

我正在使用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布尔表达式” 请让我知道最好的方法。

1 个答案:

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

以下是有关使用evalz3python: 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_stringhttp://research.microsoft.com/en-us/um/redmond/projects/z3/z3.html#-parse_smt2_string

的API文档

另请参阅有关使用中缀输出Z3表达式的相关问题和答案:how to convert z3 expression to infix expression?