【问题标题】:(Z3Py) any limitations in functions declaring?(Z3Py) 函数声明有什么限制吗?
【发布时间】:2012-08-10 16:23:07
【问题描述】:

函数声明有什么限制吗?

比如这段代码返回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()

Z3Py 如何解释声明的函数?它只是偶尔调用它还是这里也有一些隐藏的机器?

【问题讨论】:

    标签: python z3


    【解决方案1】:

    在函数调用one_op(unk_op, arg1, arg2)中,unk_op是一个Z3表达式。那么op==1op==2等表达式(在one_op的定义中)也是Z3符号表达式。因为op==1 不是Python 布尔表达式False。函数one_op 将始终返回Z3 表达式arg1*arg2。我们可以通过执行print one_op(unk_op, arg1, arg2) 来检查。注意one_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()
    

    结果是:

    sat
    [unk_op = 3, result = 3, arg2 = 2, arg1 = 1]
    

    【讨论】:

    • 啊,所以函数应该返回Z3表达式,就像一个表达式构造函数!
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多