0

私のデータベースはこれに似ています:

% happy(Person,Happiness)
happy(1,10).
happy(2,5).
happy(3,8).
happy(4,1).

私は人々を幸せに分類したいと思います。

私は以下をコーディングしました、そしてそれは私が望むことをします。しかし、それは私には面倒に見えました。何か改善はありますか?

? - sortPeople(Ts).
Ts = [1, 3, 2, 4].

私の解決策:

getFirst([],R,R).
getFirst([[H1,_]|T],F,R) :-
    append([H1],F,R1),
    getFirst(T,R1,R).

compareHappiness(X, [_,S1], [_,S2]) :- compare(X, S1, S2).

sortPeople(Ts) :-
    findall([X,Y], happy(X,Y), List), 
    predsort(compareHappiness, List, SortedList),
    getFirst(SortedList,[],Ts).
4

2 に答える 2

2

より記述的で宣言的な述語名を使用することを検討してください。次に例を示します。

person_happiness(1, 10).
person_happiness(2, 5).
person_happiness(3, 8).
person_happiness(4, 1).

人々を幸せで分類するには、組み込みのを使用することを検討してください。keysort/2これは、よりも効率的ですpredsort/3。キーと値のペアを作成するだけでよく、慣例によりファンクター-/ 2が使用されます。補助述語の代わりに、SWI-Prologビルトインの使用を検討してpairs_values/2くださいreverse/2

descending_happiness(Ps) :-
        findall(H-P, person_happiness(P, H), HPs),
        keysort(HPs, HPs1),
        pairs_values(HPs1, Ps1),
        reverse(Ps1, Ps).

クエリの例:

?- descending_happiness(Ps).
Ps = [1, 3, 2, 4].
于 2012-12-08T19:19:32.473 に答える
1

-これが私が得たものです:

sort(Rez) :- findall([Happiness,PId],happy(PId,Happiness),List),
             msort(List,LSorted),
             findall(PersonID,member([_,PersonID],LSorted),Sorted),
             reverse(Sorted,Rez).
于 2012-12-08T19:34:01.303 に答える