Сортировка подсчета Пролога

Поэтому я создал сортировку с подсчетом (https://en.wikipedia.org/wiki/Counting_sort) программу на Прологе с использованием ECLiPSe 6.1. Он отлично сортируется, но может только записывать отсортированный список в консоль, а не возвращать его как вторую переменную. Итак, как заставить его возвращать отсортированный список как переменную?
Например:

mysort([1,1,6,7,4,1.5,11,6,7],Z) 

пишет ([7, 7, 6, 6, 4, 1, 1]) в консоли, что является правильным ответом (сортирует числа от 0 до 10). Но переменная Z - это Z=Z, а не Z=([ 7, 7, 6, 6, 4, 1, 1])

      build(_,0,[]).  %create list with ARG1 value , ARG2 size, and write to ARG3
      build(X,N1,[X|L]) :- N1 > 0, N is N1 - 1, build(X,N,L). 
      build(X,N1,[X]):- N1>0, N1 is N - 1, build(X,N,[]).  

      build_list(X,N):-build(0,N,X).%create list with ARG1 value , ARG2 size, and write to ARG3

      sum_list([], 0).% ARG1 list sum, write to ARG2
      sum_list([H|T], Sum) :-
         sum_list(T, Rest),
         Sum is H + Rest.

      replace([_|T], 0, X, [X|T]).%replace in ARG1 list,  ARG2 index with           ARG3 value,return as ARG4
      replace([H|T], I, X, [H|R]):- I > -1, NI is I-1, replace(T, NI, X, R), !.
      replace(L, _, _, L).

      increment_nth_in_list( [] , [],_ ) .%Increment element in ARG1, return as ARG2, increment element on ARG3 position
      increment_nth_in_list( [X|Xs] , [Y|Ys],N) :-
        (N=0->Y is X+1,N1 is N-1;
        N1 is N-1,Y is X),
        increment_nth_in_list(Xs,Ys,N1).    

      decrement_nth_in_list( [] , [],_ ) .%Decrement element in ARG1, return as ARG2, Decrement element on ARG3 position
      decrement_nth_in_list( [X|Xs] , [Y|Ys],N) :- 
        (N=0->Y is X-1,N1 is N-1;
         N1 is N-1,Y is X),
        decrement_nth_in_list(Xs,Ys,N1).    

      mysort([],[]).
      mysort([_],[]).
      mysort(Sorting,Sorted):-%Starting sort
      build_list(Amounts_of,10),%create list from 0 to 10 (MAX)
      count_numbers(Sorting,Amounts_of).%starting to count numbers

      count_numbers([Sortinghead|Sortingtail],Amount_of):-%counting numbers from ARG1 and writing to ARG2
      increment_nth_in_list(Amount_of,NewAmount,Sortinghead),
      length(Sortingtail,Z),
      (Z>0->count_numbers(Sortingtail,NewAmount);
      sum_list(NewAmount,Sum),build_list(Sorted,Sum),length(Sorted,L),fill_list(NewAmount,Sorted,0,L)
      ).

      fill_list([],A,_,_):-write(A).
      fill_list([Amount_of_Head|[]],[Sorted],N,L).

      fill_list([Amount_of_Head|Amount_of_Tail],Sorted,N,L):-%Filling ARG2           based on values in ARG1,with ARG3 values on ARG4 position.
      Amount_of_Head>0-          >decrement_nth_in_list([Amount_of_Head|Amount_of_Tail],NewAmount,0),L1 is L-          1,replace(Sorted,L1,N,NewSorted),fill_list(NewAmount,NewSorted,N,L1)
      ;N1 is N+1,fill_list(Amount_of_Tail,Sorted,N1,L).

person Ihor Kyrychok    schedule 04.12.2016    source источник


Ответы (1)


Второй аргумент Z в вашем вызове соответствует переменной Sorted в последнем предложении mysort/2. Но это предложение никогда не использует эту переменную, поэтому ее нельзя привязать к решению. Вам нужно будет добавить аргументы к fill_list/4 и count_numbers/2, которые вы привязываете к решению, когда закончите, в том же месте, где вы сейчас выполняете write. (Возможно, вы сможете повторно использовать существующие аргументы; ваш код плохо отформатирован, и ваши имена переменных не помогают его понять.)

person Isabelle Newbie    schedule 04.12.2016