Что такое полный Тьюринга?

Что означает выражение «полный Тьюринга»?

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

Ответов (15)

Решение

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

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

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

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

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

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

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

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

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

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

Вот простейшее объяснение

Алан Тьюринг создал машину, которая может взять программу, запустить ее и показать какой-то результат. Но тогда ему пришлось создавать разные машины для разных программ. Поэтому он создал «универсальную машину Тьюринга», которая может взять ЛЮБУЮ программу и запустить ее.

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

Например: Допустим, есть программа, которая складывает 10 чисел. Эту программу легко запустить на машине Тьюринга. Но теперь представьте, что по какой-то причине ваш язык программирования не может выполнять такое же дополнение. Это сделало бы его «неполным по Тьюрингу» (так сказать). С другой стороны, если он может запускать любую программу, которую может запустить универсальная машина Тьюринга, то он завершен.

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

Обновление: вы можете узнать больше в моем сообщении в блоге: «JavaScript завершен по Тьюрингу» - объяснено

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

Что я понимаю простыми словами:

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

Например :

  1. Можете ли вы сложить два числа, используя просто HTML . (Ответ - « Нет », для выполнения добавления необходимо использовать javascript.) Следовательно, HTML не является полным по Тьюрингу.

  2. Такие языки, как Java, C++, Python, Javascript, Solidity для Ethereum и т. Д., Являются полными по Тьюрингу, потому что вы можете выполнять вычисления, такие как сложение двух чисел, используя эти языки.

Надеюсь это поможет.

Машина Тьюринга требует, чтобы любая программа могла выполнять проверку условий. Это фундаментально.

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

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

Пианино каждый раз гарантированно останавливается. На ТМ такой гарантии нет. Это называется «проблема остановки».

Супер-краткое изложение того, что профессор Бразилфорд объясняет в этом видео .

Полный Тьюринга делать все, что может сделать машина Тьюринга.

  1. Он имеет условное ветвление (например, «оператор if»). Также подразумевается «перейти к» и, таким образом, разрешить цикл.

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

Мы называем язык полным по Тьюрингу тогда и только тогда, когда (1) он разрешим на машине Тьюринга, но (2) не на чем-либо менее способном, чем машина Тьюринга. Например, язык палиндромов над алфавитом {a, b} разрешается машинами Тьюринга, но также и автоматами выталкивания; Итак, этот язык не является полным по Тьюрингу. По-настоящему полные по Тьюрингу языки - те, которые требуют полной вычислительной мощности машин Тьюринга - встречаются довольно редко. Возможно, язык строк xyz, где x - число, y - машина Тьюринга, z - начальная конфигурация ленты, а y останавливается на z меньше чем через x! шаги - возможно, это подходит (хотя это нужно будет показать!)

Распространенное неточное использование путает полноту по Тьюрингу с эквивалентностью по Тьюрингу. Эквивалентность Тьюринга относится к свойству вычислительной системы, которая может моделировать, и которая может моделироваться машинами Тьюринга. Мы могли бы сказать, что Java - это язык программирования, эквивалентный Тьюрингу, например, потому что вы можете написать симулятор машины Тьюринга на Java и потому что вы можете определить машину Тьюринга, которая имитирует выполнение программ Java. Согласно тезису Чёрча-Тьюринга, машины Тьюринга могут выполнять любые эффективные вычисления, поэтому эквивалентность по Тьюрингу означает, что система максимально способна (если тезис Чёрча-Тьюринга верен!)

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

Как сказал Вейлон Флинн :

Полный Тьюринга означает, что он не менее мощен, чем машина Тьюринга.

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

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

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

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

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

Из википедии :

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

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

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

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

Я очень рекомендую Аннотированный Тьюринг

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

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

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

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

Informal Definition

A Turing complete language is one that can perform any computation. The Church-Turing Thesis states that any performable computation can be done by a Turing machine. A Turing machine is a machine with infinite random access memory and a finite 'program' that dictates when it should read, write, and move across that memory, when it should terminate with a certain result, and what it should do next. The input to a Turing machine is put in its memory before it starts.

Things that can make a language NOT Turing complete

A Turing machine can make decisions based on what it sees in memory - The 'language' that only supports +, -, *, and / on integers is not Turing complete because it can't make a choice based on its input, but a Turing machine can.

A Turing machine can run forever - If we took Java, Javascript, or Python and removed the ability to do any sort of loop, GOTO, or function call, it wouldn't be Turing complete because it can't perform an arbitrary computation that never finishes. Coq is a theorem prover that can't express programs that don't terminate, so it's not Turing complete.

A Turing machine can use infinite memory - A language that was exactly like Java but would terminate once it used more than 4 Gigabytes of memory wouldn't be Turing complete, because a Turing machine can use infinite memory. This is why we can't actually build a Turing machine, but Java is still a Turing complete language because the Java language has no restriction preventing it from using infinite memory. This is one reason regular expressions aren't Turing complete.

A Turing machine has random access memory - A language that only lets you work with memory through push and pop operations to a stack wouldn't be Turing complete. If I have a 'language' that reads a string once and can only use memory by pushing and popping from a stack, it can tell me whether every ( in the string has its own ) later on by pushing when it sees ( and popping when it sees ) . However, it can't tell me if every ( has its own ) later on and every [ has its own ] later on (note that ([)] meets this criteria but ([]] does not). A Turing machine can use its random access memory to track ()'s and []'s separately, but this language with only a stack cannot.

A Turing machine can simulate any other Turing machine - A Turing machine, when given an appropriate 'program', can take another Turing machine's 'program' and simulate it on arbitrary input. If you had a language that was forbidden from implementing a Python interpreter, it wouldn't be Turing complete.

Examples of Turing complete languages

If your language has infinite random access memory, conditional execution, and some form of repeated execution, it's probably Turing complete. There are more exotic systems that can still achieve everything a Turing machine can, which makes them Turing complete too:

  • Untyped lambda calculus
  • Conway's game of life
  • C++ Templates
  • Prolog