Пример: "ab" => [98,99]
/*
* отношение порядка "больше" для строк, т.е. сравнивает
* числовое представление строк
*/
more( [X|Tail1], [Y|Tail2]) :-
(X > Y) ; ((X=Y), more(Tail1,Tail2)).
bubblesort( List, SortedList) :-
swap( List, List1), !, % Полезная перестановка?
bubblesort( List1,SortedList).
bubblesort( SortedList, SortedList). % Если нет, то список уже
% упорядочен
swap( [X,Y | Tail], [Y,X | Tail]) :- % Перестановка первых двух
% элементов
more(X,Y).
swap( [Z | Tail], [Z | Tail1]) :- % перестановка в хвосте
swap( Tail, Tail1).
Программа, которая сортирует не только числа, но и строки
/*
* отношение порядка "больше" для строк, т.е. сравнивает
* числовое представление строк
*/
more( [X|Tail1], [Y|Tail2]) :-
(X > Y) ; ((X=Y), more(Tail1,Tail2)).
/* отношение порядка "больше" для чисел */
more2( X,Y):- X > Y.
/*
* предикат форматирующий список строк из цифрового представления
* в символьный (например [[98,99],[100,101]] в bc de)
*/
myformat([X|Tail]):- format(X),format('~t '),myformat(Tail);true.
/* предикат реализующий сортировку пузырьком */
bubblesort( List, SortedList) :-
swap( List, List1), !, % Полезная перестановка?
bubblesort( List1,SortedList).
bubblesort( SortedList, SortedList):- % Если нет, то список уже
% упорядочен.
format('Sorted List = '), % Выводим отсортированный
myformat(SortedList). % список на экран
/*
* предикат реализующий перестановку двух соседних элементов,
* если первый больше второго
*/
swap( [X,Y | Tail], [Y,X | Tail]) :- % Перестановка первых двух
% элементов
(number(X), number(Y),more2( X,Y)) ; more(X,Y). % если X и Y - числа, то
% сравниваем предикатом more2,
% если нет - предикатом more
swap( [Z | Tail], [Z | Tail1]) :- % перестановка в хвосте
swap( Tail, Tail1).
|