需要帮助来理解反例

时间:2018-02-22 17:36:44

标签: z3 z3py

有人可以解释为什么我得到这个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]

2 个答案:

答案 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,因为aInt('a')(而不是3)。在这种特殊情况下,只需打印Z3表达式即可轻松调试此类问题。

print( X(a) == If (a == 3, 1, 2) )

报告

If(a == 3, 1, 2) == 2