1

我在航空公司及其航班的序言中有这个知识库:

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).

答案将是肯定的。但是有什么我可以做的规则/问题可以给我更多的细节吗?

例如:伦敦和巴塞罗那之间的联系是直接的还是间接的?

其他问题:我想知道什么时候是间接航班,中间是哪个城市?(例如,在上面的示例中,它将是“巴黎”。

谁能帮我弄清楚?

4

1 回答 1

0

我创建了一个使用天数的简单程序。在示例程序中,我假设三天。

等待天数(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).
于 2015-09-23T11:39:01.587 回答