使用 Z3Py 声明未解释的多元函数
Declaring uninterpreted polyadic functions with Z3Py
我正在尝试使用 Z3Py 编写一个函数 decl_func(fname, arity)
,它接受两个参数:fname
,要声明的函数的名称,以及 arity
,它的参数的数量,以及 returns 相应的(未解释的)整数 Z3 函数。问题是无法预先确定arity
的值,所以函数体不能
return Function(fname, IntSort(), IntSort())
或
return Function(fname, IntSort(), IntSort(), IntSort())
一元函数或二元函数。这是我考虑过的一种粗略的解决方法:
exec('f = Function(\'%s\', %s)' % (fname, ('IntSort(), ' * arity + 'IntSort()')))
return f
但这不起作用,似乎是由于 exec
处理变量声明的方式(如果相关,我正在使用 Python 3)。
有什么想法吗?
这个问题是关于variadic functions in Python。
You can use the same "*" syntax to apply the function to an existing list of arguments:
因此,像这样的东西应该工作:
sorts = [IntSort(), IntSort(), IntSort()]
return Function(fname, *sorts)
我正在尝试使用 Z3Py 编写一个函数 decl_func(fname, arity)
,它接受两个参数:fname
,要声明的函数的名称,以及 arity
,它的参数的数量,以及 returns 相应的(未解释的)整数 Z3 函数。问题是无法预先确定arity
的值,所以函数体不能
return Function(fname, IntSort(), IntSort())
或
return Function(fname, IntSort(), IntSort(), IntSort())
一元函数或二元函数。这是我考虑过的一种粗略的解决方法:
exec('f = Function(\'%s\', %s)' % (fname, ('IntSort(), ' * arity + 'IntSort()')))
return f
但这不起作用,似乎是由于 exec
处理变量声明的方式(如果相关,我正在使用 Python 3)。
有什么想法吗?
这个问题是关于variadic functions in Python。
You can use the same "*" syntax to apply the function to an existing list of arguments:
因此,像这样的东西应该工作:
sorts = [IntSort(), IntSort(), IntSort()]
return Function(fname, *sorts)