我是一个新的 Prolog 开发人员,正在尝试让合并排序工作。查询
mergesort([2,1],T).
将产生
T=[1,2];
T=[1,2];
T=[1,2];
...
因此,尽管它似乎“正确”对序列进行了排序,但它并没有停止
另一方面,如果我有一个查询,例如
mergesort([2,1],[2,1])
它进入一个无限循环。我想知道为什么会这样?
append([H|T],LISTB,[H|LISTC]):-
append(T,LISTB,LISTC).
split(LIST,L1,L2):-
length(LIST,LENGTH),
M is div(LENGTH,2),
append(L1,L2,LIST),
length(L1,L1LENGTH),
(L1LENGTH =:= M).
merge(A,[],A).
merge([],B,B).
merge([A|TA],[B|TB],[A|MERGED]) :-
A =< B,
merge(TA,[B|TB],MERGED).
merge([A|TA],[B|TB],[B|MERGED]) :-
B < A,
merge([A|TA],TB,MERGED).
mergesort([],[]).
mergesort([X],[X]).
mergesort(LIST,OLIST):-
split(LIST,L1,L2),
mergesort(L1,OLIST1),
mergesort(L2,OLIST2),
merge(OLIST1,OLIST2,OLIST).