如何在声明函数的Z3的Python API中正确使用Solver()命令

时间:2015-10-14 12:28:50

标签: python z3

我使用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]

有人能帮我理解发生了什么吗?

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