SAT ソルバー演習問題と解答

DPLL と CDCL は、読んだだけでは定着しにくい。ここでは、節の評価、CNF 符号化、Tseitin 変換、DPLL トレース、CDCL 衝突解析、watched literals、実装上の判断まで、解答付きの演習としてまとめる。

45 exercisesshow/hide answersprogress checkself quiz

0. 進め方

各問題を自分で解いてから「解答を見る」を開く。解けた問題はチェックボックスを入れると進捗が更新される。最後に小テストで、定義ではなく判断が身についているかを確認する。

0 / 45 完了

1. 早見表

概念判定基準演習での使い方
単位節偽でないリテラルが未割当 1 個だけBCP の発火条件
衝突ある節の全リテラルが偽DPLL では backtrack、CDCL では analyze
理由節伝播リテラルを強制した節含意グラフの辺ラベル
1-UIP 節現在レベルのリテラルが 1 個だけbackjump 後に asserting になる
watch 更新偽になった watch を別の偽でないリテラルへ動かす動かせなければ単位または衝突

2. 基礎:CNF と節の評価

問題 1:節の状態を分類せよ

意味論

\(C=(x\lor\neg y\lor z)\)、割当 \(x=F,y=T,z=U\)。節は真、偽、単位、未決定のどれか。

解答を見る

単位。\(x=F\)、\(\neg y=F\)、\(z=U\) なので、偽でないリテラルが \(z\) だけ残る。BCP は \(z=T\) を伝播する。

問題 2:空 CNF と空節

意味論

空 CNF \(\bigwedge_{C\in\varnothing}C\) と、空節 \(()\) を含む CNF は、それぞれ SAT/UNSAT のどちらか。

解答を見る

空 CNF は真なので SAT。空節は偽なので、それを含む CNF は UNSAT。AND の単位元は真、OR の単位元は偽である。

問題 3:モデルを 1 つ見つけよ

意味論

\(F=(a\lor b)\land(\neg a\lor c)\land(\neg b\lor c)\) のモデルを 1 つ示せ。

解答を見る

例えば \(a=T,b=F,c=T\)。第 1 節は \(a\) で真、第 2 節は \(c\) で真、第 3 節は \(\neg b\) と \(c\) で真。

問題 4:単位伝播列

BCP

\(F=(a)\land(\neg a\lor b)\land(\neg b\lor c)\) で BCP を最後まで行え。

解答を見る

まず \((a)\) から \(a=T\)。次に \((\neg a\lor b)\) が単位になり \(b=T\)。さらに \((\neg b\lor c)\) が単位になり \(c=T\)。衝突はない。

問題 5:純リテラルを探せ

DPLL

\((p\lor q)\land(p\lor\neg r)\land(q\lor r)\) で純リテラルを挙げよ。

解答を見る

\(p\) は正でしか現れないので純リテラル。\(q\) も正でしか現れないので純リテラル。\(r\) は \(\neg r\) と \(r\) の両方が出るため純ではない。

問題 6:小さい UNSAT を示せ

意味論

\((a\lor b)\land(a\lor\neg b)\land(\neg a\lor b)\land(\neg a\lor\neg b)\) が UNSAT であることを示せ。

解答を見る

\(a=T\) なら第 3 節から \(b=T\)、第 4 節から \(b=F\) が必要。矛盾。\(a=F\) なら第 1 節から \(b=T\)、第 2 節から \(b=F\) が必要。両方の \(a\) で矛盾するので UNSAT。

問題 7:含意を CNF にせよ

CNF

\((a\land b)\Rightarrow c\) を 1 節の CNF に変換せよ。

解答を見る

\(\neg(a\land b)\lor c\equiv \neg a\lor\neg b\lor c\)。したがって \((\neg a\lor\neg b\lor c)\)。

問題 8:部分割当で衝突する節

BCP

\(C=(\neg a\lor b\lor\neg c)\)、\(a=T,b=F,c=T\)。節の状態は何か。

解答を見る

