2017-08-24 63 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

實現這一目標的最好方法是自己動手配方,即插入替代存在的新功能符號,並取決於範圍內的普遍性。這樣,您就可以控制這些函數的名稱,並且它們將在模型中進行函數解釋。 –