Полное Тьюринга?

Что означает выражение "Turing Complete"?

можете ли вы дать простое объяснение, не вдаваясь в теоретические подробности?

11 ответов


вот самое краткое объяснение:

полная система Тьюринга означает систему, в которой может быть написана программа, которая найдет ответ (хотя и без гарантий относительно времени выполнения или памяти).

Итак, если кто-то говорит: "моя новая вещь-полная Тьюринга", это означает, что в принципе (хотя часто и не на практике) она может быть использована для решения любой вычислительной проблемы.

иногда это шутка... парень написал симулятор машины Тьюринга в vi, так что это можно сказать, что vi-единственный вычислительный двигатель, когда-либо необходимый в мире.


вот самое простое объяснение

Алан Тьюринг создал машину, которая может взять программу и запустить эту программу и показать некоторый результат. Но потом ему пришлось создавать разные машины для разных программ. Поэтому он создал "универсальную машину Тьюринга", которая может взять любую программу и запустить ее.

языки программирования похожи на эти машины (хотя и виртуальные). Они берут программы и запускают их. Теперь язык программирования называется " Turing complete", если это может запустить любую программу (независимо от языка), которую машина Тьюринга может запустить, имея достаточно времени и памяти.

например: предположим, есть программа, которая берет 10 чисел и добавляет их. Машина Turing может легко запустить эту программу. Но теперь представьте, что по какой-то причине ваш язык программирования не может сделать то же самое дополнение, тогда это машина Тьюринга неполная. С другой стороны, если он может запустить любую программу, такую как универсальная машина Тьюринга, то это Тьюринг завершен.

большинство современных языков программирования, таких как Java, JavaScript, Perl и т. д., завершены, потому что все они реализуют все функции, необходимые для запуска программ, таких как сложение, умножение, условие if-else, операторы возврата, способы хранения/извлечения/стирания данных и т. д.

Update: вы можете узнать больше в моем блоге:"JavaScript Является Turing Complete" - Объяснил


с Википедия:

полнота Тьюринга, названная в честь Алана Тьюринг, значим в том, что каждый правдоподобная конструкция для вычисления устройство до сих пор advanced можно эмулировать универсальная машина Тьюринга - это наблюдение, которое стало известно как тезис Черча-Тьюринга. Таким образом, машина, которая может действовать как универсальная Машина Тьюринга может в принципе, выполните любое вычисление, которое любое другое программируемый компьютер способен. Однако, это не имеет ничего общего с усилия, необходимые для написания программы для машины времени это может занять для машины для выполнения расчет, или любые способности машина может обладать тем, что не связано к вычислениям.

пока поистине Turing-полные машины очень вероятно, физически невозможно, поскольку они требуют неограниченного хранения, Полнота Тьюринга часто слабо выражена приписывается физическим машинам или языки программирования, которые будут универсальные, если бы у них было неограниченное место хранения. Все современные компьютеры Тьюринг-полный в этом смысле.

Я не знаю, как вы можете быть более нетехническим, чем это, кроме как сказать: "turing complete означает"способный ответить на вычислимую проблему при достаточном времени и пространстве"".


Неофициальное Определение

полный язык Тьюринга-это тот, который может выполнять любые вычисления. The Тезис Черча-Тьюринга утверждает, что любые выполнимые вычисления могут быть выполнены машиной Тьюринга. А машина Тьюринга - машина с бесконечной оперативной памятью и конечной "программой", которая диктует, когда она должна читать, писать и перемещаться по этой памяти, когда она должна завершиться с определенным результатом и что она должна делать дальше. Вход чтобы машина Тьюринга помещалась в ее память перед ее запуском.

вещи, которые могут сделать язык не Тьюринг полный

машина Тьюринга может принимать решения на основе того, что она видит в памяти - 'язык', который поддерживает только +, -, * и / на целых числах не является Тьюрингом полным, потому что он не может сделать выбор на основе его ввода, но машина Тьюринга может.

машина Тьюринга может работать вечно - Если бы мы взяли Java, Javascript или Python и удалили возможность делать какой-либо цикл, GOTO или вызов функции, это не было бы полным Тьюрингом, потому что он не может выполнять произвольные вычисления, которые никогда не заканчиваются. Coq является доказательством теоремы, которое не может выражать программы, которые не заканчиваются, поэтому он не является полным Тьюринга.

машина Тьюринга может использовать бесконечную память - язык, который был точно как Java, но завершится, как только он использовал более 4 Гигабайты памяти не будут заполнены Тьюрингом, потому что машина Тьюринга может использовать бесконечную память. Вот почему мы не можем на самом деле построить машина Тьюринга, но Java по-прежнему является полным языком Тьюринга, потому что Java язык не имеет ограничений, мешающих ему использовать бесконечную память. Это одна из причин, по которой регулярные выражения не являются полными.

машина Тьюринга имеет оперативную память - это язык, который позволяет работа с памятью через push и pop операции со стеком не будут завершены Тьюрингом. Если у меня есть "язык", который читает строку после и может использовать только память, нажимая и выскакивая из стека, он может сказать мне, каждый ли ( в строке есть своя ) позже, нажав, когда он видит ( и выскакивают, когда он видит ). Однако, он не может сказать мне, если каждый ( своя ) позже и[ своя ] позже (обратите внимание, что ([)] отвечает этим критериям, но ([]] нет). Машина Тьюринга может использовать свою оперативную память для отслеживания ()и []отдельно, но этот язык только со стеком не может.

машина Тьюринга может имитировать любую другую машину Тьюринга - машина Тьюринга, получив соответствующую "программу", может взять "программу" другой машины Тьюринга и имитировать ее на произвольном входе. Если бы у тебя был язык, который запрещен ... от реализации интерпретатора Python это не было бы полным Тьюрингом.

примеры полных языков Тьюринга

если ваш язык имеет бесконечную оперативную память, условное выполнение и некоторую форму повторного выполнения, это, вероятно, Turing complete. Есть более экзотические системы, которые все еще могут достичь всего, что может машина Тьюринга, что делает их Тьюринг полными тоже:

  • Нетипизированное лямбда-исчисление
  • Конвей игра жизни
  • Шаблоны C++
  • Пролог

в принципе, полнота Тьюринга - это одно краткое требование, неограниченная рекурсия.

даже не ограниченный памятью.

Я думал об этом самостоятельно, но здесь обсуждается утверждения. мое определение LSP предоставляет больше контекста.

другие ответы здесь напрямую не определяют фундаментальную сущность Тьюринга-полноты.


Turing Complete означает, что он по крайней мере так же силен, как Машина Тьюринга. Это означает, что все, что может быть вычислено машиной Тьюринга, может быть вычислено полной системой Тьюринга.

никто еще не нашел систему более мощным, чем машина Тьюринга. Таким образом, пока говорить, что система является полной Тьюринга, то же самое, что говорить, что система так же сильна, как любая известная вычислительная система (см. Тезис Черча-Тьюринга).


в простейших терминах система Тьюринга может решить любую возможную вычислительную задачу.

одним из основных требований является размер Блокнота будет ограниченным и что можно перемотать получить доступ к предварительной записи в блокноте.

таким образом, на практике ни одна система не является полной.

скорее, некоторые системы приближают полноту Тьюринга, моделируя неограниченную память и выполняя любые возможные вычисления, которые могут вписаться в систему память.


Я думаю, что важность понятия " Turing Complete "заключается в способности идентифицировать вычислительную машину (не обязательно механический/электрический" компьютер"), которая может деконструировать свои процессы в" простые " инструкции, состоящие из более простых и простых инструкций, которые универсальная машина может интерпретировать, а затем выполнять.

Я настоятельно рекомендую аннотированный Тьюринг

@Mark я думаю, что то, что вы объясняете, - это смесь между описанием универсальная машина Тьюринга и Turing Complete.

Что-то, что является полным Тьюринга, в практическом смысле, было бы машиной/процессом/вычислением, способным быть написанным и представленным в виде программы, выполняемой универсальной машиной (настольным компьютером). Хотя это не учитывает время или хранение, Как упоминалось другими.


As Вэйлон Флинн сказал:

Turing Complete означает, что он по крайней мере так же силен, как машина Тьюринга.

Я считаю, что это неверно, система Тьюринга завершена, если она точно такая же мощная, как машина Тьюринга, т. е. каждое вычисление, выполненное машиной, может быть сделано системой, но также и каждое вычисление, выполненное системой, может быть сделано машиной Тьюринга.


в практических терминах языка, знакомых большинству программистов, обычный способ определения полноты Тьюринга - это если язык позволяет или позволяет имитировать вложенные неограниченные операторы while (в отличие от стиля Паскаля для операторов с фиксированными верхними границами).


может ли реляционная база данных вводить широты и долготы мест и дорог и вычислять кратчайший путь между ними - нет. Это одна из проблем, которая показывает, что SQL не является полным Тьюрингом.

но C++ может это сделать и может сделать любую проблему. Так оно и есть.