繁体   English   中英

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

[英]How to correctly use Solver() command in Python API of Z3 with declared function

使用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(x > 1, g(x) > x)代替s.add(g(x) > x) s.add(x > 1, g(x) > x) ,则返回unsat 我期待着这样的事情:

sat
[x = 2]

有人可以帮助我了解发生了什么吗?

我的Python技能还有些欠发达,但是我认为这个问题背后的关键概念是Python函数不会转换为Z3函数,例如, if x == 0: ...不会创建检查所有可能值的Z3函数。 x 最简单的检查方法是只打印求解器,这样它会告诉你的约束,只需添加print s 在您不满意的情况下,我得到[x > 1, x < 1] ,这的确是不满意的。

Python的if-then-else不会转换为Z3的if-then-else。 您必须使用“ If”功能。 看到这里: https : //github.com/Z3Prover/z3/blob/master/src/api/python/z3.py#L1092

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM