我正在尝试在 prolog 中编写一个简单的迷宫搜索程序,在向访问列表添加房间之前,我正在检查它是否已经是访问列表的成员。但是,即使我使用书中的代码,我也无法使其正常工作:
d(a,b).
d(b,e).
d(b,c).
d(d,e).
d(c,d).
d(e,f).
d(g,e).
go(X, X, T).
go(X, Y, T) :-
(d(X,Z) ; d(Z, X)),
\+ member(Z,T),
go(Z, Y, [Z|T]).
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
你的程序似乎没问题。我想问题是你在调用 go/3 时没有实例化第三个参数。在这种情况下, member(X, T) 将始终成功,从而使子句失败。
您可以使用空列表作为第三个参数调用谓词:例如
?- go(a, g, []).
true
Run Code Online (Sandbox Code Playgroud)
如果要返回路径,请考虑添加另一个参数,如下所示:
go(From, To, Path):-
go(From, To, [], Path).
go(X, X, T, T).
go(X, Y, T, NT) :-
(d(X,Z) ; d(Z, X)),
\+ member(Z,T),
go(Z, Y, [Z|T], NT).
Run Code Online (Sandbox Code Playgroud)