Advertisement
Guest User

Untitled

a guest
Mar 6th, 2015
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 0.88 KB | None | 0 0
  1. node(1).
  2. node(2).
  3. node(3).
  4. node(4).
  5. node(5).
  6.  
  7. edge(1, 2).
  8. edge(1, 3).
  9. edge(2, 4).
  10. edge(3, 4).
  11. edge(4, 5).
  12.  
  13. adj(X, Y) :-
  14.     node(X), node(Y),
  15.     (edge(X, Y); edge(Y, X)).
  16.  
  17. :- dynamic(queue/1).
  18.  
  19. queue_push(X) :-
  20.     assertz(queue(X)).
  21.  
  22. queue_pop(X) :-
  23.     queue(X),
  24.     retract(queue(X)), !.
  25.  
  26. queue_info :-
  27.     findall(X, queue(X), L),
  28.     write(L).
  29.  
  30. :- dynamic(used/1).
  31. :- dynamic(parent/2).
  32.  
  33. bfs(X, Y, P) :-
  34.     retractall(queue(_)),
  35.     retractall(used(_)),
  36.     retractall(parent(_, _)),
  37.     queue_push(X),
  38.     assertz(used(X)),
  39.     bfs_loop,
  40.     bfs_find_path(X, [Y], P).
  41.  
  42. bfs_loop :-
  43.     queue_pop(X),
  44.     bfs_adj(X),
  45.     bfs_loop, !;
  46.     true.
  47.    
  48. bfs_adj(X) :-
  49.     adj(X, T),
  50.     \+ used(T),
  51.     assertz(used(T)),
  52.     assertz(parent(X, T)),
  53.     queue_push(T),
  54.     bfs_adj(X), !;
  55.     true.
  56.  
  57. bfs_find_path(X, [X|Xs], [X|Xs]) :- !.
  58. bfs_find_path(X, [Y|Ys], P) :-
  59.     parent(T, Y),
  60.     bfs_find_path(X, [T,Y|Ys], P).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement