В списке символов найти число слов с одинаковыми первой и последней буквами

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

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

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

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

    questioner
    Участник

    Помогите, пожалуйста, справиться с заданием для SWI Prolog:

    В списке символов найти число слов с одинаковыми первой и последней буквами, если разделителем между словами является один или несколько пробелов. Вывести самое длинное такое слово.

    Не понимаю как сравнить последний символ и как определить длину.

  • #1944

    По заданию дана последовательность символов, но обрабатывать надо слова. Задачу можно значительно упростить преобразовав строку в список слов.

    Теперь можно работать со словами, которые также как и исходная строка, представляют собой последовательности (списки) символов, поэтому к ним можно применять стандартные функции обработки списков.

    Проверить совпадение первого и последнего символов слово можно, например, перевернув его:

    equal_first_last([Head|Tail]):-
      reverse([Head|Tail], [Head|_]).

    Исходное слово разделяется на первый (Head) и остальные (Tail) символы. Слово переворачивается, от результата пытаемся отделить первый символ Tail — если у нас это получится, значит первый и последний символы совпадают.

    В задании от вас требуют обрабатывать слова, удовлетворяющие заданным условиям, поэтому стоит сразу выбрать все такие слова. Сделать это можно стандартным предикатом include(equal_first_last, WordList, EqualFirstLastWordList), либо написать аналогичную функцию самостоятельно:

    include_first_last([], []):-!.
    include_first_last([FirstWord|OtherWords], [FirstWord|OtherInclude]):-
      equal_first_last(FirstWord), !, include_first_last(OtherWords, OtherInclude).
    include_first_last([_FirstWord|OtherWords], OtherInclude):-
      include_first_last(OtherWords, OtherInclude).

    Если на вход подан пустой список, то результатом является тоже пустой список.
    В противном случае от исходного списка отделяется первое слово, остальные слова обрабатываются рекурсивно, формируя в результате список OtherInclude. В зависимости от того, выполняется для первого слова заданное условие или нет — оно может быть либо добавлено к результату, либо пропущено.

    Посчитать количество выбранных слов можно встроенным предикатом length, возвращающим длину списка (которым является слово).

    Для поиска слова наибольшей длины можно предикатом find_longest_word.

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