Пожалуйста, напишите решение для пролога - PullRequest
0 голосов
/ 22 марта 2012

У меня есть матрица M x N, мне нужно поменять местами элементы с индексами [1,N] и [M,N].

Обновление

Я действительно новичок в Прологе, вот мое решение, которое возвращает false: (

main([FirstRow|Tail],X):-
    last(FirstRow, A),
    last(Tail, LastRow),
    last(LastRow, B),
    skipLastItem(FirstRow,FirstRowWithoutA),
    skipLastItem(LastRow,LastRowWithoutB),
    append(FirstRowWithoutA,[B],FirstRowNew),
    append(LastRowWithoutB,[A],LastRowNew),
    assign([FirstRowNew],X),
    skipLastItem(Tail,Middle),
    appendAllElements(Middle,X),
    append(X,LastRowNew,X).

appendAllElements([X|Tail],List):-
    append(List,X,NewList),
    appendAllElements(Tail,NewList).

appendAllElements([],_).

assign(Item,Item).

skipLastItem([_],[ ]) :- !.
skipLastItem([H|T],[H|S]) :-
skipLastItem(T,S).

1 Ответ

3 голосов
/ 22 марта 2012

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

Начнем с более простой задачи замены одного значения в списке.Напишите рекурсивный предикат

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 вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...