Каковы практические рекомендации по оценке полноты Тьюринга языка?

Я прочитал «what-is-turing-complete» и страницу в Википедии, но я Меня меньше интересует формальное доказательство, чем практические последствия полноты по Тьюрингу.

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

Есть ли минимальный набор функций, без которого полнота по Тьюрингу невозможна? Есть ли набор функций, который практически гарантирует полноту?

(Я предполагаю, что условное ветвление и доступное для чтения / записи хранилище памяти помогут мне в большинстве случаев)


РЕДАКТИРОВАТЬ:

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

Я надеялся на набор правил вроде: «если он может делать X, Y и Z, он может вероятно делать что угодно».


person AShelly    schedule 15.01.2009    source источник
comment
Зачем программисту? это не значит, что сама по себе полнота по Тьюрингу имеет какое-либо практическое значение для удобства использования языка программирования.   -  person    schedule 16.01.2009
comment
Ваше предположение поможет вам полностью, если вы также включите какую-то итерацию или рекурсию. :-)   -  person    schedule 16.01.2009
comment
@Kent: Пах, кому нужна итерация или рекурсия, когда у них есть условное ветвление? ЕСЛИ и ПОЙДИТЕ, детка!   -  person Thomas    schedule 04.04.2010


Ответы (13)


Вам нужна какая-то форма конструкции динамического распределения (подойдет malloc илиnew или cons) и либо рекурсивные функции, либо какой-либо другой способ написания бесконечного цикла. Если они у вас есть и вы можете делать что-нибудь интересное, вы почти наверняка полны по Тьюрингу.

Лямбда-исчисление по мощности эквивалентно машине Тьюринга, и если вы реализуете лямбда-исчисление, писать программы лямбда-исчисления на самом деле довольно весело. Да веселее, чем писать программу для машины Тьюринга!

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

person Norman Ramsey    schedule 16.01.2009
comment
Это действительно неверно о необходимости динамического распределения. Окончательный мысленный эксперимент машина Тьюринга просто имеет массив битов. Достаточно одного достаточно большого индексируемого массива. Очевидно, что помимо этого вы можете написать динамическое размещение внутри языка, если хотите. - person poolie; 29.09.2010
comment
@poolie - технически массив должен быть бесконечным для истинного определения «полноты по Тьюрингу». Способность динамически распределять хранилище примерно соответствует этому свойству. - person ConcernedOfTunbridgeWells; 30.09.2010
comment
@concerned, Если вы собираетесь настаивать на бесконечности, тогда вам также нужна возможность распределять бесконечную память, и никакая практическая система на самом деле не позволяет этого. Но мы по-прежнему говорим, что для практических целей они являются полными по Тьюрингу, пока есть достаточно места для выполнения вычислений. Вот почему я сказал достаточно большой. - person poolie; 01.10.2010
comment
С malloc тот факт, что память ограничена, больше не является частью языка. Память ограничена только парой реализация / целевой компьютер. Это важное различие. См. esolangs.org/wiki/Bounded-storage_machine - person ; 29.08.2015
comment
@poolie Я считаю, что выделение памяти - это скорее деталь реализации. Вы можете думать о памяти на вашем компьютере как о выделении, когда ячейка, которая ранее не была перемещена, перемещается в, но теоретическая машина будет иметь бесконечную ленту, а не просто неограниченную один. Разница заключается в реализации; у вас не может быть бесконечной памяти, поэтому вы должны сделать какое-то динамическое распределение. - person Challenger5; 18.12.2016

«Полнота Тьюринга» описывает свойство способности выражать любые произвольные алгоритмическое вычисление, которое было целью Машина Тьюринга. Язык или логическая система может быть описана как «полная по Тьюрингу», если она обладает этим свойством. С практической точки зрения все языки программирования общего назначения - и удивительно большое количество языков специального назначения - могут делать это для достаточно свободного определения (см. Ниже).

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

