Карта пройденного пути

Соберём весь курс в одну картину: как связаны автоматы, грамматики, вычислимость и сложность — и зачем эта связь нужна.

Главная идея курса: мощность памяти определяет класс распознаваемых языков, а пределы памяти превращаются в пределы вычислимости.

Единая лестница

Мы прошли от простейшей машины к пределу алгоритмического. На каждой ступени росла память, и вместе с ней — класс языков. Вот вся карта на одной диаграмме:

память            машина              язык (Хомский)       пример
─────────────────────────────────────────────────────────────────────
нет               конечный автомат    регулярные (тип 3)   a*b*, чётность
стек (LIFO)       магазинный автомат  КС (тип 2)           a^n b^n, скобки
лента (огранич.)  ЛО-автомат          контекстно-зав.(1)   a^n b^n c^n
лента (∞)         машина Тьюринга     рекурс.-перечисл.(0) всё вычислимое
─────────────────────────────────────────────────────────────────────
за пределами:  проблема остановки — неразрешима ВООБЩЕ

Регулярные = конечные автоматы = регулярки (теорема Клини). КС = магазинные автоматы = BNF-грамматики. Машина Тьюринга = предел вычислимого (тезис Чёрча-Тьюринга). Каждое равенство — отдельная глава курса.

Три великих «нельзя»

Курс — это во многом коллекция доказательств невозможного. Сведём их вместе:

Что нельзяИнструмент доказательства
anbn регуляркойлемма о накачке для регулярных
anbncn КС-грамматикойлемма о накачке для КС
решить проблему остановкидиагональный аргумент
(вероятно) решить SAT за полиномNP-полнота (открыто, P=?NP)

Три первых — доказанные невозможности, четвёртая — величайшая открытая гипотеза. Все они говорят об одном: у вычислений есть жёсткие границы, и их можно математически очертить.

Проверь себя: классификатор языков

Соберём знания в маленький «классификатор»: по описанию языка определим его место в иерархии. Это финальная проверка интуиции курса.

languages = [
    ("a*b*",            "регулярный",        "конечный автомат"),
    ("a^n b^n",         "КС (не регулярный)", "магазинный автомат"),
    ("сбаланс. скобки", "КС (не регулярный)", "магазинный автомат"),
    ("a^n b^n c^n",     "контекстно-завис.",  "ЛО-автомат"),
    ("проблема остановки", "неразрешимый",   "никакая (нет алгоритма)"),
]
print(f"{'язык':<20}{'класс':<22}{'машина'}")
print("-" * 70)
for name, cls, machine in languages:
    print(f"{name:<20}{cls:<22}{machine}")

Вывод:

язык                класс                 машина
----------------------------------------------------------------------
a*b*                регулярный            конечный автомат
a^n b^n             КС (не регулярный)    магазинный автомат
сбаланс. скобки     КС (не регулярный)    магазинный автомат
a^n b^n c^n         контекстно-завис.     ЛО-автомат
проблема остановки  неразрешимый          никакая (нет алгоритма)

Если вы можете быстро отнести язык к нужной строке и назвать инструмент доказательства его границ — курс достиг цели.

Как работает под капотом

Почему эта теория не устарела за 90 лет? Потому что она про математические пределы, а не про технологии. Закон Мура ускоряет железо, но не делает неразрешимое разрешимым и не превращает экспоненту в полином. Каждый новый язык программирования Тьюринг-полон — значит, наследует ровно те же границы. Поэтому компиляторы по-прежнему строят на конечных автоматах и КС-грамматиках, криптография по-прежнему опирается на предполагаемую трудность NP-задач, а верификация — на замкнутость регулярных языков. Теория — это карта, по которой инженеры выбирают: какой инструмент достаточен, а какая задача в принципе за пределами достижимого.

Частые ошибки (итоговые)

Путать оси «разрешимость» и «сложность». Разрешимость — есть ли алгоритм вообще; сложность — за разумное ли время. NP-трудная задача разрешима, проблема остановки — нет.

Считать включения нестрогими. Регулярные ⊊ КС ⊊ контекстно-зависимые ⊊ рекурсивно-перечислимые — все включения строгие, что доказано леммами о накачке.

Думать, что «мощнее модель — всегда лучше». На практике берут минимально достаточную модель: лексеру хватит конечного автомата, и это эффективнее, чем тащить парсер.

Итог

  • Память определяет класс языка: нет памяти → регулярные, стек → КС, лента → вычислимое; за пределами — неразрешимое.
  • Ключевые равенства: регулярки = автоматы (Клини), КС = магазинные = BNF, машина Тьюринга = предел вычислимого (Чёрч-Тьюринг).
  • Три доказанных «нельзя» (накачка ×2, диагональ) и одна открытая гипотеза (P=?NP) очерчивают границы вычислений.
  • Теория про математические пределы — она не устаревает и определяет архитектуру компиляторов, regex, криптографии и верификации.
Проверьте себя
1. Что в курсе определяет класс распознаваемых языков для каждой модели?
Aчисло состояний
Bмощность памяти (нет / стек / лента)
Cразмер алфавита
Dскорость машины
2. Каким инструментом доказывают, что a^n b^n c^n не является контекстно-свободным?
Aдиагональным аргументом
Bлеммой о накачке для КС-языков
Cтеоремой Клини
Dпостроением подмножеств
3. Чем оси «разрешимость» и «сложность» отличаются?
Aэто одно и то же
Bразрешимость — существует ли алгоритм вообще, сложность — решается ли за разумное время
Cсложность — про память, разрешимость — про скорость
Dобе про неразрешимость