我创建了一个使用天数的简单程序。在示例程序中,我假设三天。
等待天数(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).