(append([], L, L).
отсутствует)
Во-первых, уменьшите размер ввода!Проблема, с которой вы сталкиваетесь с [2,1]
, уже может наблюдаться с [2]
и даже []
!
?- mergesort([],T).
T = []
; T = []
; T = []
; T = []
...
Таким образом, проблема заключается в том, что программа не завершается.Или, может быть, это останавливается после десяти ответов?Есть способ лучше протестировать это:
?- mergesort([], T), <b>false</b>.
*LOOPS*
И если я буду этим заниматься, я добавлю дополнительные цели в вашу программу так, чтобы результирующая программа по-прежнему зацикливалась:
append([], L, L).
<s>append([H|T],LISTB,[H|LISTC]):- <b>false</b></s>,
<s>append(T,LISTB,LISTC)</s>.
split(LIST,L1,L2):- <b>LIST = []</b>,
length(LIST,LENGTH),
M is div(LENGTH,2),
append(L1,L2,LIST),
length(L1,L1LENGTH),
(L1LENGTH =:= M).
<s>mergesort([],[]) :- <b>false</b></s>.
<s>mergesort([X],[X]) :- <b>false</b></s>.
mergesort(LIST,OLIST):- <b>LIST = []</b>,
split(LIST,L1,L2), <b>L1 = [], L2 = []</b>,
mergesort(L1,OLIST1), <b>false</b>,
<s>mergesort(L2,OLIST2)</s>,
<s>merge(OLIST1,OLIST2,OLIST)</s>.
Я добавил цели false
и L = []
, которые все заканчиваются и, таким образом, либо улучшают завершение, либо оставляют его как есть .Этот результирующий фрагмент программы известен как fault-slice .
Поскольку эта программа выполняет цикл, также ваша исходная программа выполняет цикл.Таким образом, где-то в видимой части должна быть ошибка.Действительно ли имеет смысл, что рекурсивное правило mergesort/2
применяется к пустому списку?
((Кроме того, split довольно неэффективен). *) 1035 *