我在弄清楚如何调试z3时遇到了麻烦。有没有一种方法可以查看SMT引擎在“尝试”什么,以使其更容易理解为什么它未能看到一个显而易见的解决方案,而是将精力投入到了时间上?
以我的特定情况为例,我正在使用递归函数,并将z3设置为在函数具有特定结果的情况下查找输入。 SMT超时了,yadda yadda yadda证明了我要进行递归的事情的基本情况为0,但是如果它变为负数,它将永远递归。 Z3不知道不选择负数,因此会卡住。我通过盯着代码知道了这一点,但是如果我在某个地方有一些输出,说“ try i == -10,try i == -11,依此类推”,那么很明显出了什么问题。
我仍然没有那么明显的问题,而且我怀疑Z3仍然陷于循环中。我如何看待循环陷入其中?
答案 0 :(得分:0)
不幸的是,要弄清Z3为何一直运行是非常困难的,但是典型的罪魁祸首是由于模式错误而导致的匹配循环(量词实例化会产生触发另一个实例化的新基本项,因此on)和非线性算法。
Z3 axiom profiler中描述的this paper可以帮助识别由于量词实例化过多而引起的问题。