Prolog合并排序列表中的列表

时间:2012-12-12 12:38:27

标签: prolog mergesort

我需要对一个例子进行排序:

?- mergesort([8,1,[4,6,3],2],Sorted).

结果应该是:

Sorted = [1, 2, 8, [3, 4, 6]]

不幸的是我不确定该怎么做。我自己试图找到答案,但没有找到解决方案。目前的结果是:

Sorted = [1, 2, 8, [4, 6, 3]]

我的代码:

mergesort([],[]).
mergesort([A],[A]).
mergesort([A,B|R],S) :-  
   split([A,B|R],L1,L2),
   mergesort(L1,S1),
   mergesort(L2,S2),
   merge(S1,S2,S).

split([],[],[]).
split([A],[A],[]).
split([A,B|R],[A|Ra],[B|Rb]) :-  split(R,Ra,Rb).

merge(A,[],A).
merge([],B,B).
merge([A|Ra],[B|Rb],[A|M]) :-  A @=< B, merge(Ra,[B|Rb],M).
merge([A|Ra],[B|Rb],[B|M]) :-  A @> B,  merge([A|Ra],Rb,M).

提前非常感谢!

1 个答案:

答案 0 :(得分:0)

我会写一个简单的预处理步骤:

sortl([H|T],[Hs|Ts]) :-
    (   is_list(H)
    ->  mergesort(H,Gs),
        sortl(Gs,Hs)
    ;   Hs = H
    ),
    sortl(T,Ts).
sortl([],[]).

然后你可以这样使用它

?- sortl([8,1,[4,6,[3,4],[1,8],3],2,[1,3,2]],T),mergesort(T,Sorted).
T = [8, 1, [3, 4, 6, [1, 8], [3|...]], 2, [1, 2, 3]],
Sorted = [1, 2, 8, [1, 2, 3], [3, 4, 6, [...|...]|...]]