重新排列列表元素 - 序言(Rearrange list element - Prolog)

2019-10-21 02:52发布

我想根据自己的子列表的长度由短到长,以重新排列的列表。

该预期输出是:

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 ]。

谁能帮助? 提前致谢。

Answer 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]].


文章来源: Rearrange list element - Prolog
标签: prolog