Z3中断言顺序的重要性是什么?

Z3中断言顺序的重要性是什么?,z3,Z3,我有两个文件,除了我放置断言的顺序之外,它们的内容是相同的:在一个文件中,断言的放置顺序与另一个相反。z3在不到一秒钟的时间内宣布第一个文件(po-9.z3)不可用,而另一个文件(po.z3)在一分钟内无法验证 造成这种差异的原因是什么?我认为,将早期验证中涉及的断言放在文件中可以提高性能。然而,通过验证的那个(po-9.z3)在文件的底部有大多数相关/问题特定的断言。此外,在po.z3中,当待证明的定理和假设位于文件顶部时,一个重要的断言(lambda表达式的一阶公式)位于文件底部。当我把它带

我有两个文件,除了我放置断言的顺序之外,它们的内容是相同的:在一个文件中,断言的放置顺序与另一个相反。z3在不到一秒钟的时间内宣布第一个文件(po-9.z3)不可用,而另一个文件(po.z3)在一分钟内无法验证

造成这种差异的原因是什么?我认为,将早期验证中涉及的断言放在文件中可以提高性能。然而,通过验证的那个(po-9.z3)在文件的底部有大多数相关/问题特定的断言。此外,在po.z3中,当待证明的定理和假设位于文件顶部时,一个重要的断言(lambda表达式的一阶公式)位于文件底部。当我把它带到顶部时,po.z3在不到一秒钟的时间内进行验证

在Z3SMT2文件中生成断言的最佳顺序是什么

造成这种差异的原因是什么

SMT解算器实现DPLL(T)算法,该算法是DPLL过程和决策过程的组合(一种变体)

DPLL的性能受到分支变量选择的严重影响。有些情况下,根据变量选择,运行时间为常数或指数


如果这两个公式在逻辑上是等价的(您需要仔细检查),那么我认为唯一的可能性是,这两个公式中的不同顺序导致变量选择的不同顺序,最终导致性能的不同。

谢谢,很高兴知道这一点。是否有任何方法可以预测订单将产生的影响?换句话说,既然我生成了z3文件,我如何选择断言的顺序,以便最大限度地提高z3在简单输入时不会超时的可能性?变量选择是一种启发式方法,通常包括随机性。所以我不知道如何让你的公式对z3更容易。您可能需要查看中的函数
solver::next_var()
,以了解启发式是如何工作的。您能否帮助我找到数字(0到
num_vars()
)与变量“名称”之间的映射?实际上,我正在尝试更改smt_case_split_queue.cpp中的类似代码。