我正在编写一个 SAT 求解器,并开始实施 DPLL 算法。我了解该算法及其工作原理,我还实现了它的一个变体,但困扰我的是接下来的事情。
function DPLL(Φ)
if Φ is a consistent set of literals
then return true;
if Φ contains an empty clause
then return false;
for every unit clause l in Φ
Φ ← unit-propagate(l, Φ);
for every literal l that occurs pure in Φ
Φ ← pure-literal-assign(l, Φ);
l ← choose-literal(Φ);
return DPLL(Φ ∧ l) or DPLL(Φ ∧ not(l));
这是什么意思,这Φ
是一组一致的文字?我理解不一致意味着假,这意味着一致意味着不假。true
那么,如果当前的分配没有证伪问题,为什么我们可以返回呢?
我实现我的 SAT 求解器的方式是,每当遇到使所有子句都为真的赋值时,我返回那个赋值,算法就完成了。但是由于对于给定的赋值,所有子句都必须为真才能成为问题的解决方案,我不明白,true
如果赋值刚好满足问题,怎么能返回(我假设我弄错了在这里,但是既然如果Φ
是一致的,那么就意味着它不是假的,但它仍然可以是不可判定的?)。