2015-09-22 6 views
1

У меня есть эта база знаний в пролог воздуха компании и их flighs:Рекурсия в Прологе и более

flight(departure,arrive,day). 

flight(london,paris,monday). 
flight(paris,barcelona,thursday). 
flight(paris,madrid,sunday). 
flight(madrid,lisbon,saturday). 

рекурсивные правила:

connection(Departure,Arrive):-flight(Departure,Arrive,Day). 
connection(Departure,Arrive):-flight(Departure,X,Day),connection(X,Arrive). 

И с этим я могу задать вопрос: есть ли возможно ли соединение между Лондоном и Барселой?

вопрос: connection(london,barcelona).

И ответ будет интерпретация положительным. Но есть ли какие-либо правила/вопросы, которые я могу сделать, чтобы он мог дать мне более подробную информацию?

например: связь между Лондоном и Барселоной является прямой или косвенной?

другой вопрос: Я хотел бы знать, когда рейс косвенный, какой город посередине? (В приведенном выше примере это будет «париж», например.

может кто-нибудь помочь мне понять это?

+0

Да, вы можете построить свои предикаты, чтобы вы могли определить, является ли полет прямым или косвенным. Один из способов - собрать маршрут в списке в качестве дополнительного аргумента. Если маршрут имеет более двух элементов, он косвенный. Он также отвечает на вопрос о том, какой город или города находятся между ними. – lurker

+0

спасибо u. но можете ли вы привести пример? Я новичок в Prolog, и я не знаю, как начать его. – cdiogo7

+0

Пожалуйста, добавьте больше данных! Прямо сейчас «будний день» игнорируется ... не следует ли его каким-то образом использовать? – repeat

ответ

0

Я создал простую программу, которая использует дней. В примере программы, я полагаю, три дня. ..

waiting_days (3)/* получить указанный день недели, например 3 дня с понедельника -> понедельник, вторник, среда */

Пожалуйста, измените дни waiting_days И я сделал. другие исправления.

Я проверил следующие программы по SWI-Prolog и LPA Prolog.

/* flight_city(london,barcelona, monday). */ 

weekday([sunday, monday, tuesday, wednesday, thursday, friday, saturday]). 
waiting_days(3). /* acquire the specified day of the week. For example 3 day monday -> monday, tuesday, wednesday */ 


flight_city(Departure, Arrive, Day) :- 
     connection(Departure, Arrive, Day, []). 

connection(Departure, Arrive, Day, City_list) :- 
     flight(Departure, Arrive, Flight_Day), 

     not(member(Departure, City_list)), 

     waiting_days_get(Day, Days), 

     member(Flight_Day, Days), 
%  !, 
     append([Arrive, Departure], City_list, City_list2), 
     reverse(City_list2, City_list3), 

     write_city_list(City_list3), 

     fail. 

connection(Departure,Arrive, Day, City_list) :- 
     flight(Departure,X,Flight_Day), 

     /* Prevention of an infinite loop */ 
     not(member(Departure, City_list)), 

     waiting_days_get(Day, Days), 

     member(Flight_Day, Days), 

     append([Departure], City_list, City_list2), 

     connection(X, Arrive, Flight_Day, City_list2). 


direct_check(2, _, []) :- !. 

direct_check(Citys_number, [_ | Result], Middle) :- 
     2 < Citys_number, !, 
     middle_get(Result, Middle). 

direct_check(_, _, _) :- fail. 


middle_get([_], []) :- !. 

middle_get([First | Result], [First | Result2]) :- 
     middle_get(Result, Result2). 


waiting_days_get(Today, Days) :- 
     weekday(Weekday), 
     waiting_days(Count), 
     (7 < Count -> Count2 is 7; 
     Count2 is Count 
     ), 
     waiting_days_get_this_week(Weekday, Today, Count2, This_week_days), 
     length(This_week_days, Num2), 
     Count3 is Count2 - Num2, 
     waiting_days_get_next_week(Count3, Weekday, Next_week_days), 
     append(This_week_days, Next_week_days, Days). 



waiting_days_get_this_week([Today |Result ], Today, Count, Days) :- 
     !, 
     waiting_days_get_main(Count, [Today | Result], Days). 

waiting_days_get_this_week([_ | Result], Today, Num, Days) :- 
     waiting_days_get_this_week(Result, Today, Num, Days). 


waiting_days_get_main(0, _, []) :- !. 

waiting_days_get_main(_, [], []) :- !. 

waiting_days_get_main(Count, [Day | Result], [Day |Result2 ]) :- 
     Count2 is Count - 1, 
     waiting_days_get_main(Count2, Result, Result2). 



waiting_days_get_next_week(0, _, []) :- !. 

waiting_days_get_next_week(Count, [First | Result], [First | Days]) :- 
     Count2 is Count - 1, 
     waiting_days_get_next_week(Count2, Result, Days). 


write_city_list(City_list3) :- 

     length(City_list3, Citys_number), 

     direct_check(Citys_number, City_list3, Middle), 

     write(City_list3), nl, 

     (Citys_number == 2 -> write('direct'), nl, nl; 
     write('indirect'), nl, 
     write(Middle), nl, nl 
     ), !. 



flight(london,paris,monday). 
flight(paris,barcelona,thursday). 
flight(paris,madrid,sunday). 
flight(madrid,lisbon,saturday). 
flight(london,tokyo,monday). 
flight(tokyo, paris, monday). 
flight(london,barcelona,monday). 
flight(london,lisbon,monday). 
flight(lisbon,barcelona,monday). 
flight(tokyo,london,monday). 
Смежные вопросы