函数声明是否有任何限制?
例如,这段代码返回不满。
from z3 import *
def one_op (op, arg1, arg2):
if op==1:
return arg1*arg2
if op==2:
return arg1-arg2
if op==3:
return arg1+arg2
return arg1+arg2 # default
s=Solver()
arg1, arg2, result, unk_op=Ints ('arg1 arg2 result unk_op')
s.add (unk_op>=1, unk_op<=3)
s.add (arg1==1)
s.add (arg2==2)
s.add (result==3)
s.add (one_op(unk_op, arg1, arg2)==result)
print s.check()
Z3Py如何解释声明的函数?它只是在某些时候调用它还是一些隐藏的机器?
答案 0 :(得分:4)
在函数调用one_op(unk_op, arg1, arg2)
中,unk_op
是Z3表达式。然后,诸如op==1
和op==2
之类的表达式(在one_op
的定义中)也是Z3符号表达式。由于op==1
不是Python布尔表达式False
。函数one_op
将始终返回Z3表达式arg1*arg2
。我们可以通过执行print one_op(unk_op, arg1, arg2)
来检查。请注意,if
定义中的one_op
语句是Python语句。
我相信你的真实意图是返回一个包含条件表达式的Z3表达式。您可以通过将one_op
定义为:
def one_op (op, arg1, arg2):
return If(op==1,
arg1*arg2,
If(op==2,
arg1-arg2,
If(op==3,
arg1+arg2,
arg1+arg2)))
现在,命令If
构建了一个Z3条件表达式。通过使用这个定义,我们可以找到令人满意的解决方案。这是完整的例子:
from z3 import *
def one_op (op, arg1, arg2):
return If(op==1,
arg1*arg2,
If(op==2,
arg1-arg2,
If(op==3,
arg1+arg2,
arg1+arg2)))
s=Solver()
arg1, arg2, result, unk_op=Ints ('arg1 arg2 result unk_op')
s.add (unk_op>=1, unk_op<=3)
s.add (arg1==1)
s.add (arg2==2)
s.add (result==3)
s.add (one_op(unk_op, arg1, arg2)==result)
print s.check()
print s.model()
结果是:
sat
[unk_op = 3, result = 3, arg2 = 2, arg1 = 1]