我正在尝试使用Z3来确定表达式是否可以满足。我可以通过定义上下文然后int_const变量和公式来轻松完成此操作。要以编程方式评估表达式,您必须在代码中编写所有内容。假设逻辑表达式以字符串的形式给出,那么呢?例如,
“x == y&&!x == z”
将在C API中表示为:
context c;
expr x = c.int_const("x")
//Same for other variables
...
formula = (x == y) && (!x == z);
solver s(c);
s.add(formula);
//s.check() ...etc etc
好的,我可以编写这个特定公式的代码,但是如何在给定字符串的情况下以编程方式执行此操作。我愿意接受你能想到的任何事情。
谢谢:)
答案 0 :(得分:2)
我看到以下选项:
1)您可以实现自己的解析器,并调用Z3 API函数。 亲:您可以使用“最喜欢的”语言编写公式。 Con:这是“忙碌”的工作。
2)您可以使用API Z3_parse_smtlib2_string
。 Con:您的公式必须采用SMT 2.0格式。例如,您必须编写(and (= x y) (not (= x y)))
而不是(x == y) && !(x == z)
。
3)您可以使用Z3 Python API,并使用Python中的eval
函数解析字符串。
这是一个例子:
from z3 import *
# Creating x, y
x = Int('x')
y = Int('y')
# Creating the formula using Python
f = And(x == y, Not(x == y))
print f
# Using eval to parse the string.
s = "And(x == y, Not(x == y))"
f2 = eval(s)
print f2
BTW,此脚本在rise4fun http://rise4fun.com/z3py不起作用,因为那里不允许使用函数eval
,但您可以在本地Z3安装中使用上面的脚本。