DPLLは本質的にバックトラッキング アルゴリズムであり、それが再帰呼び出しの背後にある主なアイデアです。
アルゴリズムは、割り当てを試行しながらソリューションを構築しています。進行するにつれて、成功または失敗する可能性のある部分的なソリューションがあります。アルゴリズムの天才は、部分的なソリューションを構築する方法です。
まず、ユニット句とは何かを定義しましょう。
unit 句は、まだ割り当てられていないリテラルを 1 つだけ持つ句であり、他の (割り当てられた) リテラルはすべて false に割り当てられます。
この句の重要性は、現在の割り当てが有効である場合、割り当てられていないリテラルにある変数の値を判断できることです。リテラルは真でなければならないためです。
例: 式がある場合:
(x1 \/ x2 \/ x3) /\ (~x1 \/ ~x4 \/ x5) /\ ( ~x1 \/ x4)
そして、すでに割り当てています:
x1=true, x4=true
Then(~x1 \/ ~x4 \/ x5)
は unit 句ですx5=true
。これは、現在の部分代入でこの句を満たすために代入する必要があるためです。
アルゴリズムの基本的な考え方は次のとおりです。
- 変数を「推測」する
- 最後の割り当てから作成されたすべての単位句を見つけて、必要な値を割り当てます
- 変更がなくなるまでステップ 2 を繰り返し再試行します (推移閉包が見つかります)。
- 現在の代入がすべての節に対して true を生成できない場合 - 再帰から折り返し、別の代入を再試行します
- 可能な場合 - 別の変数を「推測」する (再帰的に呼び出して 1 に戻す)
終了:
- 「戻って」「推測」を変更する場所がない(解決策なし)
- すべての節が満たされている (解決策があり、アルゴリズムがそれを見つけた)
詳細と例については、これらの講義スライドを参照することもできます。
使用例と重要性:
DPLL は 50 年前のものですが、今でもほとんどの SAT ソルバーの基礎となっています。
SAT ソルバーは、難しい問題を解決するのに非常に役立ちます。たとえば、ソフトウェア検証では、モデルを一連の式と検証する条件として表し、その上で SAT ソルバーを呼び出します。指数関数的な最悪のケース - 平均的なケースでも十分に高速であり、業界で広く使用されています (主にハードウェア コンポーネントの検証用)。