如何简化(eval(f x y))的结果?

时间:2013-05-14 22:23:33

标签: z3

如何简化评估未解释函数时获得的布尔表达式? 例如,在示例中:http://rise4fun.com/Z3/G8sL

(eval (f x y)) 

收益率(不是(和(不是x)(不是y)))

我希望得到表达式(或x y)。

(simplify (eval (f x y)) 

给出错误。

1 个答案:

答案 0 :(得分:3)

SMT-LIB 2.0前端不支持此功能。 你应该考虑一个Z3的程序化前端。 例如,以下是使用Z3 Python前端(也可用here)的方法:

B = BoolSort()
f = Function('f', B, B, B)
x, y = Bools('x y')
b1, b2 = Bools('b1 b2')

s = Solver()
s.add(ForAll([b1, b2], Implies(Or(b1, b2), f(b1, b2))))
s.add(Exists([b1, b2], Not(f(b1, b2))))

print(s.check())
m = s.model()
print(m.evaluate(f(x, y)))
print(simplify(m.evaluate(f(x, y)), elim_and=True))