Неформальное определение
Полный язык Тьюринга - это язык, который может выполнять любые вычисления. В тезисе Черч-Тьюринга говорится, что любые выполнимые вычисления могут быть выполнены машиной Тьюринга. машина Тьюринга - это машина с бесконечной оперативной памятью и конечной «программой», которая определяет, когда ей следует читать, записывать и перемещаться по этой памяти, когда она должна завершиться с определенным результатом, и что она следует делать дальше. Входные данные машины Тьюринга помещаются в ее память до ее запуска.
Вещи, которые могут сделать язык НЕ Тьюринг завершенным
Машина Тьюринга может принимать решения на основе того, что она видит в памяти - «Язык», который поддерживает только +
, -
, *
и /
для целых чисел, не является Тьюринг завершен, потому что он не может сделать выбор на основе своего вклада, но машина Тьюринга может.
Машина Тьюринга может работать вечно - Если бы мы взяли Java, Javascript или Python и удалили возможность выполнять какие-либо циклы, GOTO или вызов функции, это не было бы завершением Тьюринга, потому что он не может выполнить произвольное вычисление, которое никогда не заканчивается. Coq - это средство проверки теорем, которое не может выразить программы, которые не завершаются, поэтому оно не завершено по Тьюрингу.
Машина Тьюринга может использовать бесконечную память - Язык, который был в точности похож на Java, но прекратил бы работу, если бы он использовал более 4 ГБ памяти, не был бы завершен по Тьюрингу, поскольку машина Тьюринга может использовать бесконечное объем памяти. Вот почему мы не можем на самом деле собрать машину Тьюринга, но Java по-прежнему является полным языком Тьюринга, потому что язык Java не имеет ограничений, препятствующих использованию бесконечной памяти. Это одна из причин, почему регулярные выражения не являются полными по Тьюрингу.
Машина Тьюринга имеет оперативную память - язык, который позволяет работать с памятью только через операции push
и pop
в стеке, не будет завершен по Тьюрингу. Если у меня есть «язык», который читает строку один раз и может использовать память только путем выталкивания и извлечения из стека, он может сказать мне, есть ли у каждого (
в строке свой собственный )
позже нажмите, когда он видит (
, и нажмите, когда он видит )
. Тем не менее, он не может сказать мне, если каждый (
имеет свой собственный )
позже и каждый [
имеет свой собственный ]
позже (обратите внимание, что ([)]
соответствует этому критерию, но ([]]
нет). Машина Тьюринга может использовать свою оперативную память для отслеживания ()
и []
по отдельности, но этот язык только со стеком не может.
Машина Тьюринга может имитировать любую другую машину Тьюринга - Машина Тьюринга, когда ей назначена соответствующая «программа», может взять «программу» другой машины Тьюринга и смоделировать ее на произвольном входе. Если бы у вас был язык, которому было запрещено реализовывать интерпретатор Python, он не был бы завершен по Тьюрингу.
Примеры тьюринговых полных языков
Если ваш язык имеет бесконечную память с произвольным доступом, условное выполнение и некоторую форму повторного выполнения, вероятно, выполнение Тьюринга завершено. Существуют более экзотические системы, которые все еще могут достичь всего, что может машина Тьюринга, что делает их также завершенными:
- Нетипизированное лямбда-исчисление
- Игра жизни Конвея
- Шаблоны C ++
- Пролог