В прологе говорится, что что-то в списке (в данном случае сетка/1) белое. Пролог

#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 .