Ответ в теме: Преобразовать строку в упорядоченный список слов

#1964

Для начала преобразуете список в список слов, а затем – выполняете сортировку любым методом, например слиянием. Для решения обоих задач достаточно изменить правило сравнения элементов.

Лексикографическое сравнение строк выполняется как поэлементное сравнение списков:

less(_String_A, []):-!, fail.
less([], _String_B):-!.
less([Head_A|Tail_A], [Head_B|Tail_B]):-
  Head_A < Head_B, !;
  Head_A > Head_B, !, fail;
  less(Tail_A, Tail_B).

Если вторая строка закончилась, то она не может быть меньше первой – функция завершается неудачей.
Если закончилась первая строка – то она меньше любой не пустой строки.
В остальных случаях от исходных строк отделяются первые символы, если они равны, то выполняется рекурсивная обработка остальных элементов строк.

Сравнение строк по длине можно выполнить с использованием встроенной функции length:

less(String_A, String_B):-
  length(String_A, Length_A),
  length(String_B, Length_B),
  Length_A < Length_B.

При использовании алгоритма сортировки слияния надо использовать один из операторов less в функции объединения упорядоченных списков:
rangConcat([], List2, List2):-!.
rangConcat(List1, [], List1):-!.
rangConcat([Head1|Tail1], [Head2|Tail2], [Head1|TailResult]):-
  less(Head1, Head2) !, rangConcat(Tail1, [Head2|Tail2], TailResult).
rangConcat(List1, [Head2|Tail2], [Head2|TailResult]):-
  rangConcat(List1, Tail2, TailResult).