Пролог - отправка списка в качестве параметра для отображения - PullRequest
0 голосов
/ 26 октября 2011

Я пытаюсь написать программу, чтобы найти маршрут между городами, добавить путь в список и затем показать его в конце. Я думаю, что добавление в список работает, но у меня проблема с отображением списка, не знаю, как я могу передать список в качестве параметра, который будет использоваться, когда он завершит поиск пути? Надеюсь, вы, ребята, можете помочь. Вот код:

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 Ответ

2 голосов
/ 26 октября 2011

Ваш предикат 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...