Доказательство теоремы 2.4.1 в «Комбинаторике слов» М. Лотера, по-видимому, имеет некоторые важные подсказки. Для данного слова мы вытащим четыре его части:
- Самый длинный префикс, который не содержит всех букв, которые содержит целое слово.
- Следующая буква.
- Самый длинный суффикс, который не содержит всех букв, которые содержит целое слово.
- Предыдущая буква.
Запись w. = (P, a , b, q) , когда p и q - соответствующие префикс и суффикс, соответственно, w и a и b - следующая и предыдущая буква соответственно. Например, bacbcab c. = (Ba, c, a, b c) , aaabaa. = (Aaa, b, b, aa) , и abcd. = (Ab c, d, a, bcd) .
Если w1. = (P1, a1, b1, q1) и w2. = (p2, a2, b2, q2) , в пункте (iii) на стр. 34 они доказывают, что w1 ~ w2 тогда и только p1 ~ p2 , a1 = a2 , b1 = b2 и q1 ~ q2 . (Я использую ~ для конгруэнтного отношения, индуцированного уравнением x ~ xx , чтобы я мог различить guish между точным равенством слов и частным равенством.) Мы можно использовать это для создания алгоритма вычисления канонической формы для заданного слова w следующим образом:
- Вычислить p, a, b, q , например что w. = (p, a, b, q) .
- Рекурсивное вычисление канонических форм p ' для p и q ' для q . (Базовый случай: канонической формой для пустого слова является пустое слово.)
- Найдите самый длинный суффикс p'a , который является префиксом bq ' ; назовите это s и остатки t , так что p'a = t * .
- Return tbq ' .
Я полагаю, что этот алгоритм верен относительно простым индуктивным аргументом. Под «правильным» я подразумеваю, что w1 ~ w2 , если f (w1) = f (w2) , где f - функция, описанная выше. Не ясно, что f дает минимальный представитель класса эквивалентности по предложенному вами порядку, но, возможно, правильности в этом смысле достаточно для ваших нужд.
(Строго говоря, шаги 3 и 4, приведенные выше, не являются абсолютно необходимыми для корректности. Вы можете просто вернуть p'abq ' и получить ту же гарантию. Но получающиеся в результате представители будут очень длинными по сравнению с предложенным выше алгоритмом.)
Этот алгоритм не очень эффективен! Вы можете думать об этом как о двух рекурсивных вызовах, каждый из которых содержит слова с наименьшим количеством уникальных букв, поэтому для этого требуется время, которое по крайней мере экспоненциально по размеру алфавита исходного слова. Хлоп. Возможно, вы захотите подумать о нескольких простых случаях для быстрого пути. Например, когда все повторяющиеся буквы непосредственно примыкают друг к другу, удаление соседних дубликатов канонизируется. Еще один быстрый путь, который может быть полезен: при канонизации wx , где вы знаете, w и x уже канонизированы, тогда w и x сами по себе могут быть базовыми случаями, если вы достигнете их во время рекурсии, и может случиться так, что вы можете подумать о некоторых способах дешевой идентификации дополнительных подстрок w и x , которые подходят базовые случаи.