我正在使用Java-API在Ubuntu Linux 14.04上与Z3进行通信。关于Z3,我使用github上发现的当前版本的master-branch(今天编译)。
我希望检查可满足性的公式的基本结构如下:
(and (exists ((x1 S1) ... (xn Sn)) p(x1,...,xn))
(not (exists ((x1 S1) ... (xm Sm)) q(x1,...,xm))))
其中Si可以是Bool,枚举Sort,Real或Integer 和p和q是包含以下公式:
但是,公式可以包含整数或实数,但不能同时包含两者。
为了检查可满足性,我使用策略创建了一个求解器:
(or-else (try-for smt x) (then qe smt))
原因是一些公式很简单,因此检查速度快,不需要量词消除,但普通的smt求解器在没有量词消除的情况下失败了。由于smt求解器可能需要很长时间才能失败,因此我使用try-for,超时为x。
现在问题在于,根据x的值,这个策略在几百次可满足性检查(实际数量变化)之后产生分段错误。我还观察到较大的值往往更安全,但这取决于公式p和q的复杂性。目前,我使用的值介于70到200之间。
由于重现问题所需的实际可满足性检查数量各不相同,因此我无法给出触发问题的具体最小例子。
我的问题是:通常应该避免低超时值,还是有办法解决这个问题?即是否可以使用70毫秒的超时并尝试消除量化器?
另一个问题:考虑到在大多数情况下我不需要模型,对于我描述的那种问题是否有更有效的策略? 或者是否有必要提供更多细节?
编辑:
我刚刚意识到,在某些情况下,与try-for的组合实际上会产生错误的结果,但只有在经过一定数量的可满足性检查后,无论x的实际值如何(Z3 @ rise4fun都会产生正确的结果)。使用这种策略的解算器认为不可满足的公式是可以满足的,而策略(then qe smt)
产生了正确的结果。
Link to check of formula producing the correct result
答案 0 :(得分:0)
如评论中所示,由于Z3团队(closed bug report)的错误修正,问题现已解决。此错误修复程序已集成在下一个发布的版本4.4.1中,该版本在编写时是最新版本。