В теории вычислимости система правил манипулирования данными (например, модель вычислений , набор команд компьютера , язык программирования или клеточный автомат ) называется тьюринг-полной или вычислительно универсальной, если ее можно использовать для моделирования. любая машина Тьюринга (придуманная английским математиком и ученым-компьютерщиком Аланом Тьюрингом ). Это означает, что эта система способна распознавать или принимать решения о других наборах правил манипулирования данными. Полнота по Тьюрингу используется как способ выразить мощь такого набора правил манипулирования данными. Практически все современные языки программирования являются полными по Тьюрингу.
Связанная с этим концепция - это концепция эквивалентности Тьюринга : два компьютера P и Q называются эквивалентными, если P может моделировать Q, а Q может моделировать P. Тезис Чёрча-Тьюринга предполагает, что любая функция, значения которой могут быть вычислены с помощью алгоритма, может быть вычислена с помощью алгоритма . Машина Тьюринга, и, следовательно, если какой-либо реальный компьютер может моделировать машину Тьюринга, то это эквивалент машины Тьюринга. Универсальную машину Тьюринга можно использовать для моделирования любой машины Тьюринга и, как следствие, вычислительных аспектов любого возможного реального компьютера. [Примечание 1]
Чтобы показать, что что-то является полным по Тьюрингу, достаточно показать, что его можно использовать для моделирования некоторой полной по Тьюрингу системы. Ни одна физическая система не может иметь бесконечную память, но если игнорировать ограничение конечной памяти, большинство языков программирования в противном случае будут полными по Тьюрингу.
В разговорной речи термины «Тьюринг-полный» и «Тьюринг-эквивалент» используются для обозначения того, что любой реальный компьютер общего назначения или компьютерный язык может приблизительно моделировать вычислительные аспекты любого другого реального компьютера общего назначения или компьютерного языка. компьютерный язык. В реальной жизни это приводит к практическим концепциям виртуализации и эмуляции вычислений . [ нужна цитата ]
Реальные компьютеры, созданные на данный момент, можно функционально анализировать как одноленточную машину Тьюринга («лента», соответствующая их памяти); таким образом, соответствующая математика может применяться, достаточно абстрагируя их действие. Однако реальные компьютеры имеют ограниченные физические ресурсы, поэтому они представляют собой только линейный ограниченный автомат . Напротив, универсальный компьютер определяется как устройство с полным по Тьюрингу набором команд, бесконечной памятью и бесконечным доступным временем.
В теории вычислимости для описания вычислительной мощности вычислительной системы (например, абстрактной машины или языка программирования ) используются несколько тесно связанных терминов:
Полнота по Тьюрингу важна тем, что любую реальную конструкцию вычислительного устройства можно смоделировать с помощью универсальной машины Тьюринга . Тезис Чёрча-Тьюринга утверждает, что это закон математики: универсальная машина Тьюринга в принципе может выполнять любые вычисления, которые может выполнить любой другой программируемый компьютер . Это ничего не говорит об усилиях, необходимых для написания программы , или о времени, которое может потребоваться машине для выполнения вычислений, или о любых способностях, которыми может обладать машина, не имеющих ничего общего с вычислениями.
Аналитическая машина Чарльза Бэббиджа ( 1830-е годы) была бы первой машиной, полной по Тьюрингу, если бы она была построена в то время, когда была спроектирована. Бэббидж понимал, что машина способна на великие расчеты, включая примитивные логические рассуждения, но не понимал, что ни одна другая машина не может добиться большего. [ нужна цитата ] С 1830-х по 1940-е годы механические вычислительные машины, такие как сумматоры и умножители, были построены и усовершенствованы, но они не могли выполнять условный переход и, следовательно, не были полными по Тьюрингу.
В конце 19 века Леопольд Кронекер сформулировал понятия вычислимости, определив примитивно-рекурсивные функции . Эти функции можно вычислить путем механического вычисления, но их недостаточно для создания универсального компьютера, поскольку инструкции, которые их вычисляют, не допускают бесконечного цикла. В начале 20-го века Дэвид Гильберт возглавил программу аксиоматизации всей математики с помощью точных аксиом и точных логических правил дедукции, которые могли быть выполнены машиной. Вскоре стало ясно, что небольшого набора правил дедукции достаточно, чтобы получить следствия из любого набора аксиом. В 1930 году Курт Гёдель доказал, что этих правил достаточно для вывода любой теоремы.
Само понятие вычислений вскоре было изолировано, начиная с теоремы Гёделя о неполноте . Эта теорема показала, что системы аксиом были ограничены при рассуждениях о вычислениях, из которых выводятся их теоремы. Чёрч и Тьюринг независимо друг от друга продемонстрировали, что проблема Гильберта Entscheidungsproblem (проблема принятия решения) неразрешима, [1] тем самым определив вычислительное ядро теоремы о неполноте. Эта работа, наряду с работой Гёделя по общерекурсивным функциям , установила, что существуют наборы простых инструкций, которые, собранные вместе, способны производить любые вычисления. Работа Гёделя показала, что понятие вычислений по сути уникально.
В 1941 году Конрад Цузе завершил работу над компьютером Z3 . В то время Цузе не был знаком с работами Тьюринга по вычислимости. В частности, у Z3 не было специальных возможностей для условного прыжка, что не позволяло ему быть полным по Тьюрингу. Однако в 1998 году Рохас показал, что Z3 способен имитировать условные переходы и, следовательно, в теории является полным по Тьюрингу. Для этого ее ленточная программа должна быть достаточно длинной, чтобы выполнить все возможные пути через обе стороны каждой ветви. [2]
Первым компьютером, способным выполнять условное ветвление на практике и, следовательно, полным по Тьюрингу на практике, был ENIAC в 1946 году. Компьютер Цузе Z4 начал работать в 1945 году, но он не поддерживал условное ветвление до 1950 года. [3]
Теория вычислимости использует модели вычислений для анализа проблем и определения, вычислимы ли они и при каких обстоятельствах. Первый результат теории вычислимости состоит в том, что существуют проблемы, для которых невозможно предсказать, что будет делать (полная по Тьюрингу) система в течение сколь угодно длительного времени.
Классическим примером является проблема остановки : создать алгоритм, который принимает на вход программу на некотором языке, полном по Тьюрингу, и некоторые данные, которые необходимо передать в эту программу, и определяет, остановится ли программа, работающая на входных данных, в конечном итоге или продолжит работу. навсегда. Создать алгоритм, который может сделать это для некоторых входных данных, тривиально , но в целом это невозможно. Для любой характеристики конечного результата программы невозможно определить, сохранится ли эта характеристика.
Эта невозможность создает проблемы при анализе реальных компьютерных программ. Например, невозможно написать инструмент, который полностью защитит программистов от написания бесконечных циклов или защитит пользователей от ввода входных данных, которые могут вызвать бесконечные циклы.
Вместо этого можно ограничить выполнение программы только в течение фиксированного периода времени ( timeout ) или ограничить мощность инструкций управления потоком (например, предоставляя только циклы, которые перебирают элементы существующего массива). Однако другая теорема показывает, что существуют проблемы, решаемые с помощью Тьюринг-полных языков, которые не могут быть решены ни одним языком с ограниченными возможностями цикла (т. е. любым языком, гарантирующим, что каждая программа в конечном итоге завершится остановкой). Таким образом, любой такой язык не является полным по Тьюрингу. Например, язык, на котором программы гарантированно завершатся и остановятся, не может вычислить вычислимую функцию, созданную диагональным аргументом Кантора для всех вычислимых функций на этом языке.
Компьютер, имеющий доступ к бесконечной ленте данных, может быть более мощным, чем машина Тьюринга: например, лента может содержать решение проблемы остановки или какой-либо другой неразрешимой по Тьюрингу проблемы. Такая бесконечная лента данных называется оракулом Тьюринга . Даже оракул Тьюринга со случайными данными не вычислим ( с вероятностью 1 ), поскольку существует только счетное количество вычислений, но несчетное количество оракулов. Таким образом, компьютер со случайным оракулом Тьюринга может вычислять то, чего не может сделать машина Тьюринга.
Все известные законы физики имеют последствия, которые можно вычислить с помощью ряда приближений на цифровом компьютере. Гипотеза под названием «цифровая физика» утверждает, что это не случайно, поскольку сама Вселенная вычислима на универсальной машине Тьюринга. Это означало бы, что физически невозможно построить компьютер более мощный, чем универсальная машина Тьюринга. [4]
Вычислительные системы (алгебры, исчисления), которые рассматриваются как полные по Тьюрингу системы, предназначены для изучения теоретической информатики . Они призваны быть максимально простыми, чтобы было легче понять пределы вычислений. Вот некоторые из них:
Большинство языков программирования (их абстрактные модели, возможно, с некоторыми конкретными конструкциями, предполагающими опущение конечной памяти), как традиционных, так и нетрадиционных, являются полными по Тьюрингу. Это включает в себя:
Некоторые системы перезаписи являются полными по Тьюрингу.
Полнота по Тьюрингу — это абстрактное утверждение о способности, а не предписание конкретных языковых функций, используемых для реализации этой способности. Функции, используемые для достижения полноты по Тьюрингу, могут быть совершенно разными; Системы Фортрана будут использовать конструкции циклов или, возможно, даже операторы перехода для достижения повторения; Haskell и Prolog, почти полностью лишенные циклов, будут использовать рекурсию . Большинство языков программирования описывают вычисления на архитектурах фон Неймана , которые имеют память (ОЗУ и регистр) и блок управления. Эти два элемента делают эту архитектуру полной по Тьюрингу. Даже чистые функциональные языки полны по Тьюрингу. [7] [Примечание 2]
Полнота по Тьюрингу в декларативном SQL реализуется посредством рекурсивных общих табличных выражений . Неудивительно, что процедурные расширения SQL ( PLSQL и т. д.) также являются полными по Тьюрингу. Это иллюстрирует одну из причин, почему относительно мощные, неполные по Тьюрингу языки встречаются редко: чем мощнее язык изначально, тем сложнее задачи, для решения которых он применяется, и тем скорее его недостаточная полнота начинает восприниматься как недостаток, поощряя его расширение до тех пор, пока оно не станет полным по Тьюрингу.
Нетипизированное лямбда-исчисление является Тьюринг-полным, но многие типизированные лямбда-исчисления, включая Систему F , таковыми не являются. Ценность типизированных систем основана на их способности представлять большинство типичных компьютерных программ, обнаруживая при этом больше ошибок.
Правило 110 и «Игра жизни» Конвея — клеточные автоматы — полны по Тьюрингу.
Некоторые игры и другое программное обеспечение являются полными по Тьюрингу случайно, то есть не намеренно.
Программное обеспечение:
Игры:
Социальные медиа:
Вычислительные языки:
Биология:
Существует множество вычислительных языков, которые не являются полными по Тьюрингу. Одним из таких примеров является множество регулярных языков , которые генерируются регулярными выражениями и распознаются конечными автоматами . Более мощное, но все еще не полное по Тьюрингу расширение конечных автоматов — это категория автоматов с выталкиванием и контекстно-свободных грамматик , которые обычно используются для генерации деревьев синтаксического анализа на начальном этапе компиляции программы . Дополнительные примеры включают некоторые ранние версии языков пиксельных шейдеров, встроенные в расширения Direct3D и OpenGL . [ нужна цитата ]
В языках функционального программирования , таких как Charity и Epigram , все функции являются тотальными и должны завершаться. Charity использует систему типов и конструкции управления , основанные на теории категорий , тогда как Epigram использует зависимые типы . Язык LOOP спроектирован таким образом, что он вычисляет только примитивно-рекурсивные функции . Все они вычисляют правильные подмножества всех вычислимых функций, поскольку полный набор всех вычислимых функций не является вычислимо перечислимым . Кроме того, поскольку все функции в этих языках тотальны, на них не могут быть написаны алгоритмы для рекурсивно перечислимых множеств , в отличие от машин Тьюринга.
Хотя (нетипизированное) лямбда-исчисление является Тьюринг-полным, просто типизированное лямбда-исчисление таковым не является.