El código para agenda_search debería funcionar bien. Para mayor eficiencia, es posible que desee considerar el uso de otra estructura de datos; de hecho, en el modo de amplitud primero, la lista completa de nodos (T) será atravesada por append (T, C, A). Podría, por ejemplo, usar el módulo de biblioteca (colas) de SICStus. Breadth-First search tendría el siguiente aspecto (parametrizado por los predicados start/1, el predicado sucesor s/2 y el meta predicate goal/1). Tenga en cuenta que también he agregado la verificación de bucles.
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).
(. También puede probar y sustituir/complementar el componente de trazado por una mejor estructura de datos; por ejemplo, AVL-árboles) Un ejemplo de problema a resolver sería:
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)).
También puede reemplace la cola por una cola de prioridad y calcule la prioridad usando una función heurística. Luego obtienes A * búsqueda (que puede emular la profundidad primero, ancho primero, mejor primero ...). El libro de Bratko (Programación Lógica para la Inteligencia Artificial) debería ser una buena fuente para leer este material.
Además, en primer lugar, primero encontrará la ruta/rutas más cortas. –