2014-11-02 4 views
0

У меня возникли проблемы со следующей проблемой в Прологе, у меня есть несколько фактов в базе знаний, например:Trouble получить список командировочных путей в Прологе

flight(rome,london,ba,1500,150,400). 
flight(london,newyork,airfrance,600,60,200). 
flight(rome,paris,airfrance,1200,120,500). 
flight(paris,newyork,airfrance,600,60,200). 
flight(newyork,london,ba,1500,240,300). 

Я заинтересован только в получении списка все возможные маршруты от X до Y. Я понимаю, что я должен использовать рекурсивное правило и что мне нужно добавить места, которые были просмотрены в список, чтобы остановить цикл, продолжающийся снова и снова, поскольку траектории полета в базе знаний имеют несколько циклов.

то, что я до сих пор:

flight_route(X,Y):- 
    flight(X,Y,A,B,C,D). 

trip(X,X,[]). 
trip(X,Z,T) :- 
    flight_route(Y,Z), 
    not(member(Y,T)), 
    trip(X,Y,[Y|T]). 

по какой-то причине, когда я смотрю на след, правило не удается, когда он пытается проверить, что нет (член (Y, T)), но я не могу понять, почему это так.

ответ

0

Проблема заключается в вашем определении предиката trip/3. Попробуйте:

В первом пункте, когда вы в пункт назначения, это не имеет значения, как вы туда попали. Следовательно, (анонимная) переменная в третьем аргументе. Кроме того, вероятно, более эффективно найти путь, начинающийся с точки начала, а не точки назначения. Возможной проблемой может быть и то, как вы вызываете предикат trip/3. Не забудьте позвонить ему с пустым списком, переданным по третьему аргументу (если вы не заземлили T, звонок \+ member(Y, T) всегда будет работать). Или определить trip/2 аргумент к абстрактной, что детали реализации:

trip(X, Y) :- 
    trip(X, Y, []). 
+0

Спасибо за ваш ответ, я могу видеть, как ваше предложение имеет смысл, но один что я не уверен в том, как написать список Т. После внесения изменений, которые вы предложили, я могу запросить например (rome, newyork). который возвращает True. Однако я не уверен, как вернуть и записать на консоль все возможности списка Т. Когда я запрашиваю (rome, newyork, T). Я получаю ложный результат. Еще раз спасибо за ваш совет. – user2928132

+0

Подсказка: вы можете использовать ** дополнительный ** аргумент, чтобы вернуть путь между двумя подключенными аэропортами. Аргумент (текущий) список - это просто избежать циклов. –

+0

Благодарим вас за ответ Пауло. Кажется, я понял это сейчас. – user2928132

 Смежные вопросы

  • Нет связанных вопросов^_^