\(\neg a=F\)、\(b=F\)、\(\neg c=F\)。全リテラルが偽なので節は空になり、衝突である。

3. CNF 符号化と Tseitin 変換

問題 9:OR ゲートの Tseitin 節

Tseitin★★

\(z\leftrightarrow(a\lor b)\) を CNF にせよ。

解答を見る

\(z\Rightarrow a\lor b\) から \((\neg z\lor a\lor b)\)。\(a\Rightarrow z\) から \((z\lor\neg a)\)。\(b\Rightarrow z\) から \((z\lor\neg b)\)。よって \((\neg z\lor a\lor b)\land(z\lor\neg a)\land(z\lor\neg b)\)。

問題 10:AND ゲートの Tseitin 節

Tseitin★★

\(z\leftrightarrow(a\land b)\) を CNF にせよ。

解答を見る

\(z\Rightarrow a\) と \(z\Rightarrow b\) から \((\neg z\lor a)\land(\neg z\lor b)\)。\(a\land b\Rightarrow z\) から \((z\lor\neg a\lor\neg b)\)。

問題 11:XOR ゲート

Tseitin★★★

\(z\leftrightarrow(a\oplus b)\) の CNF を書け。

解答を見る

XOR でない 4 つの組を禁止する。CNF は \((\neg a\lor\neg b\lor\neg z)\land(a\lor b\lor\neg z)\land(a\lor\neg b\lor z)\land(\neg a\lor b\lor z)\)。

問題 12:exactly-one 制約

CNF★★

\(x_1,x_2,x_3\) のちょうど 1 つが真である制約を CNF にせよ。

解答を見る

少なくとも 1 つ:\((x_1\lor x_2\lor x_3)\)。高々 1 つ:\((\neg x_1\lor\neg x_2)\land(\neg x_1\lor\neg x_3)\land(\neg x_2\lor\neg x_3)\)。両者の AND。

問題 13:グラフ彩色の辺制約

符号化★★

頂点 \(u,v\) が隣接し、色集合が \(\{R,G,B\}\)。変数 \(x_{u,R}\) などを使って、同色禁止制約を書け。

解答を見る

各色 \(c\in\{R,G,B\}\) について \((\neg x_{u,c}\lor\neg x_{v,c})\)。具体的には \((\neg x_{u,R}\lor\neg x_{v,R})\land(\neg x_{u,G}\lor\neg x_{v,G})\land(\neg x_{u,B}\lor\neg x_{v,B})\)。

問題 14:PHP(3,2) の「各鳩は入る」節

符号化★★

\(p_{i,h}\) を「鳩 \(i\) が穴 \(h\) に入る」とする。3 羽 2 穴で、各鳩が少なくとも 1 つの穴に入る節を書け。

解答を見る

\((p_{1,1}\lor p_{1,2})\land(p_{2,1}\lor p_{2,2})\land(p_{3,1}\lor p_{3,2})\)。穴ごとの高々 1 羽制約を加えると PHP(3,2) は UNSAT になる。

問題 15:Tseitin 変換の同充足性

Tseitin★★★

Tseitin 変換は元の式と「同値」か「同充足」か。理由も述べよ。

解答を見る

基本的には同充足。補助変数を導入するため、同じ変数集合上の完全な同値式ではない。ただし、補助変数を存在量化して元変数へ射影すれば、元の式と対応する。

問題 16:DIMACS を読め

実装
p cnf 3 2
1 -2 0
-1 3 0

この DIMACS はどの CNF を表すか。

解答を見る

変数 3 個、節 2 個。節は \((x_1\lor\neg x_2)\) と \((\neg x_1\lor x_3)\)。したがって \((x_1\lor\neg x_2)\land(\neg x_1\lor x_3)\)。

4. DPLL 演習

問題 17:DPLL で SAT を示せ

DPLL★★

\(F=(a\lor b)\land(\neg a\lor c)\land(\neg b\lor\neg c)\)。\(a=T\) から DPLL を進めよ。

