我知道 Prolog 在技术上没有“回报”,但我不知道如何提出这个问题。
我找到了一些用于查找地铁站之间路线的算法的示例代码。它工作得很好,但是它应该只打印结果,因此很难扩展或做一个findall/3
例子。
% direct routes
findRoute(X,Y,Lines,Output) :-
line(Line,Stations),
\+ member(Line,Lines),
member(X,Stations),
member(Y,Stations),
append(Output,[[X,Line,Y]],NewOutput),
print(NewOutput).
% needs intermediate stop
findRoute(X,Y,Lines,Output) :-
line(Line,Stations),
\+ member(Line,Lines),
member(X,Stations),
member(Intermediate,Stations),
X\=Intermediate,Intermediate\=Y,
append(Output,[[X,Line,Intermediate]],NewOutput),
findRoute(Intermediate,Y,[Line|Lines],NewOutput).
line
是一个带有一个原子和一个包含站点的列表的谓词。
例如:line(s1, [first_stop, second_stop, third_stop])
所以我要做的是print
在第 11 行去掉它,并在我的规则中添加一个额外的变量来存储结果以供以后使用。但是我失败了,因为无论我尝试什么,它要么进入无限循环,要么返回 false。
现在:
?- findRoute(first_stop, third_stop, [], []).
% prints [[first_stop,s1,third_stop]]
想:
?- findRoute(first_stop, third_stop, [], R).
% [[first_stop,s1,third_stop]] is stored in R