Ответ в теме: Разделение строки и подсчет символов

      Комментарии к записи Ответ в теме: Разделение строки и подсчет символов отключены
#2672

Предикат frontchar выполняет примерно ту же операцию, что разделение списка на голову и хвост, но для строк:
frontchar(String, HeadChar, TailString)
В вашей задаче нужно отделять символы строки до тех пор, пока не попадется точка с запятой, при этом нужно накапливать или символы строки или считать длину. Кроме того, нас интересует часть строки за этим символом:

before_after_symbol(String, "", AfterString):-
  frontchar(String, ";", AfterString), !.

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

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

before_after_symbol(String, BeforeString, AfterString):-
  frontchar(String, Char, TailString), 
  before_after_symbol(TailString, BeforeStringTail, AfterString),
  frontchar(BeforeString, Char, BeforeStringTail).

После этого останется только вызвать для полученных частей функцию str_len чтобы получить искомую длину строк:

before_after_symbol(String, BeforeString, AfterString),
str_len(BeforeString, BeforeLength),
str_len(AfterString, AfterLength).