И вообще, что такого "эзотеричного" в ЛП?

Есть циклы на последовательностях, которые не изменяют в теле ничего, кроме одного "бегунка" (вообще отсутствует фаза нарушения инварианта). А инвариант вообще тривиален - всё пройденные элементы соответствуют условию цикла (см. у Вас же: "Он очень простой: куски сравниваемых строк от начала до текущей позиции (< i) совпадают" - такой он и всюду).

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

Паттерн ЛП навязывает следующую дисциплину проектирования:
1. Сначала выделяем классы состояний, которые нужно распознавать после цикла. Формулируем постусловие как дизъюнктивную форму, 1-к-1 соответствующую этим классам. Уже внутри каждого дизъюнкта формулируем сколь угодно сложное условие на каждый отдельный класс.
2. Упорядочиваем дизъюнкты по области определения (используем сокращённую семантики вычислений cor-cand в качестве охраны правых дизъюнктов).
3. Отображаем их в условие цикла точным обращением в конъюнктивную форму. Если условия внутри каждого конъюнкта сложны, то вносить отрицание внутрь конъюнкта нежелательно, т.к. семантику задачи выражает именно изначальное условие, его инверсия непонятна при чтении программы.
Кроме того, вот это 1-к-1 соответствие (без упрощения выражений) важно потому, что проверки каждой ситуации выполняются после цикла. Т.е. лучше иметь полное совпадение и в условии цикла, и в IF-е после цикла.

Никакой конкуренции с методом инварианта тут нет. Если шаг по последовательности в цикле сложный (а не просто "бегунок"), то выводим его строго по инварианту.