Prolog 排序谓词

Prolog 排序谓词,prolog,Prolog,我有这个谓词 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

我有这个谓词

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
  .

谓词不能以大写字母开头。将
日期/3
更正为
日期/3
移民/2
更正为
移民/2
。抱歉输入错误。已在更改。请将对放入
listofimigrants
而不是
immigrants 1/2
术语中,然后查看是否对您有帮助。请更新问题陈述中的代码,以使用大写的functor修复此问题(代码中仍有一些错误,例如
Immigrant(IDPerson,Data)
。另一方面,如果您使用
setof/3
而不是
findall/3
,结果将已经被排序,您不需要单独的
sort/2
。最后,无论是哪种情况,排序都“聪明”到足以知道,
a(X1,Y1)
大于
a(X2,Y2)
如果
X1
X2
。那么对
移民列表进行排序1/2
将满足您的需要。或者,按照@TudorBerariu的指示使用
键排序/2
。感谢您的帮助。