在Z3py中检索匹配的模型?

时间:2013-03-27 17:18:05

标签: z3 smt constraint-programming

在以下工作示例中,如何检索匹配的模型?

     S,   (cl_3,cl_39,cl_11, me_32,m_59,m_81) = 
     EnumSort('S', ['cl_3','cl_39','cl_11','me_32','me_59','me_81'])

       h1, h2 = Consts('h1 h2', S)
       def fun(h1 , h2):

        conds = [
        (cl_3, me_32),
        (cl_39, me_59),
        (cl_11, me_81),
         # ...
             ]

    and_conds = (And(h1==a, h2==b) for a,b in conds)
     return Or(*and_conds)

例如: 作为以下解算器

  s = Solver()
  x1 = Const('x1', S)
  x2 = Const('x2', S)
  s.add(fun(x1,x2)) 

  print s.check()
  print s.model()

1 个答案:

答案 0 :(得分:1)

我假设你想要Z3生成的模型中x1x2的值。如果是这种情况,您可以使用以下方法检索它们:

   m = s.model()
   print m[x1]
   print m[x2]

以下是完整的示例(也可在线获取here)。顺便说一句,请注意我们不需要h1, h2 = Consts('h1 h2', S)

S, (cl_3, cl_39, cl_11, me_32, me_59, me_81) = 
      EnumSort('S', ['cl_3','cl_39','cl_11','me_32','me_59','me_81'])
def fun(h1 , h2):
   conds = [
     (cl_3, me_32),
     (cl_39, me_59),
     (cl_11, me_81),
   ]
   and_conds = (And(h1==a, h2==b) for a,b in conds)
   return Or(*and_conds)

s = Solver()
x1 = Const('x1', S)
x2 = Const('x2', S)
s.add(fun(x1,x2)) 
print s.check()
m = s.model()
print m
print m[x1]
print m[x2]