Prolog - 发送列表作为要显示的参数

时间:2011-10-25 23:22:35

标签: list prolog

我正在尝试编写一个程序来查找城镇之间的路线,添加路径到列表然后,广告结束显示它。 我认为添加到列表工作,但我有问题显示列表,不知道如何将列表作为参数传递,以便在找到路径时使用?希望你们能帮忙。这是代码:

connected(middlesbrough, stockton).
connected(middlesbrough, darlington).
connected(stockton, sunderland).
connected(darlington, thirsk).
connected(stockton, newcastle).
connected(newcastle, york).
connected(thirsk, york).
connected(york, leeds).
connected(leeds, huddersfield).
connected(leeds, dewsbury).
connected(huddersfield, manchester).
connected(dewsbury, manchester).


run(List):- 
  write('Enter Starting City :'), 
  read(Start), 
  write('Enter Finishing City :'), 
  read(End),  
  findroute(Start,End),
writeList([List]).

findroute(Start,End):-
connected(Start,End).
findroute(Start,End):-

add(Start, List, [Start | List]),

connected(Start,Link), findroute(Link,End).


add(A,B,[A|B]).

 writeList([]).      
writeList([Head | Tail]):-   
  write(Head),               
  nl,                             
  writeList(Tail).                 

1 个答案:

答案 0 :(得分:2)

您的findroute/2谓词不会返回列表,因此输出无效。

调用应如下所示:findroute(Start,End,List)

显然,findroute/2谓词必须更改为findroute/3

findroute(Start,End,[Start,End]):-
    connected(Start,End).
findroute(Start,End,List):-
    connected(Start,Link),
    add(Start,Rest,List),
    findroute(Link,End,Rest).

(提示:请确保您理解为什么add/3调用有效,即使Rest在此时未实例化。否则您的导师将不相信此代码是您的作业!;-))

如果您只想找到最短的路线,可能需要在第一个子句的末尾添加剪切。

最后,List已经是一个列表了,所以在调用writeList/1时不要在它周围加上方括号!