我使用Z3的Python API编写了一些脚本意外的结果。我认为我误解了一些过程或者仅仅使用了一些错误的命令。例如,假设我有以下脚本:
from z3 import *
x = Int('x')
def g(x):
if x == 0:
return 1
elif x > 0:
return x**(x+1)
s = Solver()
s.add(g(x) > x)
print s.check()
if s.check()== sat:
m = s.model()
m.evaluate(x, model_completion=True)
print m
这将返回以下输出:
sat
[x = 0]
没关系,但如果我将s.add(g(x) > x)
替换为s.add(x > 1, g(x) > x)
,则会返回unsat
。我期待的是:
sat
[x = 2]
有人能帮我理解发生了什么吗?
答案 0 :(得分:0)
我的Python技能略显不足,但我认为这个问题背后的关键概念是Python函数不会转换为Z3函数,例如,if x == 0: ...
不会创建一个Z3函数来检查{的所有可能值{1}}。最简单的方法是打印解算器,以便它显示约束条件,只需添加x
即可。在你不满意的情况下,我得到print s
,这确实是不可满足的。
答案 1 :(得分:0)
Python的if-then-else不会转换为Z3的if-then-else。您必须使用“If”功能。见这里:https://github.com/Z3Prover/z3/blob/master/src/api/python/z3.py#L1092