Z3 - try-for导致分段错误

时间:2015-08-06 19:13:31

标签: java z3 smt

我正在使用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

1 个答案:

答案 0 :(得分:0)

如评论中所示,由于Z3团队(closed bug report)的错误修正,问题现已解决。此错误修复程序已集成在下一个发布的版本4.4.1中,该版本在编写时是最新版本。