如何比较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
答案 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)
).