Это звучит как домашнее задание, поэтому я собираюсь быть немного расплывчатым ...
Начнем с более простой задачи замены одного значения в списке.Напишите рекурсивный предикат
swap_list(X,N,A,B,Y)
, который должен читаться как «для списка X, в позиции N, удаление значения A и замена его на B дает список Y».
Теперьмы можем распространить это на случай матриц.Напишите второй рекурсивный предикат
swap_matrix(X,M,N,A,B,Y)
, который должен читаться как «для матрицы X в позиции (M, N), удаление элемента A и замена его на B дает матрицу Y».Базовый случай этой рекурсии, где M=0
, будет содержать вызов swap_list
.
Теперь вы можете поменять две позиции (M1, N1) и (M2, N2) следующим образом:
swap(X,M1,N1,M2,N2,Y) :-
swap_matrix(X,M1,N1,A,B,Z),
swap_matrix(Z,M2,N2,B,A,Y).
Обратите внимание, что мы вставляем B
в матрицу Z
еще до того, как узнаем, что это такое - B не присваивается значение до второго swap_matrix
вызова.