我有一个通过Prolog计划连接新西兰小镇的问题。我收到了一系列数据,包括道路,往返路径以及距离。我认为第一个问题是直截了当的,但我已经把头发拉了好几个小时没有运气,所有我要做的就是打印一条可行路径。为什么以下解决方案无法找到正确的路径?
road('Wellington', 'Palmerston North', '143').
road('Palmerston North', 'Wanganui', '74').
road('Palmerston North', 'Napier', '178').
road('Palmerston North', 'Taupo', '259').
road('Wanganui', 'Taupo', '231').
road('Wanganui', 'New Plymouth', '163').
road('Wanganui', 'Napier', '252').
road('Napier', 'Taupo', '147').
road('Napier', 'Gisborne', '215').
road('New Plymouth', 'Hamilton', '242').
road('New Plymouth', 'Taupo', '289').
road('Taupo', 'Hamilton', '153').
road('Taupo', 'Rotorua', '82').
road('Taupo', 'Gisborne', '334').
road('Gisborne', 'Rotorua', '291').
road('Rotorua', 'Hamilton', '109').
road('Hamilton', 'Auckland', '126').
route(Current, Finish, []) :- route(Current, Finish, [Current]).
route(Current, Finish, _) :- Current==Finish.
route(Current, Finish, Visits) :- traverse(Current, Next, Visits), route(Next, Finish, Visits).
traverse(Current, Next, [Next|_]) :- road(Current, Next, _).
每当我打电话:route('Wellington','Napier', X).
尽管有一条路径, Wellington-> Palmerston North-> Napier ,它仍会失败。在此先感谢,我知道我可能做了一些蠢事,因为我是Prolog的新手。
答案 0 :(得分:2)
我认为你有一些你不需要的额外条款:
route(Current, Current, [Current]).
route(Current, Finish, [Current|T]) :- road(Current, Next, _),
route(Next, Finish, T).
示例:
?- route('Wellington','Napier', X).
X = ['Wellington', 'Palmerston North', 'Wanganui', 'Napier'] ;
X = ['Wellington', 'Palmerston North', 'Napier'] ;
false.
请注意,road('X','Y').
形式的已定义条款表示从'X'
到'Y'
的道路,但反之亦然:
?- route('Palmerston North','Wellington',L).
false.
所以你宣布的道路只是单向的。
如果你添加敌人的例子:
road('Palmerston North','Wellington', '143').
然后,如果您查询:
?- route('Wellington','Wellington', X).
X = ['Wellington'] ;
X = ['Wellington', 'Palmerston North', 'Wellington'] ;
X = ['Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington'] ;
X = ['Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington']
继续......所以它落入了圈子。 要解决这个问题,你可以写:
route2(X,Y,L,N):- length(L,N),route(X,Y,L),sort(L,L).
所以你给出了路径的长度(因为它会因周期而搜索)并且只使用sort(L,L).