Примером широко распространенной системы, которая не является полной по Тьюрингу, является реляционная алгебра, теоретическая основа SQL, описанная в статье Кодда Реляционная модель для больших общих банков данных. Реляционная алгебра имеет свойство Полнота по Геделю, что означает, что он может выражать любые вычисления, которые могут быть определены в терминах исчисление предикатов первого порядка (т. е. обычные логические выражения). Однако он не является полным по Тьюрингу, поскольку не может выразить произвольное алгоритмическое вычисление.

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

Еще несколько вопиющих примеров предметно-ориентированных языков Turing Complete - это TeX и sendmail.cf,. В последнем случае есть известный пример использования sendmail.cf для реализовать универсальный симулятор машины Тьюринга.

person ConcernedOfTunbridgeWells    schedule 16.01.2009
comment
Здесь много полезной информации. Не знаю, почему ваш ответ был -1, когда я до него дошел. - person harms; 16.01.2009
comment
Первые два предложения вашего второго абзаца вводят в заблуждение. Концепция полноты по Тьюрингу применима только к языкам программирования, а не к физическим машинам, поэтому ваше утверждение, что никакая физическая машина не может быть полной по Тьюрингу, является пустым. И никакие ограничения обычно не ослабляются (по крайней мере, неформально) при приписывании полноты по Тьюрингу языку программирования. Система эффективно вычислимых правил R (например, язык программирования) является полной по Тьюрингу, если для любых положительных целых чисел N и m и программы Тьюринга P для машины Тьюринга с m состояниями существует целое число T ... - person tparker; 07.08.2017
comment
... так что прохождение R T разное время дает состояние ленты Тьюринга после N шагов Тьюринга. Это определение не требует бесконечного объема памяти для физического компьютера, на котором выполняется код, и даже не делает никаких ссылок на такой физический компьютер. Полнота по Тьюрингу - это чисто математическая концепция: язык программирования C является таким же полным по Тьюрингу при запуске на ENIAC (я знаю, что ENIAC на самом деле никогда не запускал программу C), как и при запуске на современном суперкомпьютере. Гений Тьюринга заключался в том, чтобы определить силу языка программирования таким образом, чтобы ... - person tparker; 07.08.2017
comment
... ничего не имеет отношения к мощности физической машины, которая запускает его в реальном мире. Нет необходимости ослаблять ограничения. - person tparker; 07.08.2017

Если вы можете написать интерпретатор Brainf $ & # на своем языке, он является полным по Тьюрингу. Именно таким образом было доказано, что LOLCODE является полной по Тьюрингу.

person Luke Woodward    schedule 19.01.2009
comment
Очевидно, кому-то нужно добавить еще одно расширение к HQ9 ++, которое интерпретирует Brainf $ & # .... - person Brooks Moses; 13.02.2011
comment
Если бы кто-то сделал полный HQ9 + по Тьюрингу, я бы больше не использовал какой-либо другой язык программирования. Когда-либо. - person Hophat Abc; 28.06.2012
comment
@HophatAbc Моя жизнь Тьюринг завершена. FTFY - person Eva; 26.03.2013

Примеры языков, которые не являются полными по Тьюрингу, часто имеют ограниченные циклы, например:

for i=1 to N {...}

но не хватает неограниченных циклов, которые проверяют более общее условие, например:

while bool_expr {...}

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

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

person comingstorm    schedule 16.01.2009

Я не уверен, существует ли «минимальный набор функций», но чтобы доказать, что язык является полным по Тьюрингу, вам нужно только доказать, что он может эмулировать другую полную систему Тьюринга (не обязательно машину Тьюринга), пока другая система, как известно, завершена по Тьюрингу. http://en.wikipedia.org/wiki/Turing_complete#Examples содержит целый список полных систем Тьюринга. Некоторые из них проще машин Тьюринга.

person Nate879    schedule 15.01.2009

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

person Christian Lindig    schedule 16.01.2009

Brainfuck является полным по Тьюрингу и имеет только циклические структуры и увеличение / уменьшение памяти, так что этого достаточно.

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

Скорее всего, ваша программа не имеет ничего общего с лямбда-исчислением, поэтому для практического ответа должен быть минимум

  1. Способ записи в переменную
  2. Способ чтения переменной
  3. Форма условного перехода (оператор if, цикл while и т. Д.)
person tomjen    schedule 02.05.2009

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

person PolyThinker    schedule 16.01.2009

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

Некоторые показания:

  • Вы можете проверять память и манипулировать ею на основе текущего значения, а также использовать ее для управления ходом выполнения программы.
  • Эта память может быть выделена памятью, строками, которые вы можете добавить, стеком, на который вы можете выделить память с помощью рекурсии и т. Д.
  • Выполнение программы может быть через итерацию или через рекурсию на основе выбора.
person Community    schedule 16.01.2009

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

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

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

Вы всегда можете добавить полноту по Тьюрингу, написав «Сделайте это, то или что-то еще; но сделайте это с результатом, предоставленным X» на любом другом языке полного Тьюринга, где X предоставляется не полным по Тьюрингу языком.

Конечно, если вы хотите использовать только один язык, возможно, лучше будет Turing Complete ...

person Retra    schedule 04.04.2010

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

person Lie Ryan    schedule 24.04.2010

Есть ли минимальный набор функций, без которого полнота по Тьюрингу невозможна? Есть ли набор функций, который практически гарантирует полноту?

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

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

Вам нужно хранилище произвольного размера, доступное для чтения и записи. Например, язык, имеющий только две 32-битные переменные, ограничен в том, что он может вычислить. У вас есть много вариантов того, как структурировано хранилище: память, адресуемая указателями, массивами, стеками, cons-ячейками, чистыми структурами данных и т. Д.

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

person poolie    schedule 18.12.2016

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

Я сомневаюсь, что в полноте Тьюринга есть какие-то практические последствия.

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

person David Norman    schedule 16.01.2009
comment
Рекомендую изучить эту тему еще немного. Полнота по Тьюрингу имеет очень реальные практические последствия. Если у вас есть язык, который не является полным по Тьюрингу, это очень странно, и вы не сможете решать проблемы, которые могут решить подавляющее большинство других языков программирования. - person BobbyShaftoe; 16.01.2009
comment
Я определенно считаю, что для языка важно быть полным по Тьюрингу. Я просто непрактичен, поскольку любой язык, который предназначен для использования в реальной работе, в конечном итоге завершится по Тьюрингу. - person David Norman; 16.01.2009
comment
этот ответ должен быть ответом на этот вопрос, а не отвергнутым. непрактичность неполных по Тьюрингу языков не делает полные по Тьюрингу языки по своей сути практичными! - person ; 16.01.2009
comment
Я не голосовал против, но это не ответ на мой вопрос. Я должен был сказать, какое значение имеет полнота по Тьюрингу для требуемого набора функций языка. И, полагаю, я мог бы заменить полноту по Тьюрингу способностью действовать как универсальная машина. - person AShelly; 16.01.2009
comment
Полнота по Тьюрингу является признаком того, что язык находится на одном уровне с другими языками, когда дело доходит до выразительности. Конечно, это не имеет большого практического значения, поскольку язык, полезный для реальной работы, вероятно, будет завершен по Тьюрингу. Однако ответ не относится к вопросу, я проголосовал против. - person ; 16.01.2009
comment
Полнота тюринга ничего не имеет никакого отношения к выразительности. что вы курите? - person ; 17.01.2009
comment
Языки шейдеров и регулярные выражения являются примерами языков, которые не являются полными по Тьюрингу. Оба очень выразительны и очень практичны. - person Jasper Bekkers; 19.01.2009
comment
@ Джаспер, совершенно верно. Хотя я считаю, что современные шейдерные языки на самом деле являются полными по Тьюрингу, а более старые - нет. en.wikipedia.org/wiki/Shading_language - person poolie; 29.09.2010