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