2

我的多重解决方案问题是由于 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.

问候。

4

1 回答 1

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).
于 2013-04-26T18:58:49.543 回答