【问题标题】:Rearrange list element - Prolog重新排列列表元素 - Prolog
【发布时间】:2014-10-09 18:52:22
【问题描述】:

我想根据子列表的长度从短到长重新排列列表。

预期的输出是:

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

我的想法是先计算每个长度,然后重新排列。 到目前为止,我所做的是使用模式 [length-number] 收集长度等于第一个子列表的子列表的数量。

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

count(LIST,X)输出如下:

21 ?- count_slot([[2],[3],[4],[2,3,4]],X).
X = [1-3]. 

但是预期的输出是[1-3,3-1],我不知道如何处理其余的子列表(一个一个删除??)并根据模式重新排列它们[1-3, 3-1]。

有人可以帮忙吗?提前致谢。

【问题讨论】:

    标签: prolog


    【解决方案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]].
    

    【讨论】:

    • 太好了。还有一个问题:
    • 如果我想像这样重新排列它们怎么办:示例查询及其结果:
    • 如果我想像这样重新排列它们怎么办:示例查询及其结果:lists_ascending([[a,b],[c],[a,b,c],[d,d, d],[d,s],[s],[d,s,s,a], [s,a],[s,t],[a,b,w]], Ls)。 Ls = [[d,s,s,a],[c],[s],[a,b,c],[d,d,d],[a,b,w],[a,b] ,[d,s],[s,a],[s,t]]。也就是按照子列表的长度重新排列,有一个长度为4,两个长度为1,三个长度为3,四个长度为2。改变list_with_length(List,List-L):-length(列表,L)。可以吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2016-01-20
    • 2012-02-07
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多