UNSAT Core(充足不能コア)とは、SAT(充当可能性問題)において、問題全体が「満たせない(UNSAT)」状態になっているときに、その矛盾を引き起こしている直接的な原因(節や制約)の最小限の集まりのことです。
- 節1:
x1である。 (1) - 節2:
x1ならばx2である。(\(\neg x1 \lor x2\)) - 節3:
x2は偽である。(\(\neg x2\)) - 節4:
x3またはx4である。(\(x3 \lor x4\))
x3 または x4)は、この矛盾に一切関係していないという点です。矛盾を発生させている真犯人は、【節1, 節2, 節3】の組み合わせだけです。
{節1, 節2, 節3} のセットを「UNSAT Core」と呼びます。- デバッグ・修正の効率化:
数百万行ある膨大な制約の中から、矛盾に関係している「数十行の制約」だけを絞り込めるため、どこを直せば仕様を満たせるのかがすぐに分かります。 - 不要なルールの特定:
システムの仕様同士が衝突している場所(設計ミス)をピンポイントで特定できます。
- MUS(Minimal Unsatisfiable Subscript / 最小充足不能部分集合)
- そのコアからどれか1つでも節を外すと、矛盾が消えて(SATに)なってしまうような、極限まで削ぎ落とされた原因のセット。
- 一般的な UNSAT Core
- ソルバーが探索の過程で見つけた「矛盾に関わった節の集まり」。MUSほど厳密に最小化されていない場合もありますが、実用上は十分に小さく絞り込まれています。
drat-trim は「一般的なUNSAT Core」を出力しますが、厳密な「MUS(最小充足不能部分集合)」を必ず出力するとは限りません。 [1]drat-trim が行う処理は Trimming(トリミング:削減) であり、正確には 「MUSに近いサイズまで大幅に削ぎ落としたUNSAT Core」 を出力するツール です。 [1, 2, 3, 4]drat-trim の内部の仕組み(なぜMUSにならないのか)- 判定: 矛盾の証明に「実際に使われた節」だけをマークする。
- 結果: 探索中に1度も使われなかった節はすべて排除される。 [1]
drat-trim を何度も回してMUSに近づけるアプローチ [1]