我需要它在符号执行(Klee)的上下文中进行增量求解。 在符号执行路径的分支点中,有必要将求解器上下文分成两部分:具有真和假条件。当然,有一个昂贵的解决方法 - 创建空上下文并重放所有约束。
有没有办法拆分Z3_context?您是否计划添加此类功能?
请注意
如果使用深度优先符号探索,即可以避免分裂上下文,即探索当前执行路径直到达到“结束”,因此将来不再探索此路径。在这种情况下, pop 就足够了,直到到达分支点并继续探索另一个条件分支。但是在Klee的情况下,许多符号路径被“同时”探索(探索真假分支是交错的),所以你需要求解器上下文求解器切换(每个方法中有Z3_context参数)和分支(没有方法,这就是我需要的)。谢谢!
答案 0 :(得分:4)
不,当前版本的Z3(3.2)不支持此功能。我们意识到这是一项重要的功能,下一版本将提供同等功能。 这个想法是分离Context和Solver的概念。在下一个版本中,我们将提供用于创建(和复制)求解器的API。因此,您将能够为搜索的每个分支使用不同的求解器。简而言之,Context用于管理/创建Z3表达式,而Solver用于检查可满足性。
答案 1 :(得分:3)
我目前用于此类事情的方法是断言像p =>这样的公式。 A而不是A,其中p是一个新的布尔文字。然后在我的客户端中,我维护与每个分支对应的保护文字列表之间的关联,并使用check_assumptions()。在我的情况下,我碰巧能够在每次搜索期间分配所有公式,但是YMMV。即使对于深度优先的探索,我似乎也比使用push / pop更多地使用增量重用。