Поиск по ширине в прологе выдает ошибку - PullRequest
0 голосов
/ 10 ноября 2018

Это мой код для первой стратегии поиска в прологе:

s(a, b).
s(a, c).
s(b, g).
s(b, f).
s(c, r).
s(c, e).
goal(g).

solve( Start, Solution) :-
    breadthlirst( [ [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), !,
    breadthfirs( Pathsl, Solution);
    breadthfirst( Paths, Solution). 

Но когда я запускаю этот код, он выдает исключение следующим образом:

?- solve(a, S).
uncaught exception: error(existence_error(procedure,breadthlirst/2),solve/2)

Что здесь происходит? Кроме того, есть ли более простой вариант поиска в ширину, чем этот?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Для этого решения я использовал 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.

Сила Пролога поможет вам лучше понять Пролог. Имейте в виду, что это больше продвинутые вещи, а не то, с чего нужно начинать играть, пока вы не поймете основы.

0 голосов
/ 10 ноября 2018

Извините, но уличных кредитов нет, поэтому никаких комментариев по ЦРТ: - (

Если вы хотите ширину в первую очередь, возможно, лучше использовать очередь ?? Я не знаю. Сначала я могу показать код ширины с очередью, но это не ваш вопрос, и таких вопросов очень много, просто ищите без проблем.

...