z3py可以通过阅读模型添加新的断言吗?

时间:2016-03-04 01:11:36

标签: z3 z3py

我们可以使用以下代码来解决教程中的Dog,Cat,Mouse难题。

dog, cat, mouse = Ints('dog cat mouse')

s = Solver();
s.add(dog>=1)
s.add(cat>=1)
s.add(mouse>=1)
s.add(dog+cat+mouse==100)
s.add(1500 * dog + 100 * cat + 25 * mouse == 10000)

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

嗯,我知道我可以使用

m=s.model
for d in m.decls():
    print  "%s = %s" % (d.name(), m[d])

获取变量的名称和值。例如,cat = 41.我想知道我可以从名称和值中创建一个新的断言,例如cat!= 41.我用了

s.add(d.name != m[d]) 
s.add("%s != %s" % (d.name(), m[d]))

但是,它们都不能奏效。任何人都知道如何通过读取模型的名称和值来添加新的断言?非常感谢。

1 个答案:

答案 0 :(得分:0)

for d in m.decls():中,d是一个func_decl,即只是一个声明,而不是变量(常量函数),所以我们需要将它应用于它的参数,这里的参数是空的。因此我们可以这样做:

m = s.model()
for d in m.decls():
    v = d() # <-- Note parenthesis ()
    print("%s != %s" % (v, m[d]))
    s.add(v != m[d])

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

获取

...
cat != 41
mouse != 56
dog != 3
[dog >= 1,
 cat >= 1,
 mouse >= 1,
 dog + cat + mouse == 100,
 1500*dog + 100*cat + 25*mouse == 10000,
 41 != cat,
 56 != mouse,
 3 != dog]
unsat

获取