解答を見る

\(a=T\) で第 2 節から \(c=T\)。すると第 3 節 \((\neg b\lor\neg c)\) は \((\neg b)\) になり \(b=F\)。第 1 節は \(a=T\) で満たされる。モデル \(a=T,b=F,c=T\)。

問題 18:DPLL で UNSAT を示せ

DPLL★★

\((a\lor b)\land(a\lor\neg b)\land(\neg a\lor b)\land(\neg a\lor\neg b)\) について、\(a\) で分岐して探索木を閉じよ。

解答を見る

\(a=T\):第 3 節から \(b=T\)、第 4 節から \(b=F\) で衝突。\(a=F\):第 1 節から \(b=T\)、第 2 節から \(b=F\) で衝突。両枝が閉じるので UNSAT。

問題 19:純リテラル規則を適用せよ

DPLL★★

\(F=(x\lor y)\land(x\lor\neg z)\land(y\lor z)\)。純リテラル規則だけで簡約せよ。

解答を見る

\(x\) と \(y\) は正でしか現れない。\(x=T\) と置くと前 2 節が満たされる。さらに \(y=T\) と置くと第 3 節も満たされる。したがって SAT。

問題 20:単位伝播後の残余式

DPLL★★

\(F=(a)\land(\neg a\lor b\lor c)\land(\neg b\lor d)\)。BCP で \(a=T\) を入れた後の残余式を書け。

解答を見る

\((a)\) は満たされ削除。\((\neg a\lor b\lor c)\) は \((b\lor c)\) になる。\((\neg b\lor d)\) は変わらない。残余式は \((b\lor c)\land(\neg b\lor d)\)。

問題 21:DPLL の停止性

理論★★

有限個の変数を持つ CNF に対して、DPLL が停止する理由を述べよ。

解答を見る

各分岐で未割当変数を 1 つ決定し、同じ部分割当を無限に繰り返さない。変数数が \(n\) なら完全な割当は高々 \(2^n\) 個であり、探索木は有限。単位伝播も各変数を高々 1 回割り当てるので有限で停止する。

問題 22:DPLL の健全性

理論★★★

DPLL が SAT と返すとき、なぜ元の CNF は充足可能だと言えるか。

解答を見る

DPLL が SAT と返すのは、現在の部分割当がすべての節を満たす場合である。未割当変数があっても任意に拡張でき、すでに真になった節は偽に戻らない。したがって完全割当へ拡張したモデルが存在する。

問題 23:DPLL の完全性

理論★★★

DPLL が UNSAT と返すとき、なぜモデルが存在しないと言えるか。

解答を見る

DPLL は各決定変数について真枝と偽枝の両方を必要なら探索する。単位伝播は現在の部分割当に対して論理的に強制される値だけを加える。すべての枝が衝突で閉じたなら、すべての完全割当が少なくとも 1 つの節を偽にするため、モデルは存在しない。

問題 24:決定順序の影響

DPLL★★

決定順序が DPLL の正しさではなく性能に影響する理由を説明せよ。

解答を見る

どの順序でも完全な探索木を必要なら辿るため、正しさは変わらない。しかし早い段階で多くの単位伝播や衝突を生む変数を選ぶと枝刈りが増え、探索するノード数が大きく減る。

問題 25:backtracking の戻り先

DPLL★★

古典 DPLL の chronological backtracking は、衝突時にどこへ戻るか。

解答を見る

最後に行った未反転の決定まで戻り、その決定の反対値を試す。CDCL のように衝突解析から複数レベルを飛ぶわけではない。

問題 26:単位伝播はなぜ安全か

DPLL★★

単位節 \((\ell)\) が出たとき、\(\ell\) を真にしても解を失わない理由を説明せよ。

解答を見る

現在の部分割当を拡張する任意のモデルは、その単位節を満たす必要がある。節内の他リテラルはすでに偽なので、残った \(\ell\) が真でなければならない。したがって \(\ell\) の伝播は論理的に強制される。

