我试图找出一种方法来检查列表是否从更多到更少排序。我找到了一种方法,可以按照以下规则以适当的方式检查它。
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
答案 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
)).