найти путь в прологе - PullRequest
0 голосов
/ 05 января 2011

Привет, у меня есть эти данные

Quote:

flight(Place1,Place2,departure time,Arrival time,flight code,Day)
flight(paris,milano,6,8,ba4733,mo).
flight(milano,london,9,10,ba4733,mo).
flight(london,athens,10,15,ba4733,mo).
flight(milano,paris,10,15,ba4733,mo).

Я хочу найти все пути между двумя местами, например

?- route(paris,athens,mo,A).

A = [flight(paris,milano,ba4733,8), flight(milano,london,ba4733,10), flight(london,athens,ba4822,15)] ;

также для полета из места1 в место2 нужны День1 = День2 иВремя прибытия <= время отправления </p>

Я сделал это, но моя программа действительно плохо работает:

apeuthias_ptisi(P1,P2):-ptisi(P1,P2,_,_,_,_).
flight(P1,P2,COD,AF):-ptisi(P1,P2,_,AF,COD,_).


antapokrisi(P1,Y,P1):-!.
antapokrisi(P1,Y,P2):-ptisi(P1,Y,AN1,AF1,COD1,DAY1),
ptisi(Y,P2,AN2,AF2,COD2,DAY2), AF1=<AN2, DAY1==DAY2.


path(X,Y,D,L2):-c2(X,Y,[],D,L),reverse(L,L2).

c2(X,X,L,D,L):-!.
c2(X,Y,L,D,L2):-antapokrisi(X,Z,P2),ptisi(X,Z,AN,AF,COD,D),not(member(Z,L)),c2(Z,Y,[flight(X,Z,COD,AF)|L],D,L2).



route(P1,P1,D,R):-!.
route(P1,P2,D,R2):-setof(R,path(P1,P2,D,R),R2).

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 06 января 2011

Поскольку это домашнее задание, я не буду давать полное решение, но вот несколько советов, которых должно быть достаточно:

По сути, это та же проблема, что и "является ли человек А предком человека Б", что вы, вероятно, уже сделали (или рассматривали решение в качестве примера). Эта проблема имеет только пару дополнительных ограничений (из вашего вопроса: «для перелета с места 1 на место 2 нужен день 1 = день 2 и время прибытия <= время вылета»). </p>

Несколько полезных вещей:

  • X =< Y будет успешным, если X меньше или равно Y
  • Ваш предикат route должен быть рекурсивным, с двумя ветвями: базовым и рекурсивным.
  • Чтобы найти базовый вариант, подумайте о том, как проще всего проложить маршрут от А до Б.
  • Из базового случая найдите рекурсивный шаг, найдя наименьший способ расширить существующий путь.

Надеюсь, этого достаточно, чтобы решить вашу проблему.

0 голосов
/ 10 января 2011

Пожалуйста, не используйте следующее для решения домашнего задания;это может быть ужасно неправильно!Это также написано в моем (возможно, плохом) стиле программирования Пролога.Я решил эту проблему с помощью известного предка предка для родословных:

ancestor( X, Y ) :-
    parent( X, Y ).
ancestor( X, Y ) :-
    parent( X, Z ), 
    ancestor( Z, Y ).

, где родительский элемент определен обычным образом, как и другие предикаты, которые он использует.

Есть ли еще правила полета / 6, которые вам дали?

% list of flights
% need more to properly test really
flight( paris, milano, 6, 8, ba4733, mo).
flight( milano, london, 9, 10, ba4733, mo ).
flight( london, athens, 10, 15, ba4733, mo ).
flight( milano, paris, 10, 15, ba4733, mo ).
flight( milano, paris, 17, 15, ba4733, mo ).

% clause to add an intermediate variable
route( Start, End, Day, F ) :-
    route( Start, End, Day, [], F ), !.
% base case
% we use reverse/2 as [Head|List] notation means
% that the list is backwards
route( Start, End, Day, Inter, F ) :-
    flight( Start, End, ST1, ET1, Code1, Day ),
    ET1 >= ST1,
    F1 = [flight( Start, End, ST1, ET1, Code1, Day )|Inter],
    reverse( F1, F ).
% recursive case
% start and end times checked on each recursion so the
% overall start and end time must satisfy our constraint
% of end time >= start time
route( Start, End, Day, Inter, F ) :- 
    flight( Start, Somewhere, ST1, ET1, Code1, Day ),
    ET1 >= ST1,
    route( Somewhere, End, Day, [flight(Start, Somewhere, ST1, ET1, Code1, Day)|Inter], F ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...