Сортировка больших списков в Прологе: недостаточно памяти
Я пытаюсь отсортировать список элементов 10k в прологе с Bubbleort, и я получаю ошибку локального стека. Mergesort, кажется, лучший вариант, так как я не получаю никаких ошибок для того же ввода. Тем не менее, я бы очень хотел получить время пробега для сортировки пузырьков с большими входными данными, но я не могу. Есть идеи?
Вот код:
%% NOTE: SWI-PROLOG USED
%% generate_list(Limit, N, L): - insert upper limit and length of list N
%% to get a random list with N numbers from 0 to limit
generate_list(_, 0, []).
generate_list(Limit, N, [Y|L]):-
N =\= 0,
random(0, Limit, Y),
N1 is N-1,
generate_list(Limit, N1, L).
%% bubble(L, Ls, max):- insert list L and get max member of list by
%% swapping members from the start of L.
bubble([Z], [], Z).
bubble([X,Y|L], [X|Ls], Z):- X =< Y, bubble([Y|L], Ls, Z).
bubble([X,Y|L], [Y|Ls], Z):- X > Y, bubble([X|L], Ls, Z).
%% bubble_sort(List, Accumulator, Sorted_List)
bubblesort([X], Ls, [X|Ls]).
bubblesort(L, Accumulate, Result):- bubble(L, Ls, Max),
bubblesort(Ls, [Max|Accumulate], Result).
bubble_sort(L, Sorted):- bubblesort(L, [], Sorted).
Как вы видите, я использую хвостовую рекурсию. Я также попытался увеличить стеки с помощью:
set_prolog_stack(global, limit(100 000 000 000)).
set_prolog_stack(trail, limit(20 000 000 000)).
set_prolog_stack(local, limit(2 000 000 000)).
но это просто работает немного дольше. В конце концов я снова выхожу из локального стека. Должен ли я использовать другой язык, как C иmalloc
список или не использовать рекурсию?