0

如何在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
4

3 回答 3

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.
于 2013-10-25T21:45:21.017 回答
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 的列表,因为我认为它更清楚地表达了意图并使得代码更易于维护。

于 2013-10-25T14:49:41.897 回答
0

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

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)
    ).
于 2013-10-25T18:43:53.713 回答