2016-05-12 4 views
0

をマージ:?プロローグ - 算術平均と私はプロローグでこのクエリを持って

- オーダー([[PERSON1、[7,8,8,9]]、[PERSON2、[8,9,8 、9]]、[person3、 [6,7,5,4]]、X)。

X = [[PERSON2、[8,9,8,9]、8.5]、[PERSON1:私は、マージを使用し、このような何かを一人一人の算術平均を必要と

、[7,8,8,9]、8]、[person3、[6,7,5,4]、5.5]]。

私は1つのリストの算術平均を得る方法を知っていますが、この場合は再帰的なものが必要になると思います。

誰かが私を助けることができますか?

+1

"mergesort"とは何を意味するのかはっきりしていません。平均を見つけて、この平均値を降順でソートしたいですか?なぜ "mergesort"が特別なのですか?組み込みソート述部を使用できますか? –

+0

問題はありませんが、任意のソート方法を使用できます。 – DualCortex

答えて

3

リストの各メンバーに述語を適用して新しいリストを取得するのは、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言語で実装されており、実際はまったく関係ありません。

+0

素晴らしい!それは完璧に動作します、ありがとう! – DualCortex

関連する問題