Код повестки дня должен работать нормально.
Для эффективности вы можете рассмотреть возможность использования другой структуры данных; действительно, в режиме ширины-первого весь список узлов (T) будет пересматриваться при добавлении (T, C, A).
Например, вы можете использовать библиотечный модуль (очереди) из SICStus.
Поиск в ширину тогда будет выглядеть следующим образом (параметризованный предикатами start / 1, предикатом-наследником s / 2 и предикатом цели target / 1). Обратите внимание, я также добавил проверку цикла.
bfs(Res) :- start(Start), empty_queue(EQ),
queue_append(EQ,[e(Start,[])],Q1),
bfs1(Q1,Res).
bfs1(Queue,Res) :- queue_cons(e(Next,Path),NQ,Queue),
bfs2(Next,Path,NQ,Res).
bfs2(H,Path,_NQ,Res) :- goal(H), reverse([H|Path],Res).
bfs2(H,Path,NQ,Res) :-
findall(e(Succ,[H|Path]),
(s(H,Succ),\+ member(Succ,Path)),AllSuccs),
queue_append(NQ,AllSuccs,NewQueue),
bfs1(NewQueue,Res).
(Вы также можете попытаться заменить / дополнить компонент Path лучшей структурой данных; например, AVL-деревья.)
Пример решаемой проблемы:
start(env(0,0)).
s(env(X,Y),env(X1,Y)) :- X1 is X+1.
s(env(X,Y),env(X,Y1)) :- Y1 is Y+1.
goal(env(3,3)).
Вы также можете заменить очередь приоритетной и вычислить приоритет с помощью эвристической функции. Затем вы получаете поиск A * (который может эмулировать глубину сначала, ширину сначала, лучше всего сначала ...).
Книга Братко (Программирование логики для искусственного интеллекта) должна стать хорошим источником для прочтения этого материала.