Пролог, имеющий дело с двумерными массивами и несвязанными переменными - PullRequest
0 голосов
/ 22 февраля 2019

Я знаком с языком Java, но у меня проблемы с пониманием языкового пролога.Я хочу создать функциональную матрицу (N, M), которая должна возвращать true, только если M является 2D-массивом N x N, и каждая ячейка в M содержит несвязанную переменную.Кроме того, я не уверен, что понимаю, что такое несвязанная переменная и как бы мой метод отличался, если бы я хотел, чтобы каждая ячейка содержала определенную последовательность.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 февраля 2019

Этот ответ является попыткой дать вам некоторые идеи, с которых можно начать, не передавая полное решение.

Чтобы выучить пролог, забудьте все о 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, что может упростить это.

Обратите внимание, что я не включил привязки для переменных, так что все это будут несвязанные переменные.Если вы хотите связать переменные, я не могу предложить больше входных данных, чем приведенные выше, не имея больше информации о ваших правилах для привязки конкретных значений ( например, , если вы получили матрицу с полной привязкой,или вы просто хотите связать определенные записи?*

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