問題 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\) を伝播する。
DPLL と CDCL は、読んだだけでは定着しにくい。ここでは、節の評価、CNF 符号化、Tseitin 変換、DPLL トレース、CDCL 衝突解析、watched literals、実装上の判断まで、解答付きの演習としてまとめる。
各問題を自分で解いてから「解答を見る」を開く。解けた問題はチェックボックスを入れると進捗が更新される。最後に小テストで、定義ではなく判断が身についているかを確認する。
| 概念 | 判定基準 | 演習での使い方 |
|---|---|---|
| 単位節 | 偽でないリテラルが未割当 1 個だけ | BCP の発火条件 |
| 衝突 | ある節の全リテラルが偽 | DPLL では backtrack、CDCL では analyze |
| 理由節 | 伝播リテラルを強制した節 | 含意グラフの辺ラベル |
| 1-UIP 節 | 現在レベルのリテラルが 1 個だけ | backjump 後に asserting になる |
| watch 更新 | 偽になった watch を別の偽でないリテラルへ動かす | 動かせなければ単位または衝突 |
\(C=(x\lor\neg y\lor z)\)、割当 \(x=F,y=T,z=U\)。節は真、偽、単位、未決定のどれか。
単位。\(x=F\)、\(\neg y=F\)、\(z=U\) なので、偽でないリテラルが \(z\) だけ残る。BCP は \(z=T\) を伝播する。
空 CNF \(\bigwedge_{C\in\varnothing}C\) と、空節 \(()\) を含む CNF は、それぞれ SAT/UNSAT のどちらか。
空 CNF は真なので SAT。空節は偽なので、それを含む CNF は UNSAT。AND の単位元は真、OR の単位元は偽である。
\(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\) で真。
\(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\)。衝突はない。
\((p\lor q)\land(p\lor\neg r)\land(q\lor r)\) で純リテラルを挙げよ。
\(p\) は正でしか現れないので純リテラル。\(q\) も正でしか現れないので純リテラル。\(r\) は \(\neg r\) と \(r\) の両方が出るため純ではない。
\((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。
\((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)\)。
\(C=(\neg a\lor b\lor\neg c)\)、\(a=T,b=F,c=T\)。節の状態は何か。
\(\neg a=F\)、\(b=F\)、\(\neg c=F\)。全リテラルが偽なので節は空になり、衝突である。
\(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)\)。
\(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)\)。
\(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)\)。
\(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。
頂点 \(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})\)。
\(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 になる。
Tseitin 変換は元の式と「同値」か「同充足」か。理由も述べよ。
基本的には同充足。補助変数を導入するため、同じ変数集合上の完全な同値式ではない。ただし、補助変数を存在量化して元変数へ射影すれば、元の式と対応する。
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)\)。
\(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\)。
\((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。
\(F=(x\lor y)\land(x\lor\neg z)\land(y\lor z)\)。純リテラル規則だけで簡約せよ。
\(x\) と \(y\) は正でしか現れない。\(x=T\) と置くと前 2 節が満たされる。さらに \(y=T\) と置くと第 3 節も満たされる。したがって SAT。
\(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)\)。
有限個の変数を持つ CNF に対して、DPLL が停止する理由を述べよ。
各分岐で未割当変数を 1 つ決定し、同じ部分割当を無限に繰り返さない。変数数が \(n\) なら完全な割当は高々 \(2^n\) 個であり、探索木は有限。単位伝播も各変数を高々 1 回割り当てるので有限で停止する。
DPLL が SAT と返すとき、なぜ元の CNF は充足可能だと言えるか。
DPLL が SAT と返すのは、現在の部分割当がすべての節を満たす場合である。未割当変数があっても任意に拡張でき、すでに真になった節は偽に戻らない。したがって完全割当へ拡張したモデルが存在する。
DPLL が UNSAT と返すとき、なぜモデルが存在しないと言えるか。
DPLL は各決定変数について真枝と偽枝の両方を必要なら探索する。単位伝播は現在の部分割当に対して論理的に強制される値だけを加える。すべての枝が衝突で閉じたなら、すべての完全割当が少なくとも 1 つの節を偽にするため、モデルは存在しない。
決定順序が DPLL の正しさではなく性能に影響する理由を説明せよ。
どの順序でも完全な探索木を必要なら辿るため、正しさは変わらない。しかし早い段階で多くの単位伝播や衝突を生む変数を選ぶと枝刈りが増え、探索するノード数が大きく減る。
古典 DPLL の chronological backtracking は、衝突時にどこへ戻るか。
最後に行った未反転の決定まで戻り、その決定の反対値を試す。CDCL のように衝突解析から複数レベルを飛ぶわけではない。
単位節 \((\ell)\) が出たとき、\(\ell\) を真にしても解を失わない理由を説明せよ。
現在の部分割当を拡張する任意のモデルは、その単位節を満たす必要がある。節内の他リテラルはすでに偽なので、残った \(\ell\) が真でなければならない。したがって \(\ell\) の伝播は論理的に強制される。
節 \((\neg a\lor\neg b\lor c)\) の下で \(a=T,b=T\)。伝播されるリテラルと理由節は何か。
節は \((c)\) になるので \(c=T\) が伝播される。理由節は \((\neg a\lor\neg b\lor c)\)。含意グラフでは \(a,b\) から \(c\) へ辺が入る。
\((x\lor A)\) と \((\neg x\lor B)\) の resolvent を書け。
\(x\) と \(\neg x\) を消して \((A\lor B)\)。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)\)。
学習節 \(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\) が単位伝播される。
なぜ 1-UIP 学習節は backjump 後に単位節になりやすいのか。
1-UIP 節は現在の決定レベルのリテラルをちょうど 1 つだけ含む。backjump 先は、それ以外のリテラルの最大決定レベルである。したがって戻った時点で他のリテラルは既に偽として残り、現在レベル由来の 1 リテラルだけが未割当になるため単位節になる。
衝突解析中、現在の決定レベルのリテラルが衝突節中に何個残ったら 1-UIP 節として停止するか。
1 個。現在レベルリテラルが 2 個以上ある間は、トレイル上で最も後ろの現在レベルリテラルをその理由節で resolve して消去する。
BCP を decision level 0 で実行中に衝突した。CDCL は何を返すか。
UNSAT。レベル 0 は仮定や決定を含まない基礎式そのものの論理帰結である。戻れる決定レベルがないので、元の CNF が矛盾している。
CDCL の restart は探索を最初に戻す。これは完全性を壊すか。
壊さない。restart は trail を消すが、原節と学習節は保持される。適切な分岐戦略と restart スケジュールの下で探索は継続され、学習節により同じ衝突原因を避ける。
\(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\) へ移動できる。節は単位ではなく、伝播は起きない。
\(C=(a\lor b\lor c)\) が \(b,c\) を watch している。\(a=F,b=F,c=U\)。\(b\) が偽になったとき何が起こるか。
watch を移動できる代替リテラルはない。もう一方の watch \(c\) は未割当なので、節は単位になり \(c=T\) を伝播する。
変数 \(x\) を真に割り当てた。どの watch list を走査するか。
偽になったリテラルは \(\neg x\) なので、\(watch[\neg x]\) を走査する。真になった \(x\) を watch している節は問題を起こさないため見る必要がない。
VSIDS 系の活動度ヒューリスティックは何を狙っているか。
最近の衝突解析に関わった変数の活動度を上げ、次の決定で優先する。衝突の核心に近い変数を早く固定し、伝播や衝突を多く引き出すことが狙い。
学習節 \(C=(a@1\lor b@3\lor c@3\lor d@7\lor e@7)\) の LBD はいくつか。
出現する決定レベルは \(\{1,3,7\}\) なので LBD は 3。
CDCL は一部の学習節を削除する。なぜ正しさは保たれるか。
学習節は原式の論理帰結なので、追加しても解集合を変えない。削除すると枝刈り能力は減るが、原節が残っていれば元の問題を解く探索としては正しい。実装では理由節として trail 上で参照中の節などは不用意に削除しない。
Tseitin 変換後の CNF が SAT で、補助変数を含むモデルが得られた。元の式のモデルはどう得るか。
補助変数を無視し、元変数への割当だけを取り出す。Tseitin 節は補助変数が部分式の値と整合するように作られているため、元変数への射影が元の式を満たす。
SAT は NP-complete だが、CDCL ソルバーが実用上多くの問題を解ける理由を述べよ。
NP-complete は最悪ケースの分類であり、実インスタンスが常に最悪とは限らない。CDCL は BCP、学習節、non-chronological backjump、restart、活動度ヒューリスティック、節削減によって問題構造を利用し、探索空間を大きく削る。
UNSAT のとき、CDCL の学習過程はどのような証明体系と関係が深いか。
resolution と深い関係がある。衝突解析は衝突節と理由節の resolution 連鎖で学習節を導く。最終的に空節が導かれれば UNSAT 証明になる。
DPLL と CDCL の最も重要な違いを 2 つ挙げよ。
第一に、CDCL は衝突から学習節を生成して節データベースに追加する。第二に、CDCL は学習節に基づいて non-chronological backjump を行う。実装上は watched literals、restart、VSIDS なども現代 CDCL の重要な要素である。
incremental SAT で assumption literal を使う利点を説明せよ。
基礎 CNF を保持したまま、一時的な仮定を追加して解ける。各呼び出し後に仮定は外せるので、節データベースや活動度、学習した情報を再利用しながら関連する複数問題を効率よく解ける。
選択肢を選んで「採点」を押す。全問、上の演習に対応している。
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 は?