Mergersort won'的Prolog实现;别停下
我是一名新的Prolog开发人员,正在尝试让合并排序工作Mergersort won'的Prolog实现;别停下,prolog,infinite-loop,mergesort,failure-slice,Prolog,Infinite Loop,Mergesort,Failure Slice,我是一名新的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,L
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).
append([H|T],LISTB[H|LISTC]):-
追加(T、LISTB、LISTC)。
拆分(列表、L1、L2):-
长度(列表,长度),
M是div(长度,2),
附加(L1、L2、列表),
长度(L1,L1长度),
(L1LENGTH=:=M)。
合并(A,[],A)。
合并([],B,B)。
合并([A|TA]、[B|TB]、[A|MERGED]):-
A=
我确信这是一个黑客解决方案,但它是一个解决方案
(append([],L,L)。
缺失)
首先,减少输入的大小!您在[2,1]
中遇到的问题可以通过[2]
甚至[]
观察到
?- mergesort([],T).
T = []
; T = []
; T = []
; T = []
...
所以问题似乎是程序没有终止。或者十个答案后就停止了?有一种方法可以更好地测试这一点:
?- mergesort([], T), false.
*LOOPS*
?-mergesort([],T),false。
*循环*
如果我做到了,我会在你的程序中添加更多的目标,这样产生的程序仍然循环:
append([], L, L).
false
和L=[]
,这些目标都将终止,因此将改进终止或保持原样。由此产生的程序片段称为
因为这个程序循环,所以你的原始程序也循环。因此,在可见部分的某处一定有错误。mergesort/2
的递归规则适用于空列表,这真的有意义吗
(除此之外,split目前的效率非常低。)尝试mergesort([],[a])
查看它的循环。
append([], L, L).