2017-08-24 44 views
0

这个脚本z3py:存在量词

from z3 import * 
solver = z3.Solver() 
x = Int('x') 
def f(y): 
    return y+y 
solver.add(x >= 0, x < 10, Exists(x, f(x) == 4)) 
print solver.check() 
print solver.model() 

的用法给我

sat 
[x = 0] 

作为一个答案。这不是我想要或期望的。作为一个答案,我想看看

sat 
[x = 2] 

我发现了另外两个职位相似的方向((Z3Py) declaring functionQuantifier in Z3)去的事,但不奏效。

在这种情况下,你如何使用存在的量词来获得充分的答案?

回答

1

存在与不同的x绑定,其范围仅限于公式的主体。因此,您的约束实际上是(0≤x < 10)∧(∃x'。f(x')== 4)。这两个连词都满足一个模型,其中x = 0;特别是在该模型中满足第二个合并因为x'可能是。

看来,你想进一步约束x,不仅仅是不平等。试试以下(未经测试)

solver.add(x >= 0, x < 10, f(x) == 4) 

然后打印模型。

+0

太好了。那么我的第一个问题就是'存在'的范围。我将断言修改为'solver.add(Exists(x,And(f(x)== 4,x> = 0,x <10)))',SMT解算器现在返回一个'sat'或'取决于我的输入正确。尽管如此,我还是无法让求解者给我一个满足断言的'x'暗示。你怎么能这样做?你上面提到的解决方案是正确的,因为它可以做你说的,但是我想在另一个上下文中使用量词(模型检查)并且需要结果。 –

+1

实现这一目标的最好方法是自己动手配方,即插入替代存在的新功能符号,并取决于范围内的普遍性。这样,您就可以控制这些函数的名称,并且它们将在模型中进行函数解释。 –