Вычислимость
Recursive Functions и mu-recursion
Задолго до компьютеров математики пытались точно определить, что значит 'вычислить'. Частично-рекурсивные функции - третий ответ на этот вопрос, наряду с машиной Тьюринга и lambda-исчислением. Все три ответа совпадают - но каждый открывает свой угол зрения на природу вычислений.
- **Union-Find (DSU)** - амортизированная сложность O(α(n)), где α - обратная функция Аккермана, практически O(1)
- **Теоремы Гёделя** - следствие гёделевского кодирования: в арифметике есть недоказуемые истины
- **Теория рекурсивных функций** - фундамент математической логики и верификации программ
- **Нумерация программ** - основа понятия 'компилируемая программа - это данные'
Примитивно-рекурсивные функции
До машин Тьюринга и до lambda-исчисления в 1930-х математики пытались описать «вычислимое» через рекурсию. Примитивная рекурсия - это строгий синтаксис построения функций, гарантирующий завершение. Каждая примитивно-рекурсивная функция всегда останавливается.
**Примитивная рекурсия гарантирует завершение**, но это ограничение: есть вычислимые функции, которые не являются примитивно-рекурсивными. Классический пример - функция Аккермана, которая растёт быстрее любой примитивно-рекурсивной функции.
Почему каждая примитивно-рекурсивная функция гарантированно завершается?
Mu-оператор и частичная рекурсия
Примитивно-рекурсивных функций не хватает: не всё вычислимое можно выразить с гарантией завершения. Чтобы получить полный класс вычислимых функций, добавляют **mu-оператор** (оператор минимизации) - поиск наименьшего аргумента, при котором функция обращается в нуль. Он может не завершиться.
**Частичность** - ключевое слово. Частично-рекурсивные функции могут быть не определены на некоторых входах (зависать). Это не баг - это необходимость: проблема останова доказывает, что нельзя ограничиться только тотальными (всегда завершающимися) функциями и охватить весь класс вычислимого.
Что произойдёт при вычислении μy [f(y) = 0], если f(y) ≠ 0 для всех y?
Функция Аккермана
В 1928 году Вильгельм Аккерман построил функцию, которая вычислима (завершается для любых входных данных), но растёт быстрее, чем любая примитивно-рекурсивная функция. Это доказало, что примитивная рекурсия не охватывает все вычислимые функции.
**Функция Аккермана в алгоритмах** - обратная функция Аккермана α(n) растёт так медленно, что при любых практических n она не превышает 4. Она фигурирует в анализе Union-Find (Disjoint Set Union) - амортизированная сложность операции O(α(n)), что практически O(1).
Почему функция Аккермана доказывает неполноту примитивной рекурсии?
Числа Гёделя и кодирование
Гёдель в 1931 году для доказательства своих теорем о неполноте разработал технику, которая оказалась фундаментальной для теории вычислимости: арифметическое кодирование формул и доказательств. Любой текст можно превратить в число, и наоборот.
Гёделевское кодирование позволяет формулам говорить о самих себе: «Эта формула недоказуема». Именно это привело к первой теореме Гёделя о неполноте: в любой непротиворечивой системе, достаточно богатой для арифметики, есть истинные, но недоказуемые утверждения.
**Универсальная нумерация программ** - прямое следствие идеи Гёделя: любую программу для МТ можно закодировать натуральным числом. Так возникает понятие «программа с номером e» - основа теории рекурсивных функций и рисайзинга теорем (s-m-n теорема, теорема о неподвижной точке Клини).
Почему для кодирования Гёделя используются степени простых чисел, а не просто суммы?
Recursive Functions и mu-recursion
- Примитивно-рекурсивные функции: базис (Z, S, P) + суперпозиция + примитивная рекурсия, всегда завершаются
- Mu-оператор μy[f(y,x)=0]: поиск наименьшего нуля, может не завершиться
- Частично-рекурсивные функции = примитивно-рекурсивные + μ = вычислимые на МТ (теорема Клини)
- Функция Аккермана: тотальная, вычислимая, но не примитивно-рекурсивная - растёт быстрее любой такой функции
- Числа Гёделя: кодирование последовательностей через степени простых чисел, биективно
- Кодирование Гёделя - основа теорем о неполноте и нумерации программ
Связанные темы
Рекурсивные функции связывают вычислимость с математической логикой и строением самих формальных систем.
- Lambda Calculus и вычислимость — Эквивалентная формализация через функции
- Проблема останова — Невычислимость - следствие из теории рекурсивных функций
- Сводимость и иерархии — Классификация степеней невычислимости
Вопросы для размышления
- Почему невозможно ограничиться только примитивно-рекурсивными функциями при описании всего вычислимого?
- Функция Аккермана A(4,2) больше числа атомов во Вселенной. Что это говорит о разрыве между 'вычислимо теоретически' и 'вычислимо практически'?
- Как идея Гёделя - формула может говорить о самой себе - связана с самореференцией в программировании (рефлексия, метапрограммирование)?