0

次の作業例では、一致したモデルを取得しようとしています。この場合、2つの満足のいくモデルがあります。

 t1= cl7          t2= cl4      t3= cl5

 t1= cl4          t2= cl3      t3= cl9 

問題は、実行中のソルバーがタイムアウトするまで、一致したモデルを繰り返すことです。満足のいくモデルを繰り返さずに取得するにはどうすればよいですか。

どうもありがとう、

        S, (cl1, cl2, cl3, cl4, cl5, cl6, cl7,cl8,cl9) = EnumSort('S', ['cl1', 'cl2', 'cl3', 'cl4', 'cl5','cl6' ,'cl7', 'cl8', 'cl9'])



       s = Solver()

       x = Const('x', S)
      def fun1(x):
        return Or(x == cl1, x == cl2, x == cl3, x == cl4, x == cl5, x == cl6, x == cl7, x == cl8, x == cl9)


       y1, y2 = Consts('y1 y2', S)
      def fun2(y1, y2):
          return Or(And(y1 == cl7, y2 == cl4), And(y1 == cl4, y2 == cl3), And(y1 == cl3, y2 == cl2),And(y1 == cl8, y2 == cl9))


      q1,q2 = Consts('q1 q2', S)
      def fun3(q1,q2):
        return Or(And(q1 == cl7, q2 == cl5), And(q1 == cl4, q2 == cl9))



 t1, t2 ,t3 = Consts('t1 t2 t3', S)

 s.add(fun1(t1))
 s.add(fun2(t1,t2))
 s.add(fun3(t1,t3))


while s.check() == sat:
s.add(Or(t1 != s.model()[t1], t2 != s.model()[t2],t3 != s.model()[t2]))
print s.model()
4

1 に答える 1

2

同じモデルが新しい充足可能性チェックで再び使用されないようにする部分に小さなタイプミスがあるようです。特に、最後から2番目の行でt3 != s.model()[t3]の代わりに使用する必要がありt3 != s.model()[t2]ます。

これは、最初に配置した2つのモデルを生成する更新された例です(z3pyリンク:http ://rise4fun.com/Z3Py/AxJv ):

S, (cl1, cl2, cl3, cl4, cl5, cl6, cl7,cl8,cl9) = EnumSort('S', ['cl1', 'cl2', 'cl3', 'cl4', 'cl5','cl6' ,'cl7', 'cl8', 'cl9'])

s = Solver()

x = Const('x', S)
def fun1(x):
  return Or(x == cl1, x == cl2, x == cl3, x == cl4, x == cl5, x == cl6, x == cl7, x == cl8, x == cl9)

y1, y2 = Consts('y1 y2', S)
def fun2(y1, y2):
  return Or(And(y1 == cl7, y2 == cl4), And(y1 == cl4, y2 == cl3), And(y1 == cl3, y2 == cl2),And(y1 == cl8, y2 == cl9))

q1,q2 = Consts('q1 q2', S)
def fun3(q1,q2):
  return Or(And(q1 == cl7, q2 == cl5), And(q1 == cl4, q2 == cl9))

t1, t2 ,t3 = Consts('t1 t2 t3', S)

s.add(fun1(t1))
s.add(fun2(t1,t2))
s.add(fun3(t1,t3))

while s.check() == sat:
  s.add(Or(t1 != s.model()[t1], t2 != s.model()[t2], t3 != s.model()[t3]))
  print s.model()
于 2013-03-10T15:20:06.857 に答える