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

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

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Преобразовать строку в упорядоченный список слов

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 3 мес. назад.

  • Автор
    Сообщения
  • #1962

    questioner
    Участник

    Нужно решить 2 похожих задачи на Прологе:

    1. Ввести строку. Преобразовать введенную строку в список слов, упорядоченных лексикографически;
    2. Преобразовать строку в список слов, которые упорядочены по длине.

     

  • #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).

Для ответа в этой теме необходимо авторизоваться.