我正在尝试用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));
数组非常适合表示当前赋值,因为它可以随机访问任何命题。为了表示子句,可以使用STL的命题索引集。
要实现一个非常高效的SAT求解器,您将需要更多的数据结构(用于存储观察到的文字和解释)。这些概念的介绍非常易读,可以在http://poincare.matf.bg.ac.rs/~filip/phd/sat-tutorial.pdf。