我在Python-API中使用Z3。 我正在设置一组相当大的线性算术约束。
但是,push
/ pop
导致check()
无限运行。
如果我不使用任何push
/ pop
,则可以正常使用。但是当我只插入一个
s.push()
s.pop()
在s.check()
之前的某个地方,s.check()
无休止地运行。
仅使用不push
的{{1}}工作正常。
是否有任何已知问题和解决方法? 我在MacOS 10.7.5上使用Z3 [版本4.3.1 - 64位]。
非常感谢&问候, 克劳斯
答案 0 :(得分:1)
Z3是求解器的集合。但是,其中只有一个是增量的。
非增量求解器对您的问题更有效。
当您使用s.push()
时,Z3“猜测”您想要逐步解决问题,并切换到增量(通用)求解器。
如果我们在文件的开头添加以下命令,Z3将显示几条消息。请注意,当我们使用s.push()
时,消息完全不同。
set_option(verbose=10)
我们可以强制Z3使用特定的求解器。例如,如果我们替换
s = Solver()
与
s = Tactic('qflia').solver()
然后,即使使用s.push()
,Z3也将使用有效的求解器。
但是,它将从头开始每个check()
命令。我不认为这是你问题中的问题,因为非增量和增量之间的性能差异非常大。