Python (Z3Py)函数声明有任何限制吗?

Python (Z3Py)函数声明有任何限制吗?,python,z3,Python,Z3,函数声明是否有任何限制 例如,这段代码返回unsat 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, re

函数声明是否有任何限制

例如,这段代码返回unsat

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()
从z3导入*
def one_op(op,arg1,arg2):
如果op==1:
返回arg1*arg2
如果op==2:
返回arg1-arg2
如果op==3:
返回arg1+arg2
返回arg1+arg2#默认值
s=解算器()
arg1,arg2,result,unk_op=Ints('arg1 arg2 result unk_op'))

s、 add(unk_op>=1,unk_op在函数调用中
one_op(unk_op,arg1,arg2)
unk_op
是一个Z3表达式。然后,表达式如
op==1
op==2
(在
one_op
的定义中)也是Z3符号表达式。因为
op==1
不是Python布尔表达式
False
。函数
one\u op
将始终返回Z3表达式
arg1*arg2
。我们可以通过执行
打印one\u op(unk\u op,arg1,arg2)来检查这一点
。请注意
one\u op
定义中的
if
语句是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()

啊,所以函数应该返回Z3表达式,它就像一个表达式构造函数!
sat
[unk_op = 3, result = 3, arg2 = 2, arg1 = 1]