Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
Mergersort won'的Prolog实现;别停下_Prolog_Infinite Loop_Mergesort_Failure Slice - Fatal编程技术网

Mergersort won'的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

我是一名新的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).
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). append([H|T],LISTB,[H|LISTC]):- false, append(T,LISTB,LISTC). split(LIST,L1,L2):- LIST = [], length(LIST,LENGTH), M is div(LENGTH,2), append(L1,L2,LIST), length(L1,L1LENGTH), (L1LENGTH =:= M). mergesort([],[]) :- false. mergesort([X],[X]) :- false. mergesort(LIST,OLIST):- LIST = [], split(LIST,L1,L2), L1 = [], L2 = [], mergesort(L1,OLIST1), false, mergesort(L2,OLIST2), merge(OLIST1,OLIST2,OLIST). 追加([],L,L)。 追加([H|T],LISTB,[H|LISTC]):-false, 追加(T、LISTB、LISTC)。 拆分(列表,L1,L2):-LIST=[], 长度(列表,长度), M是div(长度,2), 附加(L1、L2、列表), 长度(L1,L1长度), (L1LENGTH=:=M)。 合并排序([],[]):-false。 合并排序([X],[X]):-false。 mergesort(LIST,OLIST):-LIST=[], 拆分(列表,L1,L2),L1=[],L2=[], 合并排序(L1,OLIST1),false, 合并排序(L2,OLIST2), 合并(OLIST1、OLIST2、OLIST)。 我已经添加了目标
false
L=[]
,这些目标都将终止,因此将改进终止或保持原样。由此产生的程序片段称为

因为这个程序循环,所以你的原始程序也循环。因此,在可见部分的某处一定有错误。
mergesort/2
的递归规则适用于空列表,这真的有意义吗

(除此之外,split目前的效率非常低。)

尝试
mergesort([],[a])
查看它的循环。 append([], L, L). append([H|T],LISTB,[H|LISTC]):- false, append(T,LISTB,LISTC). split(LIST,L1,L2):- LIST = [], length(LIST,LENGTH), M is div(LENGTH,2), append(L1,L2,LIST), length(L1,L1LENGTH), (L1LENGTH =:= M). mergesort([],[]) :- false. mergesort([X],[X]) :- false. mergesort(LIST,OLIST):- LIST = [], split(LIST,L1,L2), L1 = [], L2 = [], mergesort(L1,OLIST1), false, mergesort(L2,OLIST2), merge(OLIST1,OLIST2,OLIST).