これを実現する 1 つの方法は、API の 1 つとモデル生成機能を使用することです。次に、1 つの充足可能性チェックから生成されたモデルを使用して制約を追加し、満足のいく代入がなくなるまで、以前のモデル値が後続の充足可能性チェックで使用されないようにすることができます。もちろん、有限ソートを使用する必要があります (またはこれを保証するいくつかの制約があります) が、可能なモデルをすべて見つけたくない場合 (つまり、大量のモデルを生成した後に停止する場合) は、無限ソートでも使用できます。 .
以下は z3py を使用した例です (z3py スクリプトへのリンク: http://rise4fun.com/Z3Py/a6MC ):
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
一般に、関連するすべての定数の論理和を使用すると機能するはずです (たとえば、a
and b
here)。これは、を満たす( と の間の)a
とのすべての整数代入を列挙します。たとえば、andを制限し、代わりにandの間に配置すると、出力は次のようになります。b
1
20
a >= 2b
a
b
1
5
[b = 1, a = 2]
[b = 2, a = 4]
[b = 1, a = 3]
[b = 2, a = 5]
[b = 1, a = 4]
[b = 1, a = 5]