这是一个非常简单的cnf实例,如(x1或x2或x3)&(x1或x2)&(x2或x3),公式绝对可以满足,解是x1 = x2 = x3 = 1,足够了。那么,我的问题是求解器如何使用DPLL或其他程序产生赋值?感谢。
答案 0 :(得分:1)
嗯,基本上,对于CDCL的情况
( CDCL SAT求解器实现DPLL ,但可以学习新的子句并按时间顺序回溯。使用冲突分析的子句学习不会影响健全性或完整性。冲突分析使用解析操作识别新的子句。因此,每个学习的条款可以通过一系列解决步骤从原始条款和其他学习条款中推断出来。如果cN是新的学习条款,那么当且仅当φ∪{cN}也是可满足时,φ是可满足的。修改后的回溯步骤也不会影响健全性或完整性,因为从每个新学习的条款中获取回溯信息。)。(来源:Wikipedia)
它的工作原理如下:
首先选择一个分支变量x1。黄色圆圈意味着任意决定。
现在应用单位传播,产生x4必须为1(即True)。灰色圆圈表示单位传播期间的强制变量分配。生成的图形称为蕴涵图。
随意选择另一个分支变量x3。
应用单位传播并找到新的蕴涵图。
这里变量x8和x12分别被强制为0和1。
选择另一个分支变量x2。
查找蕴涵图。
选择另一个分支变量x7。
查找蕴涵图。
发现冲突!
找出导致此冲突的切口。从削减开始,找到一个相互矛盾的条件。
取消这种情况并将其作为一个条款。
将冲突条款添加到问题中。
非按时间顺序跳回到适当的决策级别。
后跳并相应地设置变量值。
(完全来自Wikipedia: Conflict-Driven_Clause_Learning#Example)
以下是使用CDCL算法的求解程序列表(不完整),您应该查看它们: