Z3 Python 检查对是否不同

Z3 Python Check whether pairs are distinct

我有 2 个矩阵,每个矩阵都是 3 x 3(称它们为 M1 和 M2,它们的每个条目都是 Z3 中的 Int 类型。我需要添加表示所有形式对的约束( [M1[i][j], M2[i][j]) 是不同的(i 和 j 是矩阵的任意索引)。

换句话说,

if   (i1,j1) != (i2,j2) 
then ([M1[i1][j1], M2[i1][j1]) != ([M1[i2][j2], M2[i1][j2])

我尝试制作所有对的数组,称为数组,然后使用 Distinct(array),但这似乎不起作用,因为我收到一条错误消息

“至少有一个参数必须是 Z3 表达式”

对于 Python,有没有办法查看 Z3 中的 2 对整数是否不同?如果不是,什么是启用上述对不同的约束的好方法?

是这样的吗?

from z3 import *

def CreateMatrix(name, rows, cols):
    a=[] 
    for row in range(rows): 
        b=[]
        for col in range(cols): 
            v = Int(name + str(row+1) + str(col+1))
            b.append(v)
        a.append(b)
    return a

def ShowMatrix(model, name, mat, rows, cols):
    print()
    print("Matrix " + name)
    for row in range(rows):
        s = ""
        for col in range(cols):
            s = s + str(model.eval(mat[row][col])).ljust(4)
        print(s)

s = Solver()
rows = 3
cols = 3
M1 = CreateMatrix('M1', rows, cols)
M2 = CreateMatrix('M2', rows, cols)

for row1 in range(rows):
    for col1 in range(cols):
        for row2 in range(rows):
            for col2 in range(cols):
                s.add(M1[row1][col1] != M2[row2][col2])

print(s.check())

ShowMatrix(s.model(), "M1", M1, rows, cols)
ShowMatrix(s.model(), "M2", M2, rows, cols)

在四重嵌套循环中添加了成对不等式的约束。 对于 3x3 矩阵,这会产生 81 个约束。