检查列表是否已排序

时间:2016-07-07 01:08:28

标签: prolog

我试图找出一种方法来检查列表是否从更多到更少排序。我找到了一种方法,可以按照以下规则以适当的方式检查它。

ordered( []      ) .
ordered( [_]     ) .
ordered( [X,Y|Z] ) :- X =< Y , ordered( [Y|Z] ) .

但是,我想要做的并不是那么简单。这是我的数据库。

%travelto(Traveler,Traveling_to,Distance,Cost).
travelto(lyla,josh,300,45).
travelto(martin,john,250,55).
travelto(leo,najma,100,20).
travelto(diana,kyle,230,15).
travelto(michael,lucy,90,15).
travelto(sam,kate,300,40).
travelto(jason,cindy,170,26).
travelto(julia,nayma,110,10).

我想在查询中键入Traveler列表,并检查列表是否从更多到更少或不按Cost排序。如果列表已排序,我希望prolog返回true,否则返回false。我尽我所能,仍然没有得到答案。有人可以帮助我吗?

?- checkOrder([martin,lyla,michael,julia]). %example of query I want to type in prolog
true. %return I am expecting from above query

?- checkOrder([martin,lyla,michael,sam]). %example of query I want to type in prolog
false. %return I am expecting from above query

1 个答案:

答案 0 :(得分:0)

构建费用清单,然后重复使用您的代码:

checkOrder(Persons) :-
  findall(C, (member(P,Persons), travelto(P,_,_,C)), Costs),
  ordered(Costs).

但是需要更改ordered / 1,因为它现在检查升序排序:

...  :- X >= Y , ...

否则,在订购前反转/ 2成本/ 1

或者,只是为了说明替代方案(有序/ 1不要求):

checkOrder(Persons) :-
  forall(append(_, [P,Q|_], Persons), (
    travelto(P,_,_,C), travelto(Q,_,_,D), C >= D
  )).