Prolog如何对这样的列表进行排序

时间:2018-04-12 17:21:26

标签: prolog

嘿伙计们我试图对列表进行排序,如下所示:

[peter-3, mark-2, sam-1]

给予:

[sam-1, mark-2, peter-3]

我尝试编辑插入排序的代码,但它似乎无法正常工作,它会返回' false'。

insert_sort(List,Sorted):-i_sort(List,[],Sorted).

i_sort([],Acc,Acc).
i_sort([H-N1|T],Acc,Sorted):- insert(H-N1,Acc,NAcc),
                          i_sort(T,NAcc,Sorted).

insert(X-N1,[Y-N2|T],[Y|NT]):- N1>N1,insert(X-N1,T,NT).
insert(X-N1,[Y-N2|T],[X-N1,Y-N2|T]):- N1=<N2.
insert(X-N1,[],[X-N1]).

1 个答案:

答案 0 :(得分:1)

一种简单的方法是将其映射到一个易于使用msort/2排序的列表,然后将其映射回原始形式:

num_name(Name-Num, Num-Name).
name_num(Num-Name, Name-Num).

sort_names_by_num(UnsortedNameNum, SortedNameNum) :-
    maplist(num_name, UnsortedNameNum, UnsortedNumName),
    msort(UnsortedNumName, SortedNumName),
    maplist(name_num, SortedNumName, SortedNameNum).

关于您尝试修改插入排序的问题,您会遇到打字错误:

insert(X-N1,[Y-N2|T],[Y|NT]) :- ...

应该是:

insert(X-N1,[Y-N2|T],[Y-N2|NT]) :- ...

N1 > N1应为N1 > N2。那你的解决方案就可以了!

insert_sort(List, Sorted) :- i_sort(List, [], Sorted).

i_sort([], Acc, Acc).
i_sort([H-N1|T],Acc, Sorted) :-
    insert(H-N1, Acc, NAcc),
    i_sort(T, NAcc, Sorted).

insert(X-N1, [Y-N2|T], [Y-N2|NT]) :-
    N1 > N2,
    insert(X-N1, T, NT).
insert(X-N1, [Y-N2|T], [X-N1,Y-N2|T]) :- N1 =< N2.
insert(X-N1, [], [X-N1]).
相关问题