5. CDCL・衝突解析・watched literals

問題 27:理由節を特定せよ

CDCL★★

節 \((\neg a\lor\neg b\lor c)\) の下で \(a=T,b=T\)。伝播されるリテラルと理由節は何か。

解答を見る

節は \((c)\) になるので \(c=T\) が伝播される。理由節は \((\neg a\lor\neg b\lor c)\)。含意グラフでは \(a,b\) から \(c\) へ辺が入る。

問題 28:resolution を 1 回行え

CDCL★★

\((x\lor A)\) と \((\neg x\lor B)\) の resolvent を書け。

解答を見る

\(x\) と \(\neg x\) を消して \((A\lor B)\)。CDCL の衝突解析は、この操作を衝突節と理由節の間で繰り返す。

問題 29:線形含意から学習節を導け

CDCL★★★

\((\neg a\lor b)\land(\neg b\lor c)\land(\neg c\lor d)\land(\neg d\lor\neg a)\) で \(a=T\) と決定し、衝突解析で学習節を求めよ。

解答を見る

\(a=T\Rightarrow b=T\Rightarrow c=T\Rightarrow d=T\)。衝突節は \((\neg d\lor\neg a)\)。reason(d)=\((\neg c\lor d)\) で resolve して \((\neg c\lor\neg a)\)。reason(c)=\((\neg b\lor c)\) で \((\neg b\lor\neg a)\)。reason(b)=\((\neg a\lor b)\) で \((\neg a)\)。学習節は \((\neg a)\)。

問題 30:backjump レベルを求めよ

CDCL★★

学習節 \(L=(\neg u@8\lor p@2\lor q@5\lor r@5)\) が得られた。現在レベルは 8。どこへ戻るか。

解答を見る

現在レベル 8 のリテラルを除いた決定レベル集合は \(\{2,5,5\}\)。最大は 5。したがって level 5 へ backjump する。戻った後、\(p,q,r\) が偽なら \(\neg u\) が単位伝播される。

問題 31:asserting clause の条件

1-UIP★★★

なぜ 1-UIP 学習節は backjump 後に単位節になりやすいのか。

解答を見る

1-UIP 節は現在の決定レベルのリテラルをちょうど 1 つだけ含む。backjump 先は、それ以外のリテラルの最大決定レベルである。したがって戻った時点で他のリテラルは既に偽として残り、現在レベル由来の 1 リテラルだけが未割当になるため単位節になる。

問題 32:1-UIP 終了条件

1-UIP★★★

衝突解析中、現在の決定レベルのリテラルが衝突節中に何個残ったら 1-UIP 節として停止するか。

解答を見る

1 個。現在レベルリテラルが 2 個以上ある間は、トレイル上で最も後ろの現在レベルリテラルをその理由節で resolve して消去する。

問題 33:レベル 0 衝突

CDCL★★

BCP を decision level 0 で実行中に衝突した。CDCL は何を返すか。

解答を見る

UNSAT。レベル 0 は仮定や決定を含まない基礎式そのものの論理帰結である。戻れる決定レベルがないので、元の CNF が矛盾している。

問題 34:restart は完全性を壊すか

CDCL★★

CDCL の restart は探索を最初に戻す。これは完全性を壊すか。

解答を見る

壊さない。restart は trail を消すが、原節と学習節は保持される。適切な分岐戦略と restart スケジュールの下で探索は継続され、学習節により同じ衝突原因を避ける。

問題 35:watch を移動できるか

watched literals★★

\(C=(a\lor b\lor c\lor d)\) が \(a,b\) を watch している。\(a=F,b=U,c=F,d=U\)。\(a\) が偽になったとき、どう処理するか。

解答を見る

watch されていない偽でないリテラル \(d=U\) があるので、watch を \(a\) から \(d\) へ移動できる。節は単位ではなく、伝播は起きない。

問題 36:watch から単位伝播

watched literals★★

\(C=(a\lor b\lor c)\) が \(b,c\) を watch している。\(a=F,b=F,c=U\)。\(b\) が偽になったとき何が起こるか。

解答を見る

watch を移動できる代替リテラルはない。もう一方の watch \(c\) は未割当なので、節は単位になり \(c=T\) を伝播する。

6. 実装・理論・設計判断

問題 37:watch list の参照先

実装★★

変数 \(x\) を真に割り当てた。どの watch list を走査するか。

解答を見る

偽になったリテラルは \(\neg x\) なので、\(watch[\neg x]\) を走査する。真になった \(x\) を watch している節は問題を起こさないため見る必要がない。

問題 38:VSIDS の目的

実装★★

VSIDS 系の活動度ヒューリスティックは何を狙っているか。

解答を見る

最近の衝突解析に関わった変数の活動度を上げ、次の決定で優先する。衝突の核心に近い変数を早く固定し、伝播や衝突を多く引き出すことが狙い。

問題 39:LBD を計算せよ

実装★★

学習節 \(C=(a@1\lor b@3\lor c@3\lor d@7\lor e@7)\) の LBD はいくつか。

解答を見る

出現する決定レベルは \(\{1,3,7\}\) なので LBD は 3。

問題 40:学習節を削除してもよい理由

実装★★★

CDCL は一部の学習節を削除する。なぜ正しさは保たれるか。

解答を見る

学習節は原式の論理帰結なので、追加しても解集合を変えない。削除すると枝刈り能力は減るが、原節が残っていれば元の問題を解く探索としては正しい。実装では理由節として trail 上で参照中の節などは不用意に削除しない。

問題 41:Tseitin 後のモデル復元

Tseitin★★

Tseitin 変換後の CNF が SAT で、補助変数を含むモデルが得られた。元の式のモデルはどう得るか。

解答を見る

補助変数を無視し、元変数への割当だけを取り出す。Tseitin 節は補助変数が部分式の値と整合するように作られているため、元変数への射影が元の式を満たす。

問題 42:SAT が NP-complete でも実用的に解ける理由

理論★★★

SAT は NP-complete だが、CDCL ソルバーが実用上多くの問題を解ける理由を述べよ。

解答を見る

NP-complete は最悪ケースの分類であり、実インスタンスが常に最悪とは限らない。CDCL は BCP、学習節、non-chronological backjump、restart、活動度ヒューリスティック、節削減によって問題構造を利用し、探索空間を大きく削る。

問題 43:CDCL と resolution 証明

理論★★★

UNSAT のとき、CDCL の学習過程はどのような証明体系と関係が深いか。

解答を見る

resolution と深い関係がある。衝突解析は衝突節と理由節の resolution 連鎖で学習節を導く。最終的に空節が導かれれば UNSAT 証明になる。

問題 44:DPLL と CDCL の決定的な違い

比較★★

DPLL と CDCL の最も重要な違いを 2 つ挙げよ。

解答を見る

第一に、CDCL は衝突から学習節を生成して節データベースに追加する。第二に、CDCL は学習節に基づいて non-chronological backjump を行う。実装上は watched literals、restart、VSIDS なども現代 CDCL の重要な要素である。

問題 45:assumption literal の用途

incremental SAT★★★

incremental SAT で assumption literal を使う利点を説明せよ。

解答を見る

基礎 CNF を保持したまま、一時的な仮定を追加して解ける。各呼び出し後に仮定は外せるので、節データベースや活動度、学習した情報を再利用しながら関連する複数問題を効率よく解ける。

7. 小テスト

選択肢を選んで「採点」を押す。全問、上の演習に対応している。

Q1. 節 \((x\lor y\lor z)\) で \(x=F,y=F,z=U\) の状態は?

Q2. \(z\leftrightarrow(a\land b)\) に必要な節はどれか。

Q3. 1-UIP 学習節に残る現在決定レベルのリテラル数は?

Q4. \(x=T\) にしたとき走査する watch list は?

Q5. 学習節 \((a@2\lor b@5\lor c@5\lor d@9)\) の LBD は?