GOTO M.

趣味のコーディングとか、勉強とか、読書とか

「7つの言語 7つの世界」 Prolog 2日目セルフスタディ(sort)

  • リスト内の要素をソートせよ.

という単純な課題。セオリー通りクイックソートでチャレンジ。
divide ルールの条件分岐っぽい部分など、もうちょっと書き方が有る気がする。

% Main program of quick sort which allows duplicate elements.
% ex)
%  qsort([3, 1, 4, 1, 4], [1, 1, 3, 4, 4]).

qsort([], []).
qsort([Head|Tail], Sorted) :-
  divide(Tail, Head, Lessor, Greator),
  qsort(Lessor, SortedLessor),
  qsort(Greator, SortedGreator),
  appendAll([SortedLessor, [Head], SortedGreator] , Sorted).

% Divide a list into two lists,
%   one consists of elements which is smaller than or equal to the pivot,
%   the other consists of elements which is bigger than the pivot,
% ex)
%  divide([1, 2, 3], 2, [1, 2], [3]).

divide([], _, [], []).
divide([Head|Tail], Pivot, Lessor, Greator) :-
  Pivot >= Head,
  divide(Tail, Pivot, SubLessor, Greator),
  append(SubLessor, [Head], Lessor).
divide([Head|Tail], Pivot, Lessor, Greator) :-
  Pivot < Head,
  divide(Tail, Pivot, Lessor, SubGreator),
  append(SubGreator, [Head], Greator).

% Binds the concatenation of more than two lists.
% ex)
%  appendAll([[1, 2], [3, 4], [5, 6]], [1, 2, 3, 4, 5, 6]).

appendAll([], []).
appendAll([Head|Tail], ResultList) :-
  appendAll(Tail, SubList),
  append(Head, SubList, ResultList).