リストの各メンバーに述語を適用して新しいリストを取得するのは、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])
?あなたも、sort/4
を使用することができれば、
person_vals_mean(person_vals(P, Vs), Mean-person_vals(P, Vs)) :- ...
または::
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)].
を、この表現を使うと、としてperson_vals_mean/2
を書き換えることができますSWI-Prologのすべてのソート組み込み関数はマージソートアルゴリズムを使用しますが、これはC言語で実装されており、実際はまったく関係ありません。
"mergesort"とは何を意味するのかはっきりしていません。平均を見つけて、この平均値を降順でソートしたいですか?なぜ "mergesort"が特別なのですか?組み込みソート述部を使用できますか? –
問題はありませんが、任意のソート方法を使用できます。 – DualCortex