我在Prolog中有一个列表,如下所示:
[(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3),...]
第一个元组的第一个元素位于[b,p]
,第二个元素位于[x,y,z]
,第三个元素位于[1,2,3,4,5,6,7]
。
如何对此元组列表进行排序,以便上面的列表示例变为:
[(b,y,2),(b,y,3),(p,x,3),(p,y,3),(p,z,1),(p,z,2),...]
也就是说,b出现在p之前,x出现在y和z之前,并对数字进行排序。
答案 0 :(得分:4)
如果要对SICStus中保留重复条目进行排序,许多其他Prolog使用keysort/2
:
msort(Keys, KeysS) :-
keys_pairs(Keys, Pairs), % pairs_keys(Pairs, Keys)
keysort(Pairs, PairsS),
pairs_keys(PairsS, KeysS).
keys_pairs([], []).
keys_pairs([K|Ks], [K-_|Ps]) :-
keys_pairs(Ks, Ps).
pairs_keys([], []).
pairs_keys([K-_|Ps],[K|Ks]) :-
pairs_keys(Ps, Ks).
SICStus和许多其他Prolog需要keys_pairs/2
和pairs_keys/2
来进行有效的映射。
答案 1 :(得分:3)
使用apropos
apropos( sort ).
它表明有一些内置谓词可以帮助您解决问题 - sort
删除重复项,msort
不删除重复项。
?- sort( [(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3)], X).
X = [ (b, y, 2), (b, y, 3), (p, x, 3), (p, y, 3), (p, z, 1), (p, z, 2)].
?- msort( [(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3)], X).
X = [ (b, y, 2), (b, y, 3), (p, x, 3), (p, y, 3), (p, z, 1), (p, z, 2)].
答案 2 :(得分:2)
使用SWI-Prolog,你可以使用predsort(+ Pred,+ List,-Sorted)并定义你自己的方法来排序元组(但msort,如果不删除重复项就可以很好地工作)。
答案 3 :(得分:1)
你可以使用sort(+ List,-Sorted)。但请注意sort / 2会删除重复的条目。