Полнота по Тьюрингу говорит об одном и только об одном: модель вычислений является полной по Тьюрингу, если с помощью этой модели можно смоделировать любые вычисления, которые могут быть смоделированы машиной Тьюринга.
Итак, какие вычисления может смоделировать машина Тьюринга? Ну, во-первых, Алан Тьюринг и все его коллеги интересовались только функциями с натуральными числами. Таким образом, машина Тьюринга (и λ-исчисление, исчисление комбинаторов SK, μ-рекурсивные функции…) говорят только о вычислимости функций на натуральных числах. Если вы не говорите о функции на натуральных числах, то концепция полноты по Тьюрингу даже не имеет смысла, она просто не применима.
Заметьте, однако, что мы можем закодировать множество интересных вещей как натуральные числа. Мы можем кодировать строки как натуральные числа, мы можем кодировать графики как натуральные числа, мы можем кодировать логические числа как натуральные числа. Мы можем закодировать Машины Тьюринга как натуральные числа, что позволяет нам создавать Машины Тьюринга, которые говорят о машинах Тьюринга!
И, конечно же, не все функции на натуральных числах вычислимы. Машина Тьюринга может вычислять только некоторые функции на натуральных числах, λ-исчисление может вычислять только некоторые функции на натуральных числах, исчисление комбинатора SK может вычислять только некоторые функции на натуральных числах,…. Удивительно (или нет), оказывается, что каждая модель вычислений (которая фактически реализуема в нашей физической вселенной) может вычислять те же функции на натуральных числах (по крайней мере для всех моделей, которые мы до сих пор находили). [Примечание: очевидно, что существуют более слабые модели вычислений, но мы еще не нашли более сильную модельза исключением тех, которые явно несовместимы с нашей физической вселенной, такие как модели, использующие реальные числа или путешествия во времени.]
Этот факт, что после долгого времени поиска для множества различных моделей, мы находим, каждый раз, что они могут вычислить точно те же функции, является основой для Черча-Тьюринга-Thesis, в котором говорится (грубо) , что все Модели вычислений одинаково мощны, и все они отражают «идеальное» понятие того, что значит быть «вычислимым». (Существует также второй, более философский аспект CTT, а именно, что человек, следуя алгоритму, может также вычислять точно такие же функции, которые может вычислять TM, и не более.)
Тем не менее , ничего из этого не говорит о
- насколько эффективны различные модели
- насколько удобно им пользоваться
- что еще они могут сделать, кроме вычисления функций на натуральных числах
И что именно там , где различие между различными моделями вычислений (и языков программирования) вступает в игру.
В качестве примера различной производительности, как машина произвольного доступа, так и машина Тьюринга могут копировать массив. Но для этого в ОЗУ необходимы в то время как для ТМ нужны , поскольку для копирования каждого элемента необходимо пропускать массива. и есть элементы для копирования.O(sizearray)O(size2array)sizearraysizearray
В качестве примера для различного удобства вы можете просто сравнить код, написанный на языке очень высокого уровня, код, написанный на ассемблере, и описание TM для решения той же проблемы.
И ваш выключатель света является примером различий третьего типа, то, что могут делать некоторые модели, которые не являются функциями на натуральных числах и, следовательно, не имеют ничего общего с полнотой по Тьюрингу.
Чтобы ответить на ваши конкретные вопросы:
Но может ли какая-либо программа, написанная на полном языке Тьюринга, быть переписана на другом языке?
Нет, только если программа вычисляет вычислимую по Тьюрингу функцию на натуральных числах. И даже тогда, возможно, потребуется сложное кодирование. Например, λ-исчисление даже не имеет натуральных чисел, их нужно кодировать с использованием функций (потому что функции - это единственное, что имеет λ-исчисление).
Это кодирование ввода и вывода может быть очень сложным, как и выражение алгоритма. Таким образом, хотя действительно и можно переписывать любую программу , переписанная программа может быть гораздо более сложной, гораздо большей, использовать гораздо больше памяти и работать намного медленнее.
Что если моя сборка имеет код операции LIGHTBUTTON? Я физически не могу подражать этому языку в системе (языке) без лампочки.
Лампочка не является вычислимой по Тьюрингу функцией натуральных чисел. Действительно, лампочка не является ни функцией, ни вычислением. Включение и выключение лампочки является побочным эффектом ввода / вывода. Машины Тьюринга не моделируют побочные эффекты ввода / вывода, и Turing-completess к ним не относится.
На произвольных действительных числах.
Полнота Тьюринга имеет дело только с вычислимыми функциями на натуральных числах, она не касается реальных чисел.
Полнота Тьюринга просто не очень интересна, когда речь идет о таких вопросах, как ваш, по двум причинам:
- Это не очень высокое препятствие. Все , что вам нужно , это
IF
, GOTO
, WHILE
и одно целое число переменной (предполагается , что переменная может содержать сколь угодно большие целые числа). Или рекурсия. Много-много-много всего полно Тьюринга. Карточная игра Magic: The Gathering завершена по Тьюрингу. CSS3 завершен по Тьюрингу. sendmail
Файл конфигурации Тьюрингу. Intel x86 MMU является полным по Тьюрингу. MOV
Инструкция Intel x86 завершена по Тьюрингу. Анимации PowerPoint завершены по Тьюрингу. Excel (без сценариев, только с использованием формул) является полным по Тьюрингу. Протокол маршрутизации BGP является полным по Тьюрингу. sed
завершена по Тьюрингу. mod_rewrite
Правила Apache полны по Тьюрингу. Google для " (случайно или удивительно) завершения"чтобы найти другие интересные примеры. Если почти все является полным по Тьюрингу, то полное отсутствие по Тьюрингу перестает быть интересным свойством.
- На самом деле нет необходимости быть полезным. Много полезных вещей не завершено по Тьюрингу. CSS до версии 3 не Тьюринг-полной (и тот факт , что CSS3 является на самом деле не используется кем - либо). SQL до 1999 года не был полным по Тьюрингу, но даже тогда он был чрезвычайно полезен. Язык программирования C без дополнительных библиотек не кажется завершенным по Тьюрингу . Языки с независимой типизацией, более или менее по определению, не являются полными по Тьюрингу, но в них можно писать операционные системы, веб-серверы и игры.
Эдвин Брэди, автор Idris, использует термин «Tetris-complete», чтобы говорить о некоторых из этих аспектов. Быть полным тетриса не является строго определенным (кроме очевидного «может использоваться для реализации тетриса»), но оно включает в себя такие вещи, как быть достаточно высокоуровневым и достаточно выразительным, чтобы вы могли написать игру, не сходя с ума, имея возможность взаимодействовать с внешним миром (вход и выход), быть способным выражать побочные эффекты, уметь писать цикл событий, уметь выражать реактивное, асинхронное и параллельное программирование, уметь взаимодействовать с операционной системой, уметь взаимодействовать с иностранными библиотеками (другими словами: возможность вызывать и вызываться кодом C) и так далее. Это гораздо более интересные особенности языка программирования общего назначения, чем полнота по Тьюрингу.
Вы можете найти мой ответ на интересующий вас вопрос интересным, затрагивающим одни и те же вопросы, даже если он отвечает на другой вопрос.