Я изучаю Пролог по книге Ивана Братко: Программирование для искусственного интеллекта, и в книге я нашел эту версию задачи 8 Queens, в которой для решения этой проблемы используется "граф состояний пространства":
s(Queens, [Queen|Queens]) :- member(Queen, [1,2,3,4,5,6,7,8]),
noattack(Queen, Queens).
goal([_,_,_,_,_,_,_,_]).
noattack(_,[],_).
noattack(Y,[Y1|Ylist],Xdist) :-
Y1-Y =\= Xdist,
Y-Y1 =\= Xdist,
Dist1 is Xdist + 1,
noattack(Y,Ylist,Dist1).
solve(N,[N]) :- goal(N).
solve(N, [N|Sol1]) :- s(N,N1),
solve(N1,Sol1).
Он сочетает в себе решение задачи 8 Queens, основанное на перестановке (используйте его отношение noattack / 3) и предикат s / 2, который, как мне кажется, создает состояние возможных состояний-преемников ( узлы моего графа). Так что у меня что-то вроде:
s (ActualState, SuccessorState)
Я думаю, что предикат цель / 1 указывает только на то, что я должен поставить ровно 8 ферзей.
В книге я скажу, что при выполнении этого запроса: resolve ([], Solution) он создаст список позиций на доске с увеличивающимся числом ферзей, и что этот список закончится безопасной конфигурацией восьми королевы.
Но если я попытаюсь выполнить этот запрос, это не сработает, и я получу следующий результат:
?- solve([],Solution).
ERROR: s/2: Undefined procedure: noattack/2
ERROR: However, there are definitions for:
ERROR: noattack/3
Потому что, правильно, предикат noattack, вызываемый в строке 2, принимает только 2 параметра, но предикат noattack должен иметь 3 параметра ... в этой книге дано неверное значение. путь и я не знаю, как решить эту проблему ...
Почему? Что мне не хватает?