Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog如何对这样的列表进行排序_Prolog - Fatal编程技术网

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

Prolog如何对这样的列表进行排序,prolog,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),

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

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

一种简单的方法是将其映射到使用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]).

没有错误。它返回'false'谢谢,它可以很好地处理映射。我在修正了那个打字错误后厌倦了插入排序,但它仍然返回“false”,我真的不明白为什么。@yasseen.hesham我相信如果你仔细梳理你的解决方案,并再次与原始插入排序进行仔细比较,你可能会找到它。它应该与原始的.@yasseen.hesham同构。我注意到您的代码中也有N1>N1。只要让N1>N2,它就可以工作了