應用謂詞到列表中的每個成員,以獲得新的名單是什麼maplist
是。對於排序,你可以使用內置的keysort/2
,或者,如果您有最新的SWI-Prolog的版本,sort/4
。然而,這將是更好,如果你使用的對(例如),而不是其他的項目列表中(你知道的「東西」的數量,畢竟):
person_vals_mean([P, Vs], Mean-[P, Vs]) :-
numlist_mean(Vs, Mean). % assuming you have defined it elsewhere
order(PVs, Ordered) :-
maplist(person_vals_mean, PVs, PVMs),
keysort(PVMs, Ordered_rev),
reverse(Ordered_rev, Ordered).
這可能是明智的,也得到完全擺脫名單:爲什麼[person, [1,2,3]]
而不是person_vals(person, [1,2,3])
?有了這個表現,你可以重寫person_vals_mean/2
爲:
person_vals_mean(person_vals(P, Vs), Mean-person_vals(P, Vs)) :- ...
或者,如果你可以用sort/4
,甚至:
person_vals_mean(person_vals(P, Vs), person_vals_mean(P, Vs, M)) :-
numlist_mean(Vs, M).
order_by_means(PVs, Ordered) :-
maplist(person_vals_mean, PVs, PVMs),
sort(3, @>=, PVMs, Ordered).
然後:
?- order_by_means([person_vals(person1, [7,8,8,9]),
person_vals(person2, [8,9,8,9]),
person_vals(person3, [6,7,5,4])],
Ordered).
Ordered = [person_vals_mean(person2, [8, 9, 8, 9], 8.5),
person_vals_mean(person1, [7, 8, 8, 9], 8),
person_vals_mean(person3, [6, 7, 5, 4], 5.5)].
由於事實上,所有在SWI-Prolog中對內置插件進行排序都使用合併排序算法,但這是用C語言實現的,而且非常不相關。
不太清楚你所說的「歸併」的意思是:你想隨便找的手段和排序這意味着按遞減順序?爲什麼「mergesort」具體?你可以使用內置的排序謂詞嗎? – 2016-05-12 11:53:08
沒問題,可以使用任何排序方法。 – DualCortex