W12. Построение Томпсона, алгоритм Клини, иерархия Хомского и вычислимость
1. Краткое содержание
1.1 Построение Томпсона: RegExp → ε-NFSA
1.1.1 Мотивация и обзор
Для RegExp над алфавитом часто нужно вычислительное устройство — конечный автомат, который принимает ровно тот язык, который задаёт выражение. Построение Томпсона (Thompson’s Construction) — классический алгоритм, который превращает любое RegExp в эквивалентный ε-недетерминированный конечный автомат (ε-NFSA). Полученный автомат затем можно использовать для сопоставления строк с исходным RegExp; именно так внутри устроены большинство regex engines.
Алгоритм работает рекурсивно: RegExp разбивается на подвыражения, для каждого строится фрагмент автомата, а фрагменты собираются по фиксированным правилам композиции. Каждое подвыражение
1.1.2 Базовые правила
Есть два базовых случая для атомарных регулярных выражений.
Пустое выражение
Один символ
1.1.3 Правила композиции
Пусть для подвыражений
Конкатенация
Объединение
Звезда Клини
1.1.4 Свойства построения
У ε-NFSA, полученного построением Томпсона, есть полезные структурные свойства: не более
1.2 Алгоритм Клини: от FSA к регулярному выражению
1.2.1 Обзор
Обратная задача — по конечному автомату найти регулярное выражение для его языка — решается алгоритмом Клини (Kleene’s Algorithm) (в вариантах его называют также алгоритмом исключения состояний). Дан FSA
Каждое такое множество представляется регулярным выражением. Выражения вычисляются по шагам для
Так как ни одно состояние не имеет индекса больше
1.2.2 Начальные выражения ( )
При
1.2.3 Рекурсивный шаг
Когда для всех пар вычислены
Наглядно: путь из
Эта рекуррентная формула — сердце алгоритма; применение для
1.3 Модели языков: операционные и порождающие
1.3.1 Два основных подхода
Формальные языки можно описывать двумя принципиально разными способами:
- Операционные модели (автоматы) получают входную строку и решают, допустить её или отвергнуть. Это распознаватели или преобразователи. Примеры: FSA, PDA, машина Тьюринга.
- Порождающие модели (грамматики) задают набор правил переписывания, с помощью которых можно вывести (породить) все и только строки языка. Грамматика не «обрабатывает» вход — она порождает выход.
Оба подхода описывают одни и те же объекты (формальные языки), но с противоположных сторон. У каждого свои плюсы: автоматы ближе к реализации, грамматики — к спецификации.
1.3.2 Грамматики в разборе
В построении компиляторов эти перспективы встречаются в разборе (parsing):
- Грамматика (обычно контекстно-свободная или её запись в BNF) задаёт синтаксис языка программирования — как должны выглядеть синтаксически корректные программы.
- Автомат (парсер) обрабатывает исходный код — читает поток лексем и проверяет соответствие грамматике, восстанавливая синтаксическую структуру для следующих фаз компиляции.
Грамматики в общем случае могут быть недетерминированными, но реальные генераторы парсеров (например LL(1), LR(1)) накладывают ограничения на грамматику и используют ограниченный предпросмотр для детерминированного разбора.
1.4 Иерархия Хомского
1.4.1 Классификация грамматик
Ноам Хомский (р. 1928), «отец современной лингвистики», в 1959 году ввёл формальную классификацию грамматик. Он заметил, что грамматики различаются формой продукций, и от формы зависит класс порождаемых языков. Классификация даёт четыре вложенных типа.
Четыре типа образуют строгую иерархию: каждый регулярный язык контекстно-свобод, каждый КСЯ — контекстно-зависим, каждый КЗЯ — рекурсивно перечислим. Вложения строгие — в каждом классе есть языки не из предыдущего.
1.4.2 Формальное определение грамматики
Грамматика — четвёрка
— конечное множество нетерминалов (переменных); — конечное множество терминалов (алфавит порождаемых строк), не пересекающееся с ; — конечное множество продукций (правил переписывания); — аксиома (стартовый символ).
Вывод — последовательность строк
То есть множество всех терминальных цепочек, выводимых из аксиомы.
1.5 Типы грамматик подробнее
1.5.1 Тип 0: неограниченные грамматики
Грамматики типа 0 (общие, неограниченные) накладывают на правила только требование непустоты левой части:
И
Грамматикам типа 0 соответствуют машины Тьюринга — они порождают в точности рекурсивно перечислимые языки (те, что TM может допустить, хотя на строках вне языка может зациклиться).
1.5.2 Тип 1: контекстно-зависимые грамматики
Грамматики типа 1 (контекстно-зависимые) требуют, чтобы каждое правило имело вид:
где
Канонический пример —
Почему «линейно ограничен»? Длина используемой ленты — линейная функция
1.5.3 Тип 2: контекстно-свободные грамматики
Грамматики типа 2 (КС-грамматики, CFG) требуют, чтобы слева в каждом правиле был ровно один нетерминал:
где
КС-грамматики критически важны на практике: они эквивалентны форме Бэкуса — Наура (BNF), которой задают синтаксис почти всех языков программирования. Связь обнаружили в 1960 году: язык ALGOL-60, описанный Бэкусом и Науром в BNF, формально совпадает с контекстно-свободными языками Хомского.
BNF записывает правила как <ЛЧ> ::= <ПЧ>, где <ЛЧ> — нетерминал, <ПЧ> — любая последовательность терминалов и нетерминалов. Например, <expr> ::= <expr> + <term> | <term> задаёт выражения как суммы или одиночные слагаемые.
Контекстно-свободные языки распознаются недетерминированными автоматами с магазином (NPDA). Стек даёт ровно «один уровень вложенности», нужный для скобок и языков вида
1.5.4 Тип 3: регулярные грамматики
Грамматики типа 3 (регулярные) накладывают самые жёсткие ограничения: все правила либо праволинейные, либо леволинейные — но не смешанные в одной грамматике.
Праволинейная грамматика допускает только правила вида:
(цепочка терминалов и не более одного нетерминала справа), или (только терминалы).
Леволинейная грамматика допускает только:
, или .
Грамматика регулярна, если все продукции праволинейные или все леволинейные; смешивать ориентации в одной грамматике нельзя. Регулярные грамматики порождают в точности регулярные языки — те же, что допускаются конечными автоматами (FSA) и задаются регулярными выражениями.
1.6 Соответствие между грамматиками и автоматами
1.6.1 Регулярные грамматики и FSA эквивалентны
Эквивалентность регулярных грамматик (RG) и FSA конструктивна в обе стороны.
От FSA к RG. Дан FSA
(каждое состояние — нетерминал); (входной алфавит — терминалы); (начальное состояние — аксиома);- для каждого перехода
добавить правило ; - для каждого
добавить .
Инвариант:
От RG к FSA. Дана
(нетерминалы — состояния; добавить отдельное принимающее состояние); ; ; ;- для каждого
добавить ; - для каждого
(без хвостового нетерминала) добавить .
Так подтверждается, что регулярные грамматики, FSA и регулярные выражения — три эквивалентных формализма для одного семейства языков.
1.6.2 КС-грамматики и NPDA эквивалентны
Контекстно-свободные грамматики эквивалентны недетерминированным автоматам с магазином. Доказательство — теоретическое ядро построения компиляторов. Наглядно: NPDA может моделировать левый вывод КС-грамматики, храня текущую сентенциальную форму в стеке. Если на вершине нетерминал
Обратно, любой NPDA можно преобразовать в эквивалентную КС-грамматику (это сложнее, но тоже конструктивно). Поэтому:
1.6.3 Неограниченные грамматики и машины Тьюринга эквивалентны
Общие (неограниченные) грамматики и машины Тьюринга задают один и тот же класс языков — рекурсивно перечислимые. По общей грамматике TM может моделировать выводы, недетерминированно применяя продукции. По TM общая грамматика может кодировать смены конфигураций как переписывания. Так закрепляется вершина иерархии Хомского.
1.6.4 Линейно ограниченный автомат
Линейно ограниченный автомат (LBA) — машина Тьюринга с ключевым ограничением: головка чтения/записи остаётся в пределах участка ленты, занятого входной строкой (между маркерами конца [ и ]). Клетки за пределами входа недоступны.
Длина доступной ленты — линейная функция от
1.7 Проблема соответствия Поста
1.7.1 Определение
Проблема соответствия Поста (Post Correspondence Problem, PCP), введённая Эмилем Постом в 1946 году, — один из простейших примеров неразрешимой задачи. В теории вычислимости её часто используют как ступеньку для доказательства неразрешимости других задач (сведением к PCP).
Вход: два списка
Вопрос: существует ли конечная последовательность индексов
То есть конкатенация выбранных строк из
1.7.2 Задача неразрешима
Не существует алгоритма, который для произвольного входа PCP всегда отвечает, есть ли решение. Иными словами, нет машины Тьюринга, которая по любому экземпляру
1.8 Теория вычислимости
1.8.1 Два центральных вопроса
Теория вычислений ставит два фундаментальных вопроса:
- Математический: что вообще можно вычислить? — существует ли механическая процедура для этой задачи?
- Инженерный: насколько эффективно можно вычислить? — сколько времени или памяти нужно алгоритму?
Теория вычислимости отвечает на первый вопрос. Она изучает пределы механического решения задач: какие задачи разрешимы на любой вычислительной модели и какие нет — независимо от мощности устройства или выделенного времени.
Удобная метафора: теория вычислимости изучает «скорость света» информатики — фундаментальный предел, который не преодолеть вычислением. Как физические законы ограничивают возможное, так и пределы вычислимости ограничивают математически разрешимое.
1.8.2 Тезис Чёрча — Тьюринга
Тезис Чёрча — Тьюринга (Church-Turing Thesis) — центральное утверждение теории вычислимости. Неформально:
Любая функция, которую можно эффективно вычислить конечной пошаговой процедурой, вычислима машиной Тьюринга.
Это тезис, а не теорема: неформальное «эффективно вычислить» не является математическим определением. Тезис нельзя доказать, только подкрепить: у каждой предложенной модели вычислений (λ-исчисление, частично рекурсивные функции, RAM-машины, квантовые компьютеры и т.д.) либо доказана эквивалентность по выразительности машинам Тьюринга, либо строго меньшая мощность.
Практический вывод: чтобы показать, что задачу нельзя решить никаким алгоритмом, достаточно показать, что её не решает машина Тьюринга.
1.8.3 Проблема останова и неразрешимость
Проблема останова — вопрос: для программы
Задача разрешима (её ещё называют рекурсивной или вычислимой), если существует машина Тьюринга, которая:
- останавливается и допускает каждый вход из языка задачи, и
- останавливается и отвергает каждый вход вне языка.
Задача полуразрешима (рекурсивно перечислима), если TM допускает все положительные входы, но на отрицательных может не остановиться.
Задача неразрешима, если ни одна TM не решает её. Неразрешимые задачи существуют; проблема останова и PCP — классические примеры.
2. Определения
- Построение Томпсона: алгоритм, переводящий любое регулярное выражение в эквивалентный ε-NFSA путём рекурсивного построения фрагментов для подвыражений и склейки по фиксированным правилам конкатенации, объединения и звезды Клини.
- ε-NFSA (ε-недетерминированный конечный автомат): NFSA с
-переходами — переходами без чтения входного символа, позволяющими автомату менять состояние «самопроизвольно». - Алгоритм Клини: алгоритм перевода конечного автомата
в регулярное выражение путём вычисления для каждой пары состояний и каждой границы на промежуточные состояния выражения — все пути из в через состояния с индексом не больше . - Грамматика: четвёрка
, задающая множество правил переписывания (продукций) над нетерминалами и терминалами, из которых из аксиомы выводятся строки языка. - Вывод: последовательность строк
, где на каждом шаге подстрока заменяется по одной продукции. Порождённый язык — множество всех терминальных цепочек, выводимых из . - Иерархия Хомского: классификация формальных грамматик (и порождаемых ими языков) на четыре вложенных типа — тип 0 (неограниченные), тип 1 (контекстно-зависимые), тип 2 (контекстно-свободные), тип 3 (регулярные) — с соответствием классам автоматов.
- Неограниченная грамматика (тип 0): грамматика без ограничений на продукции
кроме . По мощности эквивалентна машинам Тьюринга; порождает рекурсивно перечислимые языки. - Контекстно-зависимая грамматика (тип 1): правила вида
( ). Нетерминал переписывается в контексте окружающих цепочек. Эквивалентна LBA. - Контекстно-свободная грамматика (тип 2): правила вида
— один нетерминал переписывается в произвольную цепочку независимо от контекста. Эквивалентна недетерминированным автоматам с магазином. - Форма Бэкуса — Наура (BNF): нотация для КС-грамматик, задающая синтаксис языков программирования в виде правил
<нетерминал> ::= <ПЧ>. Формально эквивалентна CFG. - Регулярная грамматика (тип 3): все правила праволинейные (
или ) или все леволинейные ( или ); смешивать ориентации нельзя. Эквивалентна FSA и регулярным выражениям. - Праволинейная грамматика: каждое правило
или ; нетерминал (если есть) всегда справа в правой части. - Леволинейная грамматика: каждое правило
или ; нетерминал (если есть) всегда слева в правой части. - Линейно ограниченный автомат (LBA): машина Тьюринга с головкой, ограниченной ячейками, занятыми входом (между маркерами конца). LBA распознают в точности контекстно-зависимые языки.
- Разбор (parsing): процесс, в котором автомат (парсер) проверяет, что входная строка (программа) удовлетворяет грамматике (спецификации языка), и восстанавливает синтаксическую структуру.
- Проблема соответствия Поста (PCP): задача: по двум спискам строк
и одинаковой длины выяснить, существует ли конечная последовательность индексов, при которой конкатенация выбранных строк из совпадает с конкатенацией соответствующих строк из . PCP неразрешима. - Теория вычислимости: раздел теоретической информатики о том, какие задачи могут (и не могут) быть решены механической вычислительной процедурой, независимо от времени и памяти.
- Разрешимая задача: существует машина Тьюринга, которая всегда останавливается и корректно отвечает «да» или «нет» на каждый вход.
- Полуразрешимая задача: машина Тьюринга допускает все положительные входы, но на отрицательных может не останавливаться. То же: рекурсивно перечислимая.
- Неразрешимая задача: ни одна машина Тьюринга не решает задачу; не существует алгоритма, верного на всех входах.
- Тезис Чёрча — Тьюринга: утверждение, что всякая интуитивно вычислимая функция вычислима машиной Тьюринга; эквивалентно: машины Тьюринга исчерпывают предел механического вычисления.
3. Формулы
- Алгоритм Клини — начальный шаг (
):н е т п р я м о г о п е р е х о д а и з в - Алгоритм Клини — рекурсивный шаг:
- Язык FSA через Клини:
- Построение Томпсона — объединение:
н о в о е н а ч а л о и о б а п р и н и м а ю щ и х н о в о е п р и н и м а ю щ е е - Построение Томпсона — звезда Клини:
н о в о е н а ч а л о п е т л я н а з а д п л ю с о б х о д н о в о е п р и н и м а ю щ е е
4. Примеры
4.1. Построить ε-NFSA для (Лаба 11, Пример 1)
Постройте ε-NFSA для регулярного выражения
Показать решение
Шаг 1 — построить
Шаг 2 — построить
Шаг 3 — построить
Шаг 4 — построить
Итоговый автомат имеет состояния
(ветвь ); (ветвь ).
Шаг 5 — применить звезду Клини. Новые начальное
(вход в автомат объединения); (петля для следующего повторения); (обход при нуле повторений); (переход в принимающее состояние после одного или более повторений).
Ответ: ε-NFSA имеет 9 состояний и распознаёт в точности
4.2. Применить алгоритм Клини к двухсостоятельному FSA (Лаба 11, Пример 2)
Найдите регулярное выражение для языка, принимаемого FSA с состояниями
Показать решение
Шаг
Просматриваем каждую пару состояний:
: из в по прямым переходам. , символ — петля. Так как : . : из в . : . : из в . : . : из в , нет петли по символу. При и отсутствии петель по символам: .
Шаг
Применяем
Упрощение:
, и . Допускается любое конечное число нулей, в том числе ни одного.Из
в (с петлями) и затем по в .Переход
из в , затем опциональные петли в .Через
по , петли, обратно в по ; либо ноль шагов в .
Шаг
Единственное принимающее —
Подстановка:
Упрощение:
Так как
Интерпретация: язык состоит из всех строк из
4.3. Построить ε-NFSA для (Лаба 11, Задание 1)
По построению Томпсона постройте ε-NFSA для регулярного выражения
Показать решение
Шаг 1 —
Шаг 2 —
Шаг 3 —
(петля); (выход); (обход при нуле единиц).
Шаг 4 —
Автомат принимает в точности строки
4.4. Построить ε-NFSA для (Лаба 11, Задание 2)
По построению Томпсона постройте ε-NFSA для
Показать решение
Шаг 1 —
Шаг 2 —
Цепочка: принимающее состояние
Полный автомат: 1. Старт в
Допускаются строки длины 3 вида «
4.5. Построить ε-NFSA для (Лаба 11, Задание 3)
По построению Томпсона постройте ε-NFSA для
Показать решение
Шаг 1 — два отдельных
Шаг 2 —
Шаг 3 —
Шаг 4 —
Допускаются все строки, начинающиеся с
4.6. Применить алгоритм Клини к FSA 1 (Лаба 11, Задание 4)
Найдите регулярное выражение для FSA с состояниями
Показать решение
Шаг
(петля по плюс для нуля шагов). (прямой переход в по ). (нет перехода из в ). (петля по ).
Шаг
Шаг
Нужно
Так как
Интерпретация: язык — все строки вида (ноль или более единиц), затем (один или более нулей). Автомат принимает строки из любого числа ведущих единиц и хотя бы одного нуля после них.
4.7. Применить алгоритм Клини к FSA 2 (Лаба 11, Задание 5)
Найдите регулярное выражение для FSA с состояниями
Показать решение
Шаг
Шаг
Шаг
Так как
Интерпретация: автомат находится в
4.8. Регулярное выражение для трёхсостоятельного FSA (Домашнее задание 11, Задание 1)
Найдите регулярное выражение для языка FSA с состояниями
Показать решение
Шаг
(и , и ведут из в )
Шаг
Так как
Шаг
Шаг
Сначала
И
Так как
Ответ:
Интерпретация: принимаются только цепочки из единиц (включая пустую). Любой
4.9. Построить ε-NFSA для (Домашнее задание 11, Задание 2)
По построению Томпсона постройте ε-NFSA для
Показать решение
Шаг 1 —
Шаг 2 —
Шаг 3 —
Вводим
(петля); (выход); (обход).
Шаг 4 —
Шаг 5 — конкатенация
Слить
Допускаются строки из чётного числа единиц (включая ноль), за которым следует один бит: