超时战术解算器的行为不正确

时间:2013-05-08 11:48:59

标签: z3

我试图在Z3中使用战术解算器来解决一些X约束的问题而不是通用求解器。

我使用以下策略 -

simplify purify-arith elim-term-ite reduce-args propagate-values solve-eqs symmetry-reduce smt sat sat-preprocess

我使用Z3_tactic_and_then API将这些策略一个接一个地应用于问题。 我也使用this technique来配置求解器的超时。

现在,对于同样的问题,如果我使用通用解算器,它会超时查询指定的超时时间。但是,如果我使用上面提到的解算器策略,那么它在给定时间内不会超时。它的运行时间更长。

例如,我指定了180*1000 milliseconds的超时,但它在730900毫秒内超时。 我试图删除上面提到的一些策略,但行为仍然是相同的。

Z3版本4.1

1 个答案:

答案 0 :(得分:1)

不幸的是,并非每种策略都会考虑超时。策略smt是一个很大的“罪犯”。这个策略包含了一个在Z3中实现的非常古老的求解器。不幸的是,这个解算器在一些昂贵的计算过程中不能被中断,因为它会使系统处于损坏状态。也就是说,Z3将在未来的运营中崩溃。当这个求解器被实现时,使用了非常简单的设计。如果我们想要中断该过程: kill it 。当然,在使用嵌入在更大应用程序中的Z3时,这是不可接受的。新代码通常对超时响应更快,我们尽量避免这种糟糕的设计。