Ответ в теме: Длина наибольшей подпоследовательности из одного символа

      Комментарии к записи Ответ в теме: Длина наибольшей подпоследовательности из одного символа отключены
#2490

Нужно разделить задачу на части, согласитесь, было бы удобно, если бы у вас была функция, возвращающая последовательность из одного символа, начинающуюся с первого символа строки. Тогда вы могли бы вызвать ее, а затем – рекурсивно обработать список без первого элемента и сравнить результаты:

longest_symbol_subsequence([], []).
longest_symbol_subsequence([Head|Tail], LongestSubsequence):-
  first_symbol_subsequence([Head|Tail], FirstSymbolSubsequence),
  longest_symbol_subsequence(Tail, TailSymbolSubsequence),
  length(FirstSymbolSubsequence, LengthFistSymbolSubsequence),
  length(TailSymbolSubsequence, LengthTailSymbolSubsequence),
  (
    LengthFistSymbolSubsequence > LengthTailSymbolSubsequence, !, 
    LongestSubsequence = FirstSymbolSubsequence;
    LongestSubsequence = TailSymbolSubsequence
  ).

Очевидно, функция выделения последовательности из начала списка должна обрабатывать случаи, когда на вход подан: пустой список; список из одного элемента; список, в начале которого находятся два одинаковых элемента; другой список. Так, например, если первые два элемента эквиваленты – первый элемент необходимо добавить к результату рекурсивной обработки хвоста:

first_symbol_subsequence([], []):-!.
first_symbol_subsequence([Head], [Head]):-!.
first_symbol_subsequence([Head, Head|Tail], [Head|TailSymbolSubsequence]):-
  !, first_symbol_subsequence([Head|Tail], TailSymbolSubsequence).
first_symbol_subsequence([Head, _Head2|_Tail], [Head]):-!.

Определить искомую длину последовательности можно при помощи встроенной функции length.