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

      Комментарии к записи Ответ в теме: В списке символов найти число слов с одинаковыми первой и последней буквами отключены
#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.