我想根据自己的子列表的长度由短到长,以重新排列的列表。
该预期输出是:
rearrange([[a,b],[c],[a,b,c],[d,d,d],[d,s],[s],[d,s,s,a]],X).
X=[[c],[s],[a,b],[d,s],[a,b,c],[d,d,d],[d,s,s,a]].
我的想法是,先计算每一个长度,然后做重排。 什么到目前为止,我所做的就是收集其长度等于使用模式[长度号]第一子列表子列表的数量。
count([],[0-0]).
count([A|B],[L-N]):-
length(A,L),
same_length(B,L,M),
N is M+1.
same_length([],_,0).
same_length([A|B],L,N) :-
( length(A,L)->
same_length(B,L,M),
N=M+1
; same_length(B,L,N)
).
计数(LIST,X)输出是如下:
21 ?- count_slot([[2],[3],[4],[2,3,4]],X).
X = [1-3].
但预期输出为[1-3,3-1],我不知道如何处理,其余子列表(删除一个接一个?),并根据该模式重新排列[1-3,3-1 ]。
谁能帮助? 提前致谢。
在这种情况下, keysort/2
经常派上用场。 例如:
lists_ascending(Lists0, Lists) :-
maplist(list_with_length, Lists0, LLs0),
keysort(LLs0, LLs),
pairs_values(LLs, Lists).
list_with_length(List, L-List) :- length(List, L).
例如查询及其结果:
?- lists_ascending([[a,b],[c],[a,b,c],[d,d,d],[d,s],[s],[d,s,s,a]], Ls).
Ls = [[c], [s], [a, b], [d, s], [a, b, c], [d, d, d], [d, s, s, a]]
编辑 :下面的谓词,它使用上面的代码,各种你在下面的评论,这是由相同长度的子列表中出现的次数勾勒方式:
lists_ascending_appearences(Lists0, Lists) :-
maplist(list_with_length, Lists0, LLs0),
keysort(LLs0, LLs1),
group_pairs_by_key(LLs1, LLs2),
pairs_values(LLs2, Lists1),
lists_ascending(Lists1, Lists2),
append(Lists2, Lists).
例如查询及其结果:
?- lists_ascending_appearences([[a,b],[c],[a,b,c],[d,d,d],[d,s],[s],[d,s,s,a]], Ls).
Ls = [[d, s, s, a], [c], [s], [a, b], [d, s], [a, b, c], [d, d, d]].