Учебник Теория автоматов и формальных языков для начинающих
Этот курс — путешествие к самым основам информатики: что компьютер вообще способен вычислить, а что не способен в принципе. Мы строим формальную лестницу от простейших конечных автоматов до машины Тьюринга, разбираем иерархию Хомского, доказываем, что некоторые языки не распознаются регулярками, и встречаем проблему остановки — задачу, которую невозможно решить ни одной программой. По дороге много исполнимых симуляций на чистом Python (ДКА, НКА, разбор грамматик, машина Тьюринга), ASCII-диаграмм автоматов и строгих, но понятных доказательств. Курс рассчитан на тех, кто знает основы программирования и хочет увидеть теоретический фундамент под лексерами, парсерами, regex-движками и самим понятием «вычислимо».
Курс «Теория автоматов и формальных языков» состоит из 8 разделов и 27 уроков: Зачем нужна теория вычислений, Конечные автоматы, Эквивалентность и регулярные языки, Минимизация и границы регулярных языков, Контекстно-свободные грамматики, Свойства контекстно-свободных языков, Машина Тьюринга и вычислимость и Сложность и применения теории. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Зачем нужна теория вычислений
- Что компьютер может и чего не может
Зачем нужна теория вычислений: фундамент CS, пределы вычислимости, абстрактные модели и почему некоторые задачи неразрешимы в принципе.
- Алфавиты, строки и языки
Формальные определения: алфавит, строка, пустое слово, конкатенация, степень и замыкание Клини, язык как множество строк над алфавитом.
- Иерархия Хомского: карта курса
Четыре типа грамматик и языков по Хомскому: регулярные, контекстно-свободные, контекстно-зависимые, рекурсивно-перечислимые — и какие машины им соответствуют.
- Что компьютер может и чего не может
2 Конечные автоматы
- Детерминированный конечный автомат (ДКА)
Формальное определение ДКА: пятёрка (Q, Σ, δ, q0, F), диаграмма состояний, таблица переходов, принятие строки и язык автомата.
- Недетерминированный автомат (НКА)
НКА: несколько переходов по одному символу, принятие по существованию принимающего пути, почему недетерминизм удобен для построения автоматов.
- ε-переходы и НКА-ε
ε-переходы в недетерминированных автоматах: переход без чтения символа, ε-замыкание, зачем они нужны для объединения и конкатенации автоматов.
- Детерминированный конечный автомат (ДКА)
3 Эквивалентность и регулярные языки
- Детерминизация: построение подмножеств
Эквивалентность ДКА и НКА: алгоритм построения подмножеств (subset construction), состояния-множества, экспоненциальный взрыв в худшем случае.
- Теорема Клини: регулярки = автоматы
Теорема Клини: класс языков конечных автоматов совпадает с классом регулярных выражений. Операции регулярок и связь с курсом regex.
- Замкнутость регулярных языков
Регулярные языки замкнуты относительно объединения, конкатенации, звезды, дополнения и пересечения. Конструкция дополнения и произведения автоматов.
- Лемма о накачке для регулярных языков
Лемма о накачке (pumping lemma): инструмент доказательства не-регулярности языка. Формулировка, интуиция через повтор состояний, доказательство для a^n b^n.
- Детерминизация: построение подмножеств
4 Минимизация и границы регулярных языков
- Минимизация ДКА
Минимизация детерминированного автомата: эквивалентные состояния, алгоритм разбиения на классы, единственность минимального ДКА.
- Что регулярные языки НЕ могут
Границы регулярных языков: вложенные скобки, a^n b^n, палиндромы, почему конечной памяти недостаточно и зачем нужен стек.
- Минимизация ДКА
5 Контекстно-свободные грамматики
- КС-грамматики: правила и вывод
Контекстно-свободные грамматики: нетерминалы и терминалы, продукции A → γ, вывод строк, связь с BNF и синтаксисом языков программирования.
- Деревья разбора и вывод
Дерево разбора КС-грамматики: структура вывода, левый и правый вывод, как дерево отражает синтаксис выражения и связь с парсерами.
- Неоднозначность грамматик
Неоднозначные КС-грамматики: несколько деревьев разбора для одной строки, классический пример выражений, устранение неоднозначности приоритетом.
- Магазинные автоматы (PDA)
Магазинный (pushdown) автомат: конечный автомат со стеком, переходы с операциями над стеком, распознавание КС-языков, пример a^n b^n.
- КС-грамматики: правила и вывод
6 Свойства контекстно-свободных языков
- Лемма о накачке для КС-языков
Лемма о накачке для контекстно-свободных языков: накачка двух участков uv^i wx^i y, доказательство не-КС для a^n b^n c^n.
- Нормальная форма Хомского
Нормальная форма Хомского (CNF): правила A → BC и A → a, зачем приводить грамматику к ней, связь с алгоритмом CYK-разбора.
- Границы КС-языков и замкнутость
Замкнутость КС-языков: есть для объединения и звезды, нет для пересечения и дополнения. Граница перед контекстно-зависимыми языками.
- Лемма о накачке для КС-языков
7 Машина Тьюринга и вычислимость
- Машина Тьюринга: определение
Определение машины Тьюринга: бесконечная лента, головка чтения-записи, функция переходов, принятие и остановка. Конфигурации и язык машины.
- Тезис Чёрча-Тьюринга
Тезис Чёрча-Тьюринга: что значит «вычислимо». Эквивалентность моделей вычисления, почему тезис не теорема, а гипотеза о природе алгоритма.
- Разрешимость и проблема остановки
Проблема остановки неразрешима: доказательство диагональным аргументом. Разрешимые и распознаваемые языки, что значит «алгоритма не существует».
- Сводимость задач
Сводимость одной задачи к другой: как доказать неразрешимость через редукцию от проблемы остановки. Идея «если бы B решалась, решалась бы и A».
- Машина Тьюринга: определение
8 Сложность и применения теории
- Классы P и NP
Классы сложности P и NP: задачи, решаемые за полиномиальное время, и задачи с проверяемым за полином сертификатом. Примеры и интуиция.
- NP-полнота и проблема P=NP
NP-полные задачи как самые трудные в NP, теорема Кука-Левина, проблема P=NP на миллион долларов и связь с олимпиадным программированием.
- Применения: лексеры и парсеры
Где работает теория автоматов: лексический анализ конечными автоматами, синтаксический разбор КС-грамматиками, архитектура компилятора и regex-движки.
- Карта пройденного пути
Итоговая карта курса теории вычислений: от алфавитов и автоматов через иерархию Хомского к вычислимости и сложности, единая картина и связи.
- Классы P и NP