如何断言 z3py 中的所有变量都相等?

How to assert all variables equal in z3py?

要断言一个列表的所有元素都相等,z3py中没有“Equal()”吗?例如 Distinct()。 使用 numpy 有效:

from z3 import *
import numpy as np

s = Solver()

B = [BitVec(f"b{j}", 7) for j in range(11)]

C_eq = [B[i] == B[j] for i in range(3) for j in range(3) if i != j]

s.add(C_eq)

print(s.check())
print(s.model())

确实 z3py 支持 Distinct,但不支持 Equals。原因是 Distinct 的直接编码需要二次方的约束,它会使求解器陷入困境。拥有 Distinct 原语可以让求解器避免这个瓶颈。 Equals,然而,只需要在变量数量上有线性数量的约束,通常不需要任何特殊的帮助来提高效率。

但是,为了简化您的编程,您可以自己定义它。像这样:

from z3 import *

def Equals(*xs):
    constr = True
    if xs:
        base = xs[0]
        for x in xs[1:]:
            constr = And(constr, base == x)
    return constr

然后像这样使用它:

x, y, z = Ints('x y z')
print(Equals())
print(Equals(x))
print(Equals(x, y))
print(Equals(x, y, z))

打印:

True
True
And(True, x == y)
And(And(True, x == y), x == z)