发现的模型中未显示新变量
fresh variables are not shown in found models
我正在使用 z3 编写静态检查器。我有以下问题:
>>> from z3 import *
>>> s = Solver()
>>> s.add(FreshInt() + FreshInt() > 0)
>>> s.check()
sat
>>> s.model()
[]
如您所见,模型中未显示新变量。我也无法得到他们的价值:
>>> a = FreshInt()
>>> s.add(a > 3)
>>> s.check()
sat
>>> s.model()
[]
>>> s.model()[a]
我查看了文档,但找不到更改此行为的方法。我可以自己生成独特的变量,但如果 z3 可以为我处理这个就好了。有人能指出我正确的方向吗?或者不能在 z3py 中更改它?
您可以通过以下方式规避此限制:
freshIntIdx = 0
def myFreshInt():
global freshIntIdx
freshIntIdx += 1;
return Int('fi' + str(freshIntIdx))
a = myFreshInt()
b = myFreshInt()
s = Solver()
s.add(a + b > 5, a > 0, b > 0, a + b < 10)
print(s.check())
m = s.model()
print("a = %s" % m[a])
print("b = %s" % m[b])
FreshInt
/FreshReal
等用于创建用户不可见的内部变量。您应该改为使用 Int('name')
和 Real('name')
来创建将在模型中显示的用户级变量。
如果你真的想看到这个值,你可以添加一个observer
函数并像这样使用它:
from z3 import *
def observeInt(s, a):
obs = Int('observer')
s.add(obs == a)
# might want to check the following really returns sat!
s.check()
print s.model()[obs]
s = Solver()
a = FreshInt()
s.add(a + FreshInt() > 0)
s.add(a > 12)
print s.check()
observeInt(s, a)
这会打印:
sat
13
这显然不便宜(因为它涉及对 check
的调用),但它是安全的,只要它在调试情况下用于强臂 z3,就像你说的那样,它应该可以诀窍。
我正在使用 z3 编写静态检查器。我有以下问题:
>>> from z3 import *
>>> s = Solver()
>>> s.add(FreshInt() + FreshInt() > 0)
>>> s.check()
sat
>>> s.model()
[]
如您所见,模型中未显示新变量。我也无法得到他们的价值:
>>> a = FreshInt()
>>> s.add(a > 3)
>>> s.check()
sat
>>> s.model()
[]
>>> s.model()[a]
我查看了文档,但找不到更改此行为的方法。我可以自己生成独特的变量,但如果 z3 可以为我处理这个就好了。有人能指出我正确的方向吗?或者不能在 z3py 中更改它?
您可以通过以下方式规避此限制:
freshIntIdx = 0
def myFreshInt():
global freshIntIdx
freshIntIdx += 1;
return Int('fi' + str(freshIntIdx))
a = myFreshInt()
b = myFreshInt()
s = Solver()
s.add(a + b > 5, a > 0, b > 0, a + b < 10)
print(s.check())
m = s.model()
print("a = %s" % m[a])
print("b = %s" % m[b])
FreshInt
/FreshReal
等用于创建用户不可见的内部变量。您应该改为使用 Int('name')
和 Real('name')
来创建将在模型中显示的用户级变量。
如果你真的想看到这个值,你可以添加一个observer
函数并像这样使用它:
from z3 import *
def observeInt(s, a):
obs = Int('observer')
s.add(obs == a)
# might want to check the following really returns sat!
s.check()
print s.model()[obs]
s = Solver()
a = FreshInt()
s.add(a + FreshInt() > 0)
s.add(a > 12)
print s.check()
observeInt(s, a)
这会打印:
sat
13
这显然不便宜(因为它涉及对 check
的调用),但它是安全的,只要它在调试情况下用于强臂 z3,就像你说的那样,它应该可以诀窍。