如何比较作为参数传递的List元素?

时间:2013-10-25 14:14:27

标签: prolog

如何比较Prolog中两个列表的两个元素? find应返回下一个可用路线,因此Departure应小于或等于Dep

%fact    
    plane('JFK','BLL', [13,00],[23,00]).
%rule
    find(A,B,Departure,Arrival):-
       plane(A,B,Dep,Arr)
       % compare Departure and Dep ...   to be sure we pick up right plane

3 个答案:

答案 0 :(得分:1)

%fact    
    plane('JFK','BLL', [13,00],[23,00]).

%rule
    find_flight(A,B,Departure,Arrival):-
       plane(A,B,Dep,Arr),
       % compare Departure and Dep ...   to be sure we pick up right plane
       is_no_later_than(Departure, Dep).

    is_no_later_than([H1,M1], [H2,M2]) :-
       Mins1 is H1*60 + M1,
       Mins2 is H2*60 + M2,
       Mins1 =< Mins2.

答案 1 :(得分:0)

由于你知道时间是两个元素的列表,你可以在头部使用统一来将列表分成几个部分:

% isNoEarlierThan( Time1, Time2 )
% is true just in case Time1 is equal to or later than Time2
isNoEarlierThan( [Time1Hours, Time1Mins], [Time2Hours, Time2Mins] ) :-
    Time1Hours >= Time2Hours,
    Time1Mins >= Time2Mins.

然后:

find(A,B,Departure,Arrival):-
   plane(A,B,Dep,Arr),
   isNoEarlierThan( Dep, Departure ),
   isNoEarlierThan( Arrival, Arr ).

就个人而言,我会使用time/2术语而不是将时间编码为长度为2的列表,因为我认为它更清楚地表达了意图并使代码更易于维护。

答案 2 :(得分:0)

假设您有多个plane(Source,Dest,Dep,Arr)形式的事实,我会遵循先前关于使用二元词而不是带有2个元素的列表的评论来表示出发/到达时间。此外,根据您的描述,我假设出发受到约束(即,给定,以便您想要在“阈值”之前找到离开的航班)。然后。你可以这样做:

find(A,B,Departure,Arrival) :-
   plane(A,B,Dep,Arrival),
   is_earlier(Departure,Dep).

 is_earlier(time(Hr1,Min1),time(Hr2,Min2)) :-
   (Hr1 > Hr2
   -> fail
   ; (Hr1 == Hr2
      -> Min1 =< Min2
       ; fail)
    ).