排序谓词
Sorting predicates
我有这个谓词,
date(YYYY,MM,DD).
immigrant(IdPerson,Date).
我想知道最近移民的IdPerson
。我看到了解决方案并得到了这个:
most_recent_immigrant(IDPerson):-
findall(immigrants1(Data,IdPerson), immigrant(IDPerson,Data), ListOfImmigrants).
sort(ListOfImmigrants,List),
last(List, immigrants1(Data,IDPerson)).
所以,如果我很好地理解了这个练习,我们需要按日期排序,但是单独排序怎么能做到这一点呢?或者我需要其他东西来完成这项工作吗?
您可以尝试这样的操作:
most_recent_immigrant( Immigrant ) :-
findall( immigrant(X,D) , immigrant(X,D) , L ) ,
predsort( immigrant_compare , L , [Immigrant|_] ) .
immigrant_compare( = , immigrant(_,X) , immigrant(_,X) ) :- X = Y .
immigrant_compare( < , immigrant(_,X) , immigrant(_,Y) ) :- X > Y .
immigrant_compare( > , immigrant(_,X) , immigrant(_,Y) ) :- X < Y .
但是,由于您在任何给定日期可能有多个移民,我可能会这样做:
most_recent_immigrants( Immigrants ) :- % to find the most recently arrived immigrant(s)...
setof( D , immigrant(_,D) , Ds ) , % get the [ordered] set of dates
last( M , Ds ) , % the last item is the most recent dates
findall( immigrant(N,D) , immigrant(N,D) , Immigrants ) % find all the immigrants on the specified date
.
我有这个谓词,
date(YYYY,MM,DD).
immigrant(IdPerson,Date).
我想知道最近移民的IdPerson
。我看到了解决方案并得到了这个:
most_recent_immigrant(IDPerson):-
findall(immigrants1(Data,IdPerson), immigrant(IDPerson,Data), ListOfImmigrants).
sort(ListOfImmigrants,List),
last(List, immigrants1(Data,IDPerson)).
所以,如果我很好地理解了这个练习,我们需要按日期排序,但是单独排序怎么能做到这一点呢?或者我需要其他东西来完成这项工作吗?
您可以尝试这样的操作:
most_recent_immigrant( Immigrant ) :-
findall( immigrant(X,D) , immigrant(X,D) , L ) ,
predsort( immigrant_compare , L , [Immigrant|_] ) .
immigrant_compare( = , immigrant(_,X) , immigrant(_,X) ) :- X = Y .
immigrant_compare( < , immigrant(_,X) , immigrant(_,Y) ) :- X > Y .
immigrant_compare( > , immigrant(_,X) , immigrant(_,Y) ) :- X < Y .
但是,由于您在任何给定日期可能有多个移民,我可能会这样做:
most_recent_immigrants( Immigrants ) :- % to find the most recently arrived immigrant(s)...
setof( D , immigrant(_,D) , Ds ) , % get the [ordered] set of dates
last( M , Ds ) , % the last item is the most recent dates
findall( immigrant(N,D) , immigrant(N,D) , Immigrants ) % find all the immigrants on the specified date
.