У меня возникли проблемы со следующей проблемой в Прологе, у меня есть несколько фактов в базе знаний, например: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)), но я не могу понять, почему это так.
Спасибо за ваш ответ, я могу видеть, как ваше предложение имеет смысл, но один что я не уверен в том, как написать список Т. После внесения изменений, которые вы предложили, я могу запросить например (rome, newyork). который возвращает True. Однако я не уверен, как вернуть и записать на консоль все возможности списка Т. Когда я запрашиваю (rome, newyork, T). Я получаю ложный результат. Еще раз спасибо за ваш совет. – user2928132
Подсказка: вы можете использовать ** дополнительный ** аргумент, чтобы вернуть путь между двумя подключенными аэропортами. Аргумент (текущий) список - это просто избежать циклов. –
Благодарим вас за ответ Пауло. Кажется, я понял это сейчас. – user2928132