这个简单的例子为我生成了UNKNOWN,我想有些东西我对def的不了解。
from z3 import *
s = Solver()
def Min(b, r):
return If(b, r, 1)
a = Real('a')
b = Bool('b')
s.add(a==0.9)
s.add(a<=Min(b,0.9))
s.check()
print "Presenting result "
m = s.model()
print "traversing model..."
for d in m.decls():
print "%s = %s" % (d.name(), m[d])
答案 0 :(得分:3)
你没有犯任何错误。这是Z3求解器之一的问题。你的问题出现在称为“差异逻辑”的算术片段中。如果算术原子可以写成x - y <= k
,其中k
是数字,则此片段中存在问题。当此片段出现问题时,Z3将使用专门的解算器。但是,当输入问题还包含if-then-else术语(unknown
中的If
)时,此解算器可能会失败(返回Min
)。
The bug has been fixed,将在下一个版本中提供。在此期间,您可以尝试以下解决方法之一:
强制Z3在调用解算器之前消除if-then-else术语。您只需将s = Solver()
替换为s = Then('elim-term-ite', 'smt').solver()
即可。 Here is the modified script at rise4fun.
我们可以添加一个不在不同逻辑片段中的冗余断言。示例:z + w > 2
。 Here is the modified script at rise4fun.