如维基百科中所述,我正在 C++ 中实现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));
但表现糟糕。在这一步中:
return DPLL(Φ ∧ l) or DPLL(Φ ∧ not(l));
目前我试图避免创建副本,Φ
而是添加l
ornot(l)
到一个且唯一的副本,并在 /if的 returnΦ
时删除它们。这似乎破坏了给出错误结果的算法(即使集合是)。DPLL()
false
UNSATISFIABLE
SATISFIABLE
有关如何在此步骤中避免显式复制的任何建议?