prolog:排序w.r.t.一些属性

时间:2012-12-08 18:45:45

标签: prolog

我的数据库与此类似:

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

我想要对人们进行排序w.r.t.他们的快乐。

我编写了以下内容,它可以满足我的需求。然而,对我来说这看起来很麻烦。有什么改进吗?

? - 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).

2 个答案:

答案 0 :(得分: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/2reverse/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].

答案 1 :(得分:1)

- 这就是我得到的:

sort(Rez) :- findall([Happiness,PId],happy(PId,Happiness),List),
             msort(List,LSorted),
             findall(PersonID,member([_,PersonID],LSorted),Sorted),
             reverse(Sorted,Rez).