Friday, July 6, 2007

BFS

domains
node=symbol
path=symbol*
paths=path*
predicates
solve(node,path)
edge(node,node)
final(node)
p(node,node,path)
append2(path,path,paths)
bfs(paths,path)
extend(path,path,paths)
conc(paths,paths,paths)
member(node,path)
clauses
edge(n1,n2).
edge(n1,n3).
edge(n2,n4).
edge(n2,n5).
edge(n3,n6).
edge(n3,n7).
final(n4).
final(n7).
solve(Start,Sol):-
bfs([[Start]],Sol).
bfs([[NodePath]_],[NodePath]):-
final(Node).
bfs([PathPaths],Sol):-
extend(Path,Path,Newpath),
conc(Paths,Newpath,Path1),
bfs(Path1,Sol).
extend(Path1,[NodePath],New):-
findall(Newnode,p(Node,Newnode,Path1),New1),
append2(New1,Path1,New),!.
extend(Path,Path,[]).
conc([],L,L).
conc([HList1],List2,[HT1]):-
conc(List1,List2,T1).
p(Node,Newnode,Path1):-
edge(Node,Newnode),
not(member(Newnode,Path1)).
append2([],_,[]).
append2([HNew2],L2,[[HL2]T]):-
append2(New2,L2,T).
member(H,[H_]).
member(H,[_T]):-
member(H,T).
goal
solve(n1,Sol).

No comments: