Независимо от того, что вы делаете в конечном итоге, убедитесь, что вы проверяете, что ваш вход еще не был искажен magic_quotes
или каким-то другим благонамеренным мусором, и, если необходимо, запустите его через stripslashes
или что-то еще, чтобы его дезинфицировать .
Вам нужна некоторая форма динамической конструкции выделения (malloc
или new
, или cons
сделает), и или рекурсивные функции или некоторый другой способ записать бесконечный цикл. Если Вы имеете тех и можете сделать что-либо вообще интересное, Вы почти наверняка полны по Тьюрингу.
лямбда-исчисление эквивалентно в питании Машине Тьюринга, и если Вы реализуете лямбда-исчисление, это - на самом деле симпатичная забава, пишущий программы лямбда-исчисления. Путь [еще 113] забава, чем запись программы для Машины Тьюринга!
единственная практическая импликация полноты по Тьюрингу, о которой я знаю, - то, что можно записать программы, которые не завершаются. Я использовал несколько языков специального назначения, которые гарантируют завершение и поэтому являются не полны по Тьюрингу. Иногда полезно бросить дополнительное выразительное питание в обмен на гарантируемое завершение.
'полнота по Тьюрингу' описывает свойство способности выразить любое произвольное алгоритмическое вычисление, , который был точкой Машина Turing's во-первых. Язык или логическая система могут быть описаны как 'полные по Тьюрингу', если это имеет это свойство. С практической точки зрения все языки программирования общего назначения - и удивительно большое количество особого назначения - могут сделать это для соответственно свободного определения (см. ниже).
Однако строгое определение полноты по Тьюрингу подразумевает способность безграничного хранения, которая, конечно, не физически возможна. Учитывая это, никакая реальная машина не может возможно быть полной по Тьюрингу, но это ограничение обычно ослабляется (по крайней мере, неофициально) при приписывании полноты по Тьюрингу языку программирования. Один тривиальный тест полноты по Тьюрингу для языка - может ли язык использоваться для реализации средства моделирования Машины Тьюринга.
примером широко распространенной системы, которая не полна по Тьюрингу, является Алгебра отношений, теоретическое основание позади SQL, как описано в статье Codd реляционная модель А для крупных банков совместно используемых данных. Алгебра отношений имеет свойство геделевская Полнота , что означает, что это может выразить любое вычисление, которое может быть определено с точки зрения исчисление предикатов первого порядка (т.е. обычные логические выражения). Однако это не полно по Тьюрингу, поскольку это не может выразить произвольного алгоритмического вычисления.
Примечание, что большинство, если не все все практические диалекты SQL расширяют чистую реляционную модель с помощью процедурных конструкций до такой степени, что они полны по Тьюрингу по определению как обычно, относилось к языкам программирования. Однако отдельный SQL-запрос в общем и целом не.
Некоторые более вопиющие примеры полных по Тьюрингу проблемно-ориентированных языков TeX и sendmail.cf, . В последнем случае существует на самом деле пример известного выхода кого-то использующего sendmail.cf к , реализуют универсальное средство моделирования Машины Тьюринга.
Если можно записать Brainf$ & интерпретатор # на Вашем языке, это полно по Тьюрингу. LOLCODE оказались полным по Тьюрингу точно этим способом.
Примеры языков, которые не полны по Тьюрингу часто, имеют ограниченные циклы , как:
for i=1 to N {...}
, но отсутствие неограниченный циклы, которые проверяют более общее условие, как:
while bool_expr {...}
, Если все возможные конструкции цикличного выполнения ограничены, Ваша программа, как гарантируют, завершится. И, хотя безусловная гарантия завершения потенциально полезна, это - также признак, что язык не полон по Тьюрингу.
Примечание также, что, закрепляя весь возможный конструкции цикличного выполнения могут быть трудными; например, я - вполне уверенные шаблоны C++, не были предназначены для Тьюринга...
Я не уверен, существует ли "минимальный набор функций", но доказать, что язык полон по Тьюрингу, только необходимо доказать, что это может эмулировать другую полную по Тьюрингу систему (не обязательно Машина Тьюринга), пока другая система, как известно, полна по Тьюрингу. http://en.wikipedia.org/wiki/Turing_complete#Examples имеет целый список полных по Тьюрингу систем. Некоторые из них более просты, чем Машины Тьюринга.
Я хотел бы добавить один протест к тому, что сказал Norman Ramsey: Машина Тьюринга имеет бесконечную память и следовательно языки программирования, которые считаются полными по Тьюрингу, только так находятся под предположением, что память также бесконечна.
Я не могу помнить видеть что-либо как минимальные функции для полноты по Тьюрингу. Однако, если Ваш язык поддерживает циклы и условные переходы, возможности, что это полно по Тьюрингу, хороши. Однако единственным способом доказать его является все еще к similate Машина Тьюринга или другой полный по Тьюрингу язык.
Если можно реализовать Машину Тьюринга (насколько они могут быть реализованы, поскольку они - математические конструкции с неограниченной памятью [размер ленты бесконечен]), тогда, можно быть уверены, что это полно по Тьюрингу.
Некоторые признаки:
..., чем в практических последствиях того, чтобы быть полным по Тьюрингу.
я сомневаюсь, что существуют любые практические последствия того, чтобы быть полным по Тьюрингу.
при рассмотрении некоторых примеров полных по Тьюрингу машин, например, оригинал Машина Тьюринга , Вы будете видеть, что так далеко от того, чтобы быть полезным для реальных вычислений, что понятие должно только представлять теоретический интерес.
Brainfuck является полным по Тьюрингу и имеет только циклические структуры и увеличение / уменьшение памяти, так что этого достаточно.
С другой стороны, нет способа изменить какое-либо значение в лямбда-исчислении, но он является полным по Тьюрингу, поэтому очевидно, что это возможно сделать без изменяемой памяти.
Скорее всего, ваша программа не имеет ничего общего с лямбда-исчислением, поэтому для практического ответа минимум должен быть
Любой язык, способный к незавершению, в значительной степени является полным по Тьюрингу. Вы можете сделать язык неограничивающим, предоставив ему неограниченные циклические структуры (например, циклы While или Goto, который может достичь себя снова) или предоставив ему общую рекурсию (позволив функции вызывать саму себя без ограничений).
Once вы завершены по Тьюрингу, вы можете делать что-то вроде интерпретации других языков Тьюринга, включая ваш собственный.
Настоящий вопрос заключается в том, «что в этом хорошего?» Если ваш язык будет использоваться в определенной области для решения конкретных проблем, может быть лучше найти способ сформулировать решения на языке, который не является полным по Тьюрингу, и, таким образом, гарантированно дать ответ.
Вы всегда можете добавить полноту по Тьюрингу, написав «Сделайте это, то или что-то еще; но сделайте это с результатом, предоставленным X» на любом другом языке полного Тьюринга, где X предоставляется не-Тьюринговым полным языком.
Конечно, если вы хотите использовать только один язык, возможно, лучше использовать Полный Тьюринг ...
Вы можете попробовать эмулировать OISC (компьютер с одним набором команд). Если вы можете эмулировать там одну из инструкций, то, поскольку эта единственная инструкция может использоваться для составления полной машины Тьюринга, вы доказали, что ваш язык также должен быть полным по Тьюрингу.