ウィキペディアで説明されているように、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
またはnot(l)
の唯一のコピーを追加して、/if 'sが戻っΦ
たときにそれらを削除します。これはアルゴリズムを壊して間違った結果を与えるようです(セットがであるとしても)。DPLL()
false
UNSATISFIABLE
SATISFIABLE
このステップで明示的なコピーを回避する方法に関する提案はありますか?