Z3 Python Проверяет, различны ли пары

#python #z3 #z3py

Вопрос:

У меня есть 2 матрицы, каждая из которых 3 на 3 (назовем их M1 и M2, каждая из их записей имеет тип Int в Z3. Мне нужно добавить ограничение, в котором говорится, что все пары формы ([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(массив), но, похоже, это не работает, так как я получаю сообщение об ошибке

«По крайней мере один из аргументов должен быть выражением Z3»

Есть ли способ проверить, различны ли 2 пары целых чисел в Z3 для Python? И если нет, то каков хороший способ включить ограничение, что пары, описанные выше, различны?

Ответ №1:

Что-то вроде этого?

 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)  

Ограничения для попарного неравенства добавляются в четырехкратном вложенном цикле. Для матриц 3×3 это приводит к 81 ограничению.

Комментарии:

1. Также возможно моделировать матрицы с помощью SMT-массивов. Но приведенная вами кодировка предпочтительнее, поскольку SMT-массивы не совсем соответствуют тому, что люди обычно считают массивами/матрицами в обычных языках программирования.

2. Эй, спасибо за ваш ответ, это в конечном итоге помогло мне разобраться в этом, хотя мне нужно было добавить некоторые более свободные ограничения. Действительно ценю это