Этот ответ является попыткой дать вам некоторые идеи, с которых можно начать, не передавая полное решение.
Чтобы выучить пролог, забудьте все о Java, C, C ++ или любом другом императивном языке.Пролог другой.Лучше не пытаться отобразить то, что вы знаете на этих языках, на Пролог.Пролог не имеет функции , но предикатов .Это правила, которые что-то описывают. несвязанная переменная - это переменная, которая не была объединена (или привязана ) к определенному значению.
Запустите Prolog и перейдите кПролог подскажет и попробует некоторые вещи, чтобы начать видеть, как работает Пролог.
Например, предположим, что вас интересуют списки длиной N
.У Пролога есть предикат length/2
(length
имеет 2 аргумента):
1 ?- length([a,b,c], N).
N = 3.
Список [a,b,c]
состоит из 3 элементов.Я также мог бы использовать переменные:
2 ?- length([X,Y,Z], N).
N = 3.
Переменные X
, Y
и Z
не связаны.Что делает length/2
предикатом , а не функцией, так это то, что он просто описывает связь между длиной и списком.Вы также можете написать:
3 ?- length(L, 3).
L = [_5112, _5118, _5124].
Пролог находит решение, L
, для списка длины 3. Переменные _xxxx
являются анонимными несвязанными переменными.
Другой пример:
4 ?- length([X,Y,Z], N), Y = 2, write([X,Y,Z]).
[_5850,2,_5862]
Y = 2,
N = 3.
Здесь, я говорю, я хочу список [X,Y,Z]
, длина N
, значение Y
, которое можно определить с помощью 2. Я записываю его.Когда я пишу список, я получаю [_xxxx, 2, _xxxx]
, поэтому среднее значение связано, а два других - нет.Вы также хотите быть осторожным здесь.Заметьте, я не сказал, присвойте 2 Y
.Это не то, что делает =
.=/2
является оператором унификации в Прологе.Это успешно, если аргументы не поддаются определению.Если задействованы переменные, Prolog свяжет переменные со значениями, которые делают его универсальным, если это возможно.В этом случае Y = 2
свяжет Y
со значением 2, чтобы сделать его успешным, затем перейдет к следующему оператору.=/2
полностью рефлексивно, так что я мог бы с таким же успехом написать 2 = Y
, и не было бы абсолютно ничего плохого в том, чтобы написать его таким образом.Нашему мозгу для императивного программирования кажется более удобным воспринимать его как Y = 2
, хотя это может вводить в заблуждение.
Теперь распространите это на свою матрицу NxN.Это список длины N, элементами которого являются списки длины N. Один элемент может быть определен с помощью length(Row, N)
.Если вы говорите matrix(N, M)
, то вы также знаете, что length(M, N)
должно быть истинным.
Чтобы полностью решить проблему, вам нужно будет перечислить строки M
(элементы списка M
) и применять правило длины в этом ряду.Вы также можете взглянуть на maplist/3
, что может упростить это.
Обратите внимание, что я не включил привязки для переменных, так что все это будут несвязанные переменные.Если вы хотите связать переменные, я не могу предложить больше входных данных, чем приведенные выше, не имея больше информации о ваших правилах для привязки конкретных значений ( например, , если вы получили матрицу с полной привязкой,или вы просто хотите связать определенные записи?*