PROLOG
%%%%%%% Breadth first search algorithm%%%%%%%% %%% %%% This is one of the example programs from the textbook: %%% %%% Artificial Intelligence: %%% Structures and strategies for complex problem solving %%% %%% by George F. Luger and William A. Stubblefield %%% %%% Corrections by Christopher E. Davis (chris2d@cs.unm.edu) %%% %%% These programs are copyrighted by Benjamin/Cummings Publishers. %%% %%% We offer them for use, free of charge, for educational purposes only. %%% %%% Disclaimer: These programs are provided with no warranty whatsoever as to %%% their correctness, reliability, or any other property. We have written %%% them for specific educational purposes, and have made no effort %%% to produce commercial quality computer programs. Please do not expect %%% more of them then we have intended. %%% %%% This code has been tested with SWI-Prolog (Multi-threaded, Version 5.2.13) %%% and appears to function as intended. state_record(State, Parent, [State, Parent]). go(Start, Goal) :- empty_queue(Empty_open), state_record(Start, nil, State), add_to_queue(State, Empty_open, Open), empty_set(Closed), path(Open, Closed, Goal). path(Open,_,_) :- empty_queue(Open), write('graph searched, no solution found'). path(Open, Closed, Goal) :- remove_from_queue(Next_record, Open, _), state_record(State, _, Next_record), State = Goal, write('Solution path is: '), nl, printsolution(Next_record, Closed). path(Open, Closed, Goal) :- remove_from_queue(Next_record, Open, Rest_of_open), (bagof(Child, moves(Next_record, Open, Closed, Child), Children);Children = []), add_list_to_queue(Children, Rest_of_open, New_open), add_to_set(Next_record, Closed, New_closed), path(New_open, New_closed, Goal),!. moves(State_record, Open, Closed, Child_record) :- state_record(State, _, State_record), mov(State, Next), % not (unsafe(Next)), state_record(Next, _, Test), not(member_queue(Test, Open)), not(member_set(Test, Closed)), state_record(Next, State, Child_record). printsolution(State_record, _):- state_record(State,nil, State_record), write(State), nl. printsolution(State_record, Closed) :- state_record(State, Parent, State_record), state_record(Parent, _, Parent_record), member(Parent_record, Closed), printsolution(Parent_record, Closed), write(State), nl. add_list_to_queue([], Queue, Queue). add_list_to_queue([H|T], Queue, New_queue) :- add_to_queue(H, Queue, Temp_queue), add_list_to_queue(T, Temp_queue, New_queue).
http://www.cs.unm.edu/~luger/ai-final/code/PROLOG.breadth.html
what query do you use to test that BFS in prolog?
ReplyDelete