由于这个问题有点难以描述,我将用一个小例子来描述我的问题。 假设有一个命题公式集,其元素是布尔变量a,b和c。 当使用z3获得该公式集的真值分配时,是否存在某种设置变量优先级的方法?我的意思是如果优先级是> b> c,那么在搜索过程中,z3首先假设a为真,如果a不可能为真,则假设b为真,依此类推。换句话说,如果z3给出真值赋值:在上述优先级下不是a,b,c,则意味着a不可能为真,因为a与b相比具有高优先级。希望我能清楚地描述这个问题。
答案 0 :(得分:4)
目前的版本(v4.3.1)中没有简单的方法。我能看到的唯一方法是破解/修改Z3源代码(http://z3.codeplex.com)。我们同意设置优先级对于某些应用程序来说是一个有用的功能,但是存在一些问题。
首先,Z3在解决问题之前应用了几个转换(也称为预处理步骤)。创建并消除变量。因此,原始问题的案例分割优先级对于由Z3解决的实际问题(在应用所有变换之后生成的问题)可能是没有意义的。
一个引人注目的例子是仅包含位向量的公式。默认情况下,Z3会将此公式缩减为命题逻辑并调用命题SAT求解器。在此减少中,所有位向量变量都被消除。
Z3是求解器和预处理器的集合。默认情况下,Z3将自动为用户选择解算器。其中一些求解器使用完全不同的算法。因此,所提供的优先级对于所使用的求解器可能是无用的。
正如GManNickG指出的那样,可以为特定求解器设置相位选择策略。有关其他详细信息,请参阅其评论中提供的帖子。