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