由于Prolog的回溯在目标中循环,我的多重解决方案问题出现了。虽然我理解,从技术上讲,提供的每个解决方案都是正确的,但对我来说没用。有没有删除重复项的方法?
到目前为止,这是我的代码:
flight(london, paris).
flight(paris, amsterdam).
flight(amsterdam, rome).
flight(rome, paris).
flight(rome, rio_de_janeiro).
route_from(A,B) :-
flight(A,B).
route_from(A,B) :-
flight(A,R),
route_from(R,B).
示例查询是:
?- route_from(A, paris).
A = london ;
A = rome ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
A = london ;
etc.
问候。
答案 0 :(得分:4)
除了返回重复的解决方案之外,您还有一个更大的问题。由于图表中存在循环,因此您的程序将无限循环。
为了避免循环,您可以维护一个访问过的城市列表:
route_from(A,B) :-
route_from(A,B, []).
route_from(A,B, _) :-
flight(A,B).
route_from(A,B, Visited) :-
flight(A,R),
\+ member(A, Visited),
route_from(R,B, [A|Visited]).
现在,如果有多种方式去城市,这不会阻止返回重复项。您可以使用setof/3
+ member/2
收集所有解决方案而无需重复。
route_from_without_duplicates(A,B):-
setof(A-B, route_from(A,B), Routes),
member(A-B, Routes).