2017-10-13 9 views
2

C++ライブラリとしてMiniSatを使用する場合、新しい変数はすべて、決定変数または非決定変数として作成できます。MiniSatの非決定変数の意味は何ですか?

私が大まかに理解しているところは、ソルバーが分岐の際に次にどの変数を使用するかを決めるときに、非決定変数は考慮されないということです。しかし、私のプロジェクトでは、式が実際にはUNSATだったにもかかわらず、ソルバーがSATを返したときに、非決定変数が含意の左側にあるときに同等の関係になるのではなく、問題に遭遇しました。

これは、非決定変数が2変数よりも長い式にある場合にのみ起こることを示しています(2変数式パスはソルバーに特殊なケースであるため、動作が異なります) 。

答えて

2

無決定変数の値は、推論によってのみ設定できます。 Minisatが使用する推論の唯一の方法はユニットルールです。したがって、すべての決定変数を設定しても、すべての非決定変数を設定するためにユニットルールが呼び出されない場合、後者の変数は決して設定されません。

非決定変数を持つ通常の理由は、決定変数の固定セットの設定が他のすべての変数の値を暗示するようにCNFインスタンスが構造化されていることです。

この例は、nビット整数の素因数を見つけるためのCNFインスタンスです。インスタンスは必ず乗算を実装するシフト加算回路のチェーンを実装しますが、乗算回路への入力である2(n-1)ビットを設定するだけで済みます。これらのビットを表す変数は決定変数になり、他のすべての変数は非決定変数として安全に宣言できます。

+0

CNFの充足可能性はどういう意味ですか?すなわち、すべての変数が決定変数としてマークされている場合、すべての句に真であると評価される少なくとも1つのリテラルがあれば、CNFはSATと言うことができます。私の簡単な実験では、非決定変数を持つCNFの場合、すべての決定変数が真または偽に設定され、すべての句が真であると評価されるリテラルまたはundefのいずれかを持つ場合、CNFはSATとして報告されます。本当? – Xarn

+0

すべての決定変数に値が正しく割り当てられている場合、MinisatはSATを報告します。それは他に何も気にしない。 Minisatがすべての決定変数に値を割り当てる方法が見つからない場合、ユニットルールの適用で常に変数が不足する前に競合が発生するため、UNSATが報告されます。矛盾は、現在の割り当てのために単調になっていた節を満たすために、変数が真と偽の両方である必要があったということです。 –

関連する問題