In the following working example , How to retrieve the matched model?
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)
For Example: as the following solver
s = Solver()
x1 = Const('x1', S)
x2 = Const('x2', S)
s.add(fun(x1,x2))
print s.check()
print s.model()
I'm assuming that you want the value of x1
and x2
in the model produced by Z3. If that is the case, you can retrieve them using:
m = s.model()
print m[x1]
print m[x2]
Here is the complete example (also available online here). BTW, note that we don't need 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]
来源:https://stackoverflow.com/questions/15665235/retrieve-the-matched-model-in-z3py