如何使用Z3(python API)快速重命名公式中的所有变量

时间:2014-10-03 13:28:27

标签: python z3

我正在寻找一种方法来根据给定的替换映射重命名公式中的所有变量。我目前正在使用substitute函数,但它看起来很慢。

我可以使用哪种功能比它更快?还有其他方法可以快速完成吗?

N.B。我只是将新变量替换为原始公式中的变量,因此没有重命名冲突。在这种假设下,有没有办法更快地执行重命名?

例如,

# given
f = And(Int('x') > Int('y'), Or(Int('x') - 5 >= Int('z'), Int('k') > 1))
# expected result after substitution
# f = And(Int('v0') > Int('v1'), Or(Int('v0') - 5 >= Int('v2'), Int('v3') > 1))

有没有办法处理f上下文

1 个答案:

答案 0 :(得分:1)

没有一种固有的更快的API方式。我对速度有一些评论:

  1. 您似乎正在使用Python API,这本身就有很大的开销。它可能有助于时间 python中使用的部分与Z3分开。

  2. substitute函数的实现使用在堆栈上分配的类。 很有可能将此类作为上下文的持久属性 加快摊销时间,因为它不会重复分配和重新分配内存。我不得不分析一个实例,以便能够判断这种变化是否真的得到了回报。

  3. 执行重命名的更基本方法是使用隐式重命名,因此根本不应用替换,而是访问具有不同偏移的变量。这种取消引用变量的低级方式无法以任何方式通过API,甚至我们代表高级表达式的方式,因此它不会是一种选择。

  4. 如果您的应用程序允许,您可以使用现有术语并隐式编码替换。例如,在某些应用程序中,可以在旧变量和新变量之间添加相等约束。