Для этого решения я использовал SWI-Prolog
Что здесь происходит?
uncaught exception: error(existence_error(procedure,breadthlirst/2),solve/2)
Компилятор / интерпретатор показывает вам, что при попытке решить ваш запрос он начал с предиката solve/2
, а затем попытался найти breadthlirst/2
, чего не смог.
Исправление опечаток и изменение conc/3
на append/3
приводит к
s(a, b).
s(a, c).
s(b, g).
s(b, f).
s(c, r).
s(c, e).
goal(g).
solve( Start, Solution) :-
breadthfirst( [ [Start] ], Solution).
breadthfirst( [ [Node | Path] |_], [Node | Path] ) :-
goal( Node).
breadthfirst( [ [N | Path] | Paths], Solution) :-
bagof([M,N|Path],
( s( N, M), \+ member( M, [N | Path] ) ), NewPaths),
%conc( Paths, NewPaths, Pathsl), !,
append(Paths, NewPaths, Pathsl), !,
breadthfirst( Pathsl, Solution);
breadthfirst( Paths, Solution).
Выполнение запроса
?- solve(a,S).
S = [g, b, a] ;
Обычно я ожидаю, что цель, в данном случае g
, будет параметром решения, а не жестко закодирована как факт goal(g).
Есть ли более простой вариант поиска в ширину, чем этот?
При работе с дыханием сначала ищите в Прологе, кроме тривиальных случаев, я предпочитаю использовать мета-интерпретаторы .
Здесь - это другая версия BFS в Прологе, и если у вас есть какая-либо книга по спуску на Прологе, она должна охватывать BFS.
Сила Пролога поможет вам лучше понять Пролог. Имейте в виду, что это больше продвинутые вещи, а не то, с чего нужно начинать играть, пока вы не поймете основы.