Если я правильно понимаю, NFA обладают той же выразительной силой, что и регулярные выражения. Зачастую считывание эквивалентных регулярных выражений из NFA легко: вы переводите циклы в звезды, соединения в качестве альтернатив и так далее. Но что делать в этом случае:
[ источник ]
Перекрывающиеся циклы затрудняют понимание того, что принимает этот автомат (в терминах регулярных выражений). Есть ли хитрость?
Ответы:
Вместо того, чтобы «зачитывать», вы должны использовать один из нескольких канонических методов для этого. Безусловно, самое приятное, что я видел, это тот, который выражает автомат как систему уравнений (регулярных) языков, которую можно решить. Это особенно приятно, поскольку, кажется, дает более краткие выражения, чем другие методы.
Я написал этот документ, объясняющий метод для студентов прошлым летом. Это напрямую связано с конкретной лекцией; упомянутая ссылка является типичным определением регулярных выражений. Доказательство леммы Ардена (необходимый результат) содержится; один для правильности метода отсутствует. Как я узнал об этом в лекции, к сожалению, у меня нет ссылки.
Приложение к данному автомату оставлено в качестве упражнения; полный пример включен в вышеупомянутый связанный документ .
Смотрите также здесь, где я разместил аналогичный ответ.
источник
Если бы была просто цепочка состояний без петли, вы бы знали, что делать?
Если бы существовал простой цикл без этого перекрывающегося ветвления, знаете ли вы, что делать?
(Если ответ «нет», сначала подумайте об этих случаях.)
Теперь идея состоит в том, чтобы постепенно преобразовать автомат, чтобы привести его в форму, в которой вы сможете определить эти паттерны: цепочки, петли и расходящиеся пути, которые в конечном итоге сходятся (что приводит к чередованию). На каждом этапе преобразования следите за тем, чтобы преобразованный автомат все еще распознавал один и тот же язык.
Имейте в виду , что это не -deterministic автомат. Тот, который вы опубликовали, оказывается детерминированным, но он не должен оставаться таким, когда вы преобразуете его.
Позаботьтесь, чтобы проверить, какие состояния являются окончательными. Это может помочь не беспокоиться об этом сначала и сделать один большой цикл, а затем дублировать части, которые заканчиваются частично в цикле.
Это не обязательно является наиболее эффективным методом, или тот, который генерирует простейшую регулярное выражение, но это просто.
источник
источник
[(])
но[()]
.