Как утверждают другие ответы, обходные пути не добавляют дополнительной мощности к регулярным выражениям.
Я думаю, что мы можем показать это, используя следующее:
Одна галька 2-NFA (см. Раздел «Введение» к этой статье).
1-каменная 2NFA не имеет отношения к вложенным запросам, но мы можем использовать вариант мульти-каменной 2NFA (см. Раздел ниже).
Введение
2-NFA - это недетерминированный конечный автомат, который может перемещаться влево или вправо на своем входе.
В машине с одной галькой машина может поместить гальку на входную ленту (т. Е. Пометить определенный входной символ галькой) и, возможно, выполнять различные переходы в зависимости от того, есть галька в текущей позиции ввода или нет.
Известно, что One Pebble 2-NFA имеет такую же мощность, что и обычный DFA.
Не вложенные Lookaheads
Основная идея заключается в следующем:
2NFA позволяет нам возвращаться назад (или «передняя дорожка»), перемещаясь вперед или назад по входной ленте. Таким образом, для lookahead мы можем выполнить сопоставление для регулярного выражения lookahead, а затем вернуть обратно то, что мы использовали, в соответствии с выражением lookahead. Чтобы точно знать, когда прекратить возвращаться, мы используем гальку! Мы опускаем гальку, прежде чем войти в dfa, чтобы наблюдатель отметил место, где должен прекратиться возвратный ход.
Таким образом, в конце работы с нашей строкой через гальку 2NFA мы знаем, соответствовали ли мы выражению предпросмотра или нет, а оставленный ввод (т. Е. То, что осталось использовать) - это именно то, что требуется для соответствия оставшимся. 1029 *
Итак, заглянем в форму u (? = V) w
У нас есть DFA для u, v и w.
Из принимающего состояния (да, мы можем предположить, что есть только один) DFA для вас, мы делаем электронный переход в начальное состояние v, помечая входные данные галькой.
Из принимающего состояния для v мы осуществляем электронный переход в состояние, которое продолжает перемещать вход влево, пока не найдет гальку, а затем перейдет в начальное состояние w.
Из отклоняющего состояния v мы осуществляем электронный переход в состояние, которое продолжает двигаться влево до тех пор, пока не найдет гальку, и перейдет в принимающее состояние u (то есть, где мы остановились).
Доказательство, используемое для обычных NFA, чтобы показать r1 | r2, или r * и т. д., переносят для этой одной гальки 2nfas. См. http://www.coli.uni -saarland.de / projects / milca / courses / coal / html / node41.html # регулярноlanguages.sec.regexptofsa для получения дополнительной информации о том, как составные машины собираются вместе, чтобы дать большую машину для выражения r * и т. д.
Причина, по которой вышеприведенные доказательства для r * и т. Д. Работают, заключается в том, что обратное отслеживание гарантирует, что входной указатель всегда находится в правильном месте, когда мы вводим компонент nfas для повторения. Кроме того, если используется галька, то она обрабатывается одним из компьютеров с компонентами предварительного просмотра. Поскольку нет переходов от прогнозирующей машины к прогнозирующей машине без полного возврата и возврата гальки, все, что нужно - это машина с одной галькой.
Например, рассмотрим ([^ a] | a (? = ... b)) *
и строка abbb.
У нас есть abbb, который проходит через peb2nfa для a (? = ... b), в конце которого мы находимся в состоянии: (bbb, matched) (т. Е. На входе bbb остается, и он соответствует «а» с последующим «..б»). Теперь из-за * мы возвращаемся к началу (см. Конструкцию в ссылке выше) и вводим dfa для [^ a]. Совпадение b, вернитесь к началу, введите [^ a] снова два раза и затем подтвердите.
Работа с вложенными Lookaheads
Для обработки вложенных просмотров мы можем использовать ограниченную версию k-pebble 2NFA, как определено здесь: Результаты сложности для автоматов с двусторонним и многокаменным движением и их логики (см. Определение 4.1 и теорему 4.2) .
Как правило, 2-каменные автоматы могут принимать нерегулярные множества, но со следующими ограничениями можно показать, что автоматы k-камешков являются регулярными (теорема 4.2 в статье выше).
Если галькой являются P_1, P_2, ..., P_K
P_ {i + 1} не может быть размещен, если P_i уже на ленте, а P_ {i} не может быть поднят, если P_ {i + 1} не на ленте. По сути, гальку нужно использовать в режиме LIFO.
Между временем P_ {i + 1} и временем, когда P_ {i} выбран или P_ {i + 2}, автомат может пройти только подслово, расположенное между текущим расположение P_ {i} и конец входного слова, который лежит в направлении P_ {i + 1}. Более того, в этом подслове автомат может действовать только как 1-галечный автомат с Pebble P_ {i + 1}. В частности, нельзя поднимать, помещать или даже ощущать присутствие другой гальки.
Так что, если v является вложенным выражением предпросмотра глубины k, то (? = V) является вложенным выражением предпросмотра глубиной k + 1. Когда мы заходим в машину, ведущую в сторону, мы точно знаем, сколько камушков должно быть размещено до сих пор, и поэтому можем точно определить, какую гальку нужно разместить, и когда мы выходим из этой машины, мы знаем, какую гальку поднять. Все машины на глубине t вводятся путем помещения гальки t и выходятся (то есть мы возвращаемся к обработке машины глубины t-1), удаляя гальку t. Любой запуск всей машины выглядит как рекурсивный вызов дерева dfs, и к двум вышеуказанным ограничениям машины с несколькими камушками можно отнести.
Теперь, когда вы объединяете выражения для rr1, так как вы конкатируете, числа гальки r1 должны увеличиваться на глубину r. Для r * и r | r1 нумерация гальки остается неизменной.
Таким образом, любое выражение с заглядыванием может быть преобразовано в эквивалентную машину с несколькими камешками с указанными выше ограничениями в размещении камешков и поэтому является регулярным.
Заключение
Это в основном устраняет недостаток в оригинальном доказательстве Фрэнсиса: способность не допускать, чтобы выражения прогнозных данных потребляли все, что требуется для будущих совпадений.
Так как Lookbehinds - это просто конечная строка (на самом деле не регулярные выражения), мы можем сначала иметь с ними дело, а затем иметь дело с lookahead.
Извините за неполную рецензию, но полное доказательство будет включать в себя много рисунков.
Мне это кажется правильным, но я буду рад узнать о любых ошибках (которые мне, похоже, нравятся: -)).