あなたが説明したSATソルバーを使用して、SAT問題のすべての解決策を見つける方法は間違いありませんが、最も効率的な方法ではないかもしれません。
ソルバーを使用して元の問題の解を見つけ、見つかったばかりの解を除外するだけの句を追加したり、ソルバーを使用して新しい問題の解決策を見つけるなどしてください。満足できない問題が生じるまで続けてください。例えば
、あなたが(X or Y) and (X or Z)
を満足するとします。真X
、Y
とZ
任意で
4:5つのソリューションがあります。
X
が1であり、Y
およびZ
が真です。
ソルバーを実行して、解答(X, Y, Z) = (T, F, F)
が得られたとしましょう。あなたはこの制約は、句ので
(not X) or Y or Z
今あなたがあなたのソルバーを実行できるように書き換えることができ制約
not (X and (not Y) and (not Z))
と---このソリューション---とだけこのソリューションを排除することができます新しい問題
(X or Y) and (X or Z) and ((not X) or Y or Z)
などです。
私が言ったように、これはあなたがしたいことをする方法ですが、おそらく最も効率的な方法ではありません。 SATソルバーが解決策を探しているとき、問題について多くのことを学んでいますが、すべての情報が返されるわけではありません。ソルバを再度実行すると、捨てられたすべての情報を再学習する必要があります。
くださいdownvoted人は理由を説明することはできますか?このブログのエントリー(http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)を読んだ後、私はここで「単にOK "と答えたが、"明示的に奨励した。 – Vectornaut
これは大丈夫です。良い答え、btw。 –