按列表大小对结构列表进行排序

时间:2015-01-03 23:27:39

标签: prolog

我需要按照这种格式对结构列表进行排序:(A, B, [...])按列表的长度排序。

例如,如果我有:

[(A,B,[1,2,3,4]),(A,B,[1,2]),(A,B,[1,2,3,4,5]),(A,B,[1,2,3])]

排序后我想要这个:

[(A,B,[1,2]),(A,B,[1,2,3]),(A,B,[1,2,3,4]),(A,B,[1,2,3,4,5])]

我该怎么做?

1 个答案:

答案 0 :(得分:4)

将每个元素El映射到结构N-El并使用内置的keysort/2

el_keyed(El,N-El) :-
   El = (_,_,L),
   length(L, N).

list_lulasorted(Els, ElsS) :-
   maplist(el_keyed, Els, KVs),
   keysort(KVs, KVsS),
   maplist(el_keyed, ElsS, KVsS).

如果您的Prolog系统未提供maplist/3,请参阅this answer

最后一步可能是"加速"由:

keyvalue_value(_-V, V).

..., maplist(keyvalue_value, KVsS, ElsS), ...

或者,使用library(lambda)不需要辅助定义:

list_lulasorted(Els, ElsS) :-
   maplist(\El^(N-El)^( El=(_,_,L), length(L, N) ), Els, KVs),
   keysort(KVs, KVsS),
   maplist(\(_-V)^V^true, KVsS, ElsS).

一些注意事项:(A, B, L)不像Haskell或ML那样频繁。相反,请使用.(A, B, L)(A*B)-L之类的结构,具体取决于AB的实际含义。