【发布时间】:2012-11-21 09:30:49
【问题描述】:
我有简单的 Z3 python 代码,如下所示。我希望“打印”行将返回存储在其上方行中的“y”。结果,我得到了“A[x]”。
I = IntSort()
A = Array('A', I, I)
x = Int('x')
y = Int('y')
Store(A, x, y)
print Select(A,x)
为什么Select()不返回Store()存储的值?
谢谢。
【问题讨论】:
我有简单的 Z3 python 代码,如下所示。我希望“打印”行将返回存储在其上方行中的“y”。结果,我得到了“A[x]”。
I = IntSort()
A = Array('A', I, I)
x = Int('x')
y = Int('y')
Store(A, x, y)
print Select(A,x)
为什么Select()不返回Store()存储的值?
谢谢。
【问题讨论】:
有两点需要注意:
首先: 当你写
Store(A, x, y)
您创建一个带有三个参数 A、x 和 y 的 术语。 A 没有副作用。 您可以通过编写来为该术语创建一个名称
B = Store(A,x,y)
第二: 除非您愿意,否则 Z3 不会简化术语。 python API 公开了一个名为simplified 的简化函数。 您可以通过调用简化器来获得缩减项。 例子是:
I = IntSort()
A = Array('A', I, I)
x = Int('x')
y = Int('y')
B = Store(A, x, y)
print Select(B,x)
print simplify (Select(B,x))
【讨论】:
simplify 只是一个自下而上的重写器。我们没有论文描述它,因为它基于众所周知的技术。我还假设它比 gcc 等编译器应用的中间代码优化要简单得多。您可以在 Z3 代码库 (z3.codeplex.com) 的目录 src/ast/rewriter 中找到它的实现。数组简化规则在文件z3.codeplex.com/SourceControl/changeset/view/2a286541e002#src/…中实现