「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).