如果我给Z3一个类似p |的公式q,我希望Z3返回p = true,q =不关心(或者用p和q切换)但是它似乎坚持为p和q分配值(即使我没有完成转向在调用Eval()
时打开。除了对此感到惊讶之外,我的问题是如果p和q不是简单的道具。 vars但昂贵的表达,我知道通常p或q都是真的。是否有一种简单的方法可以让Z3返回“最小”模型,而不是浪费时间试图满足p和q?我已经尝试了MkITE
,但这没有任何区别。或者我是否必须使用某种策略来强制执行此操作?
谢谢! PS。我想补充一点,我已经关闭了AUTO_CONFIG,但是Z3正在尝试将值分配给or的两个分支中的常量:例如,在下面的片段中我希望它分配给path2_2和path2_1或者分配给path2R_2和path2R_1但不是两者都分配
(or (and (select a!5 path2_2) a!6 (select a!5 path2_1) a!7)
(and (select a!5 path2R_2) a!8 (select a!5 path2R_1) a!9))
答案 0 :(得分:3)
Z3具有称为相关性传播的功能。它在this article中描述。它做你想要的。请注意,在大多数情况下,相关性传播会对性能产生负面影响。在我们的实验中,它仅对包含量词的问题有用(量词推理是如此昂贵以至于得到回报)。默认情况下,Z3将在包含量词的问题中使用相关性传播。否则,它将不会使用它。 这是一个关于如何在问题没有量词时将其打开的示例(该示例也可在线获取here)
x, y = Bools('x y')
s = Solver()
s.set(auto_config=False, relevancy=2)
s.add(Or(x, y))
print s.check()
print s.model()