#prolog #predicate #maze
Вопрос:
Я новичок в прологе и хотел бы знать, есть ли у вас лабиринт с определенными «пикселями». Как вы могли бы реализовать предикат white/1, который говорит, является ли пиксель белым или черным. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу создать предикат, который, если я запрошу ?- белый(3/3). это должно вернуть истину. Это моя база данных:
grid([ [w, w, w, b, w],
[b ,b, w, w, w],
[w, w, w, b, w],
[w, b, b, b, b],
[w, w, w, w, w] ]).
Спасибо за ответ, я реализовал эту программу:
white(X/Y) :-
nth1(X/Y, grid, _).
Но после реализации этой программы я все равно получаю ложь.
Комментарии:
1. Ваша проблема сводится к нахождению
nth
элемента списка. Посмотрите наnth0
илиnth1
предикат. С помощью двух вызовов к нему вы можете получить соответствующий элемент. Затем вы можете проверить, белый ли он2. @rajashekar спасибо за предложение, но мне трудно реализовать этот предикат, так как мне кажется, что у него должно быть 2 разных аргумента вместо 1, поскольку я должен определить данный список по вертикали и горизонтали.
3. @rajashekar Спасибо, что объяснили мне это. Теперь я понимаю, что делает встроенный предикат nth1 и как его реализовать. Спасибо за вашу помощь!
![]()
Ответ №1:
white(X/Y) :-
grid(M),
nth1(X, M, Line),
nth1(Y, Line, w).
Первый nth1
получает строку, а второй получает элемент строки.
Я предлагаю поиграть с запросом
?- grid(M), nth1(X, M, Line), nth1(Y, Line, Cell).
Cell = w
Line = [w,w,w,b,w]
M = [[w,w,w,b,w],[b,b,w,w,w],[w,w,w,b,w],[w,b,b,b,b],[w,w,w,w,w]]
X = 1
Y = 1 ? ;
Cell = w
Line = [w,w,w,b,w]
M = [[w,w,w,b,w],[b,b,w,w,w],[w,w,w,b,w],[w,b,b,b,b],[w,w,w,w,w]]
X = 1
Y = 2 ? ;
Cell = w
Line = [w,w,w,b,w]
M = [[w,w,w,b,w],[b,b,w,w,w],[w,w,w,b,w],[w,b,b,b,b],[w,w,w,w,w]]
X = 1
Y = 3 ? ;
Cell = b
Line = [w,w,w,b,w]
M = [[w,w,w,b,w],[b,b,w,w,w],[w,w,w,b,w],[w,b,b,b,b],[w,w,w,w,w]]
X = 1
Y = 4 ? ;
Просто нажимайте ;
после каждого решения, и пролог повторит все возможные X, Y для вашего лабиринта. Вы можете получить представление о том, как nth1
осуществляется доступ к ячейке.
В общем, я бы посоветовал вам использовать два явных параметра, таких как white(X, Y)
, если для этого нет веской причины X/Y
.