这是我在序言中针对广度优先搜索策略的代码:
s(a, b).
s(a, c).
s(b, g).
s(b, f).
s(c, r).
s(c, e).
goal(g).
solve( Start, Solution) :-
breadthlirst( [ [Start] ], Solution).
breadthfirst( [ [Node | Path] |_], [Node | Path] ) :-
goal( Node).
breadthfirst( [ [N | Path] | Paths], Solution) :-
bagof([M,N|Path],
( s( N, M), \+ member( M, [N | Path] ) ), NewPaths),
conc( Paths, NewPaths, Pathsl), !,
breadthfirs( Pathsl, Solution);
breadthfirst( Paths, Solution).
但是当我运行这段代码时,它发出了一个异常:
?- solve(a, S).
uncaught exception: error(existence_error(procedure,breadthlirst/2),solve/2)
这是怎么回事?另外,有没有比这更简单的广度优先搜索版本?
答案 0 :(得分:2)
对于此解决方案,我使用了SWI-Prolog
这是怎么回事?
uncaught exception: error(existence_error(procedure,breadthlirst/2),solve/2)
编译器/解释器向您显示,在尝试解决查询时,它以谓词solve/2
开始,然后尝试查找它无法找到的breadthlirst/2
。
修正错别字并将conc/3
更改为append/3
会导致
s(a, b).
s(a, c).
s(b, g).
s(b, f).
s(c, r).
s(c, e).
goal(g).
solve( Start, Solution) :-
breadthfirst( [ [Start] ], Solution).
breadthfirst( [ [Node | Path] |_], [Node | Path] ) :-
goal( Node).
breadthfirst( [ [N | Path] | Paths], Solution) :-
bagof([M,N|Path],
( s( N, M), \+ member( M, [N | Path] ) ), NewPaths),
%conc( Paths, NewPaths, Pathsl), !,
append(Paths, NewPaths, Pathsl), !,
breadthfirst( Pathsl, Solution);
breadthfirst( Paths, Solution).
执行查询
?- solve(a,S).
S = [g, b, a] ;
通常我希望目标,在这种情况下,g
是解决的参数,而不是硬编码为事实goal(g).
有没有比这更容易的广度优先搜索版本?
在琐碎情况下,在Prolog中进行呼吸优先搜索时,我更喜欢使用meta-interpreters。
Here是Prolog中BFS的另一个版本,如果您在Prolog上有任何血统书,它应该涵盖BFS。
The Power of Prolog将帮助您更好地了解Prolog。请注意,这更多是高级内容,除非您了解基本知识,否则不可以开始使用。
答案 1 :(得分:0)
对不起,但是没有街头信仰,因此对MDG没什么评价:-(
如果您想先广度,最好使用队列?我不知道。我可以先显示队列的广度代码,但这不是您的问题,而且有很多这样的问题,只是搜索没有问题。