2012-11-15 15 views
18

私は、Microsoft Researchによって開発されたSMTソルバーであるZ3を使って、一次理論のすべての可能なモデルを検索しようとしています。 f->truef->false 2つの満足の割り当てがある。この命題場合Z3:すべての満足できるモデルを見つける

(declare-const f Bool) 
(assert (or (= f true) (= f false))) 

:ここで最小実施例です。 Z3(とSMTソルバーは一般的に)モデルを満たすものを見つけることのみを試みるため、すべての解を見つけることは直接的に不可能です。 Here(next-sat)という便利なコマンドが見つかりましたが、Z3の最新バージョンはこれをサポートしていないようです。これは私にとって少し不幸なことですが、一般的にはこのコマンドは非常に便利だと思います。これを行う別の方法がありますか?

答えて

18

これを達成する1つの方法は、モデル生成機能とともにAPIの1つを使用することです。その後、1つの充足可能性チェックから生成されたモデルを使用して、満足のいく割り当てがなくなるまで、後続の充足可能性検査で以前のモデル値が使用されないように制約を追加できます。もちろん、有限のソートを使用する必要があります(またはこれを保証するいくつかの制約があります)が、可能なすべてのモデルを見つけたくない場合(つまり束を生成した後で停止する場合) 。一般に

a = Int('a') 
b = Int('b') 

s = Solver() 
s.add(1 <= a) 
s.add(a <= 20) 
s.add(1 <= b) 
s.add(b <= 20) 
s.add(a >= 2*b) 

while s.check() == sat: 
    print s.model() 
    s.add(Or(a != s.model()[a], b != s.model()[b])) # prevent next model from using the same assignment as a previous model 

、関連するすべての定数の論理和を使用して(ここでは例えば、ab)が動作する必要があり:ここ

はz3pyを用いた例(:http://rise4fun.com/Z3Py/a6MC z3pyスクリプトへのリンク)です。これは、a >= 2bを満たすab120の間)のすべての整数の割り当てを列挙します。私たちが代わりに15の間に位置するabを制限した場合、出力は次のようになります。また、

[b = 1, a = 2] 
[b = 2, a = 4] 
[b = 1, a = 3] 
[b = 2, a = 5] 
[b = 1, a = 4] 
[b = 1, a = 5] 
+0

、この回答を参照してください。http://stackoverflow.com/questions/11867611/z3py-checking-allを-solutions-for-equation – Taylor

+4

Z3は、そのような検索のために中断したところでピックアップするという意味でステートフルですか?終わりを除いて(直感的に)すべての仕事がまったく同じになるたびに、始めるのは無駄でしょう。 – GManNickG

+1

@ GManNickGこのメソッドを使った例では、最初のモデルよりも速い次のいくつかのモデルを見つけることが実際にステートフルなようです。 58モデルの特定のケースの実行時間のミリ秒単位のリストを次に示します。 '8942 801 1663 5 599 320 450 2 2 3 1 5 1377 36 5 738 162 105 1639 3 5 16 2041 27 475 953 562 746 45 151 18 4206 3416 9 850 120 3 4 12 615 593 1219 449 154 987 3 10 1365 16 438 792 1686 743 46 5 8 412 126'。 最初のものが間違いなく最も長いことに注意してください。他のものはランダムです(おそらく問題とソルバーがどれほど幸運なのかによって決まります)。 –

関連する問題