如何断言 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)
要断言一个列表的所有元素都相等,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)