prolog中的广度优先搜索给了我一个错误

prolog中的广度优先搜索给了我一个错误,prolog,breadth-first-search,Prolog,Breadth First Search,这是我在prolog中关于广度优先搜索策略的代码: 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

这是我在prolog中关于广度优先搜索策略的代码:

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)

这是怎么回事?还有,还有比这个更简单的广度优先搜索版本吗

对不起,没有街头信誉,所以没有千年发展目标的承诺:-(


如果你想广度优先,也许最好使用队列??我不知道。我可以用队列显示广度优先的代码,但这不是你的问题,这样的问题太多了,只需搜索就可以了。

对于这个解决方案,我使用了SWI Prolog

这是怎么回事

编译器/解释器向您显示,在尝试解决查询时,它从谓词
solve/2
开始,然后尝试查找它无法找到的
breadthfirst/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
是一个solve参数,而不是硬编码为事实
goal(g)。

有没有比这个更简单的广度优先搜索版本

当在Prolog中使用呼吸优先搜索时,除了我更喜欢使用的琐碎情况之外

是Prolog中BFS的另一个版本,如果你在Prolog中得到任何下降的书,它应该涵盖BFS


将有助于您更好地理解序言。请注意,这是更多的高级内容,在您了解基础知识之前不可开始使用。

打字错误:您写了“宽度优先”,但您需要感兴趣的“宽度优先:-从幻灯片25开始相关问题:@sosscs如果您写的是问题“我们如何用队列写广度优先搜索”我先写然后回答,没问题。或者,如果你发现这样的问题但没有好的答案,只需给出问题的链接,我就在那里回答。
?- solve(a,S).
S = [g, b, a] ;