Der Code für agenda_search sollte gut funktionieren. Aus Effizienzgründen sollten Sie eine andere Datenstruktur in Betracht ziehen. in der Tat wird in der ersten Breite die gesamte Liste der Knoten (T) von append (T, C, A) durchlaufen. Sie können zum Beispiel das Bibliotheksmodul (Warteschlangen) von SICStus verwenden. Die Breathth-First-Suche würde dann wie folgt aussehen (parametrisiert durch Prädikate start/1, das Nachfolgerprädikat s/2 und das Zielprädikatziel/1). Hinweis, ich habe auch eine Schleifenprüfung hinzugefügt.
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).
(. Sie können auch den Pfad Komponente versuchen und ersetzen/ergänzen durch eine bessere Datenstruktur, zB AVL-Bäume) Ein Beispiel Problem wäre zu lösen:
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)).
Sie können auch Ersetzen Sie die Warteschlange durch eine Prioritätswarteschlange, und berechnen Sie die Priorität mithilfe einer heuristischen Funktion. Sie erhalten dann eine A * -Suche (die Tiefe emulieren kann - zuerst, Breite zuerst, beste zuerst, ...). Bratkos Buch (Logic Programming for Artificial Intelligence) sollte eine gute Quelle sein, um dieses Material zu lesen.
Auch breath-first findet zuerst den kürzesten Weg. –