为什么 Z3 中的这个公式不正确?

Why is this formula in Z3 not correct?

这段代码我有以下问题

p_y = [Int("p_y_%s" % str(i+1)) for i in range(n)]
length = Int("length")
objective = length == max([p_y[i] + y[i] for i in range(n)])

n是整型参数, 错误如下:

File "C:/Users/boezi/PycharmProjects/VLSI/SMT/src/model.py", line 29, in solve_instance
    objective = length == max([p_y[i] + y[i] for i in range(n)])
  File "C:\Users\boezi\AppData\Local\Programs\Python\Python37\lib\site-packages\z3\z3.py", line 380, in __bool__
    raise Z3Exception("Symbolic expressions cannot be cast to concrete Boolean values.")
z3.z3types.Z3Exception: Symbolic expressions cannot be cast to concrete Boolean values.

我该如何解决?

max 不是公式,但您可以将此 max 函数用于您的用例:

def z3_max(x, *elts):
    if not elts:
        return x
    y = z3_max(*elts)
    return If(x > y, x, y)

然后就可以和z3_max(x, y, z)一起使用了。
如果你有一个 u = [x, y, z] 变量列表,你可以使用 z3_max(*u).

虽然可能还有其他更优雅的解决方案。

我猜这是来自此人正在处理的同一任务:

无论如何,这是您要使用的功能:

# Return maximum of a vector; error if empty
def symMax(vs):
  m = vs[0]
  for v in vs[1:]:
    m = If(v > m, v, m)
  return m

长话短说,Python 的 max 不处理符号值。您必须拥有自己的符号最大值版本并改用它。可惜 z3py 没有办法告诉你,除了你收到的这条神秘的错误信息。