Le code pour agenda_search devrait fonctionner correctement. Pour plus d'efficacité, vous pouvez envisager d'utiliser une autre infrastructure de données; en effet, en mode largeur d'abord, toute la liste des nœuds (T) sera traversée par append (T, C, A). Vous pouvez par exemple utiliser le module de bibliothèque (files d'attente) de SICStus. La largeur de la première recherche serait alors la suivante (paramétrée par les prédicats start/1, le prédicat successeur s/2 et le goal goal goal/1). Remarque, j'ai également ajouté la vérification de la boucle.
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).
(. Vous pouvez également essayer de remplacer/compléter le composant de chemin par une meilleure structure de données, par exemple, AVL arbres) Un exemple de problème à résoudre serait:
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)).
Vous pouvez également remplacez la file d'attente par une file d'attente prioritaire et calculez la priorité en utilisant une fonction heuristique. Vous obtenez alors une recherche A * (qui peut émuler la profondeur en premier, la largeur en premier, la meilleure en premier, ...). Le livre de Bratko (Programmation logique pour l'intelligence artificielle) devrait être une bonne source pour lire ce matériel.
De plus, breadth-first trouvera d'abord le ou les chemins les plus courts. –