应用谓词到列表中的每个成员,以获得新的名单是什么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