Изменения

Перейти к: навигация, поиск

Тьюринг-полнота

3507 байт добавлено, 14:09, 23 июня 2019
Некоторые другие ЯП
{{Определение
|definition =
Вычислительное устройство является '''Тьюринг-эквивалентным''' (англ. ''Turing-equivalent''), если оно может эмулировать [[Машина Тьюринга|машину Тьюринга]].
}}
 
{{Определение
|definition =
Задача называется '''Тьюринг-полной''' (англ. ''Turing-complete''), если её можно решить, используя только [[Машина Тьюринга|машину Тьюринга]] или любую систему, являющуюся Тьюринг-эквивалентной.
}}
В теории вычислимости ''исполнитель'' (множество вычисляющих элементов) называется '''Тьюринг-полным''', если на нём можно реализовать любую вычислимую функцию. Другими словами, для каждой вычислимой функции существует вычисляющий её элемент (например, машина Тьюринга) или программа для исполнителя, а все функции, вычисляемые множеством вычислителей, являются вычислимыми функциями (возможно, при некотором кодировании входных и выходных данных).
Любой полный по Тьюрингу язык достаточно универсален, чтобы иметь возможность имитировать любой другой язык (хотя и с потенциальным замедлением в работе). Такие языки эквивалентны в рамках вычислений, которые могут произвести. Полные по Тьюрингу языки настолько распространены, что их можно обнаружить даже в примитивных на первый взгляд системах, например, [[Линейный клеточный автомат, эквивалентность МТ|клеточных автоматах]] или мозаичных системах.
На практике полнота по Тьюрингу похожа на идеализацию. Компьютеры имеют ограниченное количество памяти, а неограниченная по времени их работа может быть прервана физическим воздействием (выключение, поломка), что как бы ограничивает число задач, которые они могут решить. На самом деле, физические ограничения в контексте Тьюринг-полноты не берутся во внимание: Тьюринг-полный исполнитель не должен быть ограничен по времени и памяти лишь самим исполнителем.
* Конечность (нет бесконечных символьных множеств и пр.).
* Фиксированное описание (формальность<ref>[https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA формальностьВикипедия — Формальный язык]</ref>).
* Всегда достаточный объём доступной памяти — в идеале здесь имеется в виду неограниченная память, однако физические рамки не позволяют сделать память ЭВМ бесконечной, поэтому она просто должна быть ''"always big enough"''.
Всё необходимое для машины Тьюринга на asm можно сделать примерно так:
ADDS r0, r0, #1 ; <font color=green>; сдвиг ленты вправо</font> ADDS r0, r0, #-1 ; <font color=green>; сдвиг ленты влево</font> ADDS [r0], [r0], #1 ; <font color=green>; инкремент значения, на которое "указывает" головка ленты</font> ADDS [r0], [r0], #-1 ; <font color=green>; декремент значения, на которое "указывает" головка ленты</font>
И далее использовать инструкцию <tex>\mathrm{BEQ}</tex> или ей подобную, чтобы выполнять определённую последовательность команд при определённом текущем значении, таким образом обеспечив ветвление.
===SQL===
Сам по себе SQL никогда не считался полным по Тьюрингу языком. Однако, у него существует множество расширений, позволяющих делать рекурсивные запросы, циклы, списки, деревья и пр., например,c с помощью PostgreSQL<ref>[http://assets.en.oreilly.com/1/event/27/High%20Performance%20SQL%20with%20PostgreSQL%20Presentation.pdf High Performance with PostgreSQL 8.4]</ref>. Более того, на в 2011 г. Habrahabr появилась статья, где показана машина Тьюринга на SQL<ref>[https://habrahabr.ru/post/113165/|Машина Тьюринга на чистом SQL]</ref> (в реализации Firebird 2.1, который ограничивает вложенность рекурсивных запросов до 2014 уровней). Тем не менее, всё ещё остаётся ограниченное query execution time.
===HTML===
|-
|style="background-color:#FFF;padding:2px 8px"| JavaScript
|style="background-color:#FFF;padding:2px 8px"| 19651995
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
|style="background-color:#FFF;padding:2px 8px"| Высокий
|[[Файл:gcc_asm.png|400px|thumb|left|Результат работы GCC]]
|[[Файл:mov_asm.png|400px|thumb|left|Результат работы M/o/Vfuscator]]
|-} {| cellpadding="0" style= align="left";
|[[Файл:Demo_mov.gif|thumb|500px|left|Простые числа с использованием одной инструкции]]
|}
'''Тьюринговская трясина''' — жаргонное общее название для языков программирования, которые ''Тьюринг-полны'', но обладают крайне примитивными синтаксисом и семантикой. Они неудобны для практического программирования (из-за трудности написания программ и низкой производительности), зато хорошо подходят для некоторых других задач (доказательство невычислимости некоторых функций, иллюстрация базовых принципов программирования и т. д.). Поэтому они интересны для информатики.
Первыми представителями "&laquo;трясины" &raquo; были ''лямбда-исчисление'', ''комбинаторная логика'' и сама машина Тьюринга.
Многие эзотерические языки программирования также являются «трясинами Тьюринга» (напр. Brainfuck, Spoon, Malbolge, Whitespace).
 
==Проблема остановки==
{{Определение
|definition= Проблема остановки {{---}} проблема определения факта остановки данной машины Тьюринга на данных входных данных (закончит выполнение или нет).
}}
{{Теорема
|statement= Проблема остановки неразрешима
|proof= Докажем от противного. Предположим существует такая полностью вычислимая функция <tex>halts(f)</tex>, которая возвращает <tex>true</tex>, если функция <tex>f</tex> остановится когда-либо, и <tex>false</tex>, если функция <tex>f</tex> никогда не остановится.
 
Рассмотрим следующую функцию <tex>g</tex>
 
'''void''' g():
'''if''' halts(g):
'''for'''(;;)
<tex>halts(g)</tex> должна возвращать либо <tex>true</tex>, либо <tex>false</tex>.
* Если <tex>halts(g)</tex> вернула <tex>true</tex>, то <tex>g</tex> никогда не остановится, получили противоречие
* Если <tex>halts(g)</tex> вернула <tex>false</tex>, то <tex>g</tex> остановится, получили противоречие
}}
 
==Теорема Геделя о неполноте==
Чтобы доказать теорему, можно воспользоваться проблемой остановки машины Тьюринга.
{{Теорема
|statement= Любая непротиворечивая формальная система аксиом <tex>T</tex>, способная выражать утверждения о натуральных числах и доказывать простые арифметические факты, неполна {{---}} существуют утверждения о натуральных числах, которые она не может ни доказать, ни опровергнуть.
|proof=
# Предположим, что система <tex>T</tex> полна, т.е. доказывает или опровергает любое утверждение.
# Сформулируем и запишем на языке арифметики утверждение <tex>O</tex> = "машина Тьюринга <tex>M</tex> точно остановится, если запустить ее с данными <tex>D</tex>".
# Переберем все доказательства (<tex>P</tex> {{---}} истинно) и опровержения (<tex>\neg P</tex> {{---}} истинно) в системе <tex>T</tex>, чья длина совпадает с длиной <tex>O</tex>.
# Так как система <tex>T</tex> полна, рано или поздно мы найдем опровержение или доказательство утверждения <tex>O</tex>
# Система <tex>T</tex> доказывает не только истинные факты (так как она только непротиворечива), т.е. доказываемое утверждение может быть ложным.
# Тем не менее, мы фактически решили проблему остановки.
}}
==См. также==
Анонимный участник

Навигация