Z3 为什么带数字参数的*没有被简化压平?

Z3 为什么带数字参数的*没有被简化压平?,z3,z3py,Z3,Z3py,我希望使用:flat简化,以3*x*y*z评估(*3 x y z)。相反,结果是(*3(*x y z))。为什么? 范例 w = Int('w') x = Int('x') y = Int('y') z = Int('z') print simplify(w * x * y * z, flat=True).num_args() # 4, which we expected print simplify(3 * x * y * z, flat=True).num_args() # 2, why

我希望
使用
:flat
简化
,以
3*x*y*z
评估
(*3 x y z)
。相反,结果是
(*3(*x y z))
。为什么?

范例

w = Int('w')
x = Int('x')
y = Int('y')
z = Int('z')
print simplify(w * x * y * z, flat=True).num_args()  # 4, which we expected
print simplify(3 * x * y * z, flat=True).num_args()  # 2, why not 4?

simplifier/rewriter以便于解算器和其他简化/重写规则的格式放置产品。处理总和时,格式
(*3(*x y z))
非常方便。例如,简化程序可以快速应用规则

(+ (* c t) (* d t)) --> (* (+ c d) t)
Z3使用最大共享术语,那么每个产品的内存中只有一个副本。 该表示法对于可以处理产品的线性解算器也很有用。他们可以将product
(*x y z)
视为新变量