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

z3py可以通过读取模型添加新断言吗?,z3,z3py,Z3,Z3py,我们可以使用下面的代码来解决教程中的狗、猫、鼠标难题 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() 嗯,我

我们可以使用下面的代码来解决教程中的狗、猫、鼠标难题

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]))
但是,它们都不能工作。有人知道如何通过读取模型的名称和值来添加新断言吗?非常感谢。

中,对于m.decls()中的d:
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