有人可以解释为什么我得到这个py代码的反例。
a = Int('a')
def X(a):
if (a == 3):
return 1
else:
return 2
z3.prove( X(a) == If (a == 3, 1, 2) )
反 [a = 3]
答案 0 :(得分:3)
您的功能' X'将永远返回' 2'对于所有符号变量。那就是:
from z3 import *
a = Int('a')
def X(a):
if (a == 3):
return 1
else:
return 2
print X(a)
将始终打印:
2
这正是Z3提供If
功能的原因。 Python'如果'不适用于符号值,测试只需要else
分支。
我称之为Z3的Python接口的弱点,因为它的输入真的很弱。理想情况下,该程序应该被拒绝,因为非法使用if-then-else,但Python不是一种足够强类型的语言,可以为您提供这种安全级别。从其他语言绑定到Z3将拒绝在编译时类型不正确的等效表达式。
答案 1 :(得分:2)
X(.)
是Python函数,不是逻辑函数或Z3函数。在被调用时进行评估。这意味着
X(a)
的值
z3.prove( X(a) == If (a == 3, 1, 2) )
在调用2
之前确定为z3.prove
,因为a
是Int('a')
(而不是3
)。在这种特殊情况下,只需打印Z3表达式即可轻松调试此类问题。
print( X(a) == If (a == 3, 1, 2) )
报告
If(a == 3, 1, 2) == 2