Z3 中的 pb.conflict 是什么?
What is pb.conflict in Z3?
我正在尝试使用 python 的 Z3 API
找到最佳解决方案。我已经使用 set_option("verbose", 1)
来打印 Z3
在检查 sat 时生成的语句。它打印的语句之一是 pb.conflict 语句。这些陈述看起来像这样 -
pb.conflict statements.
我想知道pb.conflict到底是什么。这些陈述意味着什么?另外,与它一起打印的两个数字是什么?
pb
代表伪布尔值。伪布尔函数是从布尔值到其他域的函数,通常是 Real
。当变量的选择导致无法满足的子句集时,会发生 conflict
,此时求解器必须回溯。将回溯保持在最低限度对于提高效率至关重要,许多 SAT 引擎都会仔细跟踪该数字。虽然详细信息完全是特定于求解器的(即,您要询问的那两个数字),但通常数字越高,求解器遇到的冲突情况就越多,因此可能决定完全重置状态或采取其他措施。通常,用户可以设置一些参数来指定何时执行此类操作以及这些操作的具体内容。但同样,这完全是特定于求解器和实现的。
google 搜索伪布尔优化会得到一堆您可能想要细读的学术文章。
如果你真的想找到 Z3 对伪布尔值的处理,那么最好的办法可能是查看实现本身:https://github.com/Z3Prover/z3/blob/master/src/smt/theory_pb.cpp
我正在尝试使用 python 的 Z3 API
找到最佳解决方案。我已经使用 set_option("verbose", 1)
来打印 Z3
在检查 sat 时生成的语句。它打印的语句之一是 pb.conflict 语句。这些陈述看起来像这样 -
pb.conflict statements.
我想知道pb.conflict到底是什么。这些陈述意味着什么?另外,与它一起打印的两个数字是什么?
pb
代表伪布尔值。伪布尔函数是从布尔值到其他域的函数,通常是 Real
。当变量的选择导致无法满足的子句集时,会发生 conflict
,此时求解器必须回溯。将回溯保持在最低限度对于提高效率至关重要,许多 SAT 引擎都会仔细跟踪该数字。虽然详细信息完全是特定于求解器的(即,您要询问的那两个数字),但通常数字越高,求解器遇到的冲突情况就越多,因此可能决定完全重置状态或采取其他措施。通常,用户可以设置一些参数来指定何时执行此类操作以及这些操作的具体内容。但同样,这完全是特定于求解器和实现的。
google 搜索伪布尔优化会得到一堆您可能想要细读的学术文章。
如果你真的想找到 Z3 对伪布尔值的处理,那么最好的办法可能是查看实现本身:https://github.com/Z3Prover/z3/blob/master/src/smt/theory_pb.cpp