在序言中广度优先搜索给我一个错误

时间:2018-11-10 06:38:11

标签: prolog breadth-first-search

这是我在序言中针对广度优先搜索策略的代码:

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)

这是怎么回事?另外,有没有比这更简单的广度优先搜索版本?

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没什么评价:-(

如果您想先广度,最好使用队列?我不知道。我可以先显示队列的广度代码,但这不是您的问题,而且有很多这样的问题,只是搜索没有问题。