在公式中替换函数符号(使用其他函数)的最佳方法是什么?
Z3py的substitute
似乎只适用于表达式,我现在所做的是尝试猜测可以应用该函数的所有可能的consts / vars组合,然后用另一个函数的应用程序替换它们。有没有更好的方法呢?
答案 0 :(得分:3)
我们可以实现一个简单的自下而上的重写器,它给出一个术语s
,一个函数f
和一个术语t
将替换每个f
- 应用程序{{1} } f(r_1, ..., r_n)
与s
。我使用符号t[r_1, ..., r_n]
来表示通过使用t[r_1, ..., r_n]
,...,t
替换r_1
中的自由变量而获得的术语。
重写器可以实现Z3 API。我使用r_n
来缓存结果,并使用AstMap
列表来存储仍需要处理的表达式。
以下是一个简单示例,用todo
替换f
- f(t)
表单与g(t+1)
的应用程序。
s
这是代码和更多示例。请注意,我只在一小组示例中测试了代码。
x = Var(0, IntSort())
print rewrite(s, f, g(x + 1))