Изменения

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

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

7999 байт добавлено, 23 июнь
Некоторые другие ЯП
Говорят, что задача является '''Тьюринг-полной''', если её можно решить, используя только [[Машина Тьюринга|машину Тьюринга]] или любую систему, являющуюся Тьюринг-эквивалентной. ==Введение==
{{Определение
|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"''.
* Неограниченность времени выполнения— любая программа в должна иметь возможность работать до тех пор, пока не завершится.
* Возможность функциональной композиции (вызов одной функции из другой, рекурсия).
* Циклы Наличие циклов <tex>{\bf while }</tex> с прерыванием или эквивалентные эквивалентных имконструкций.
* Возможность останавливать выполнение (''halt'') или каким-то образом подавать сигнал о результатах выполнения.
* Представление множества натуральных чисел, понятие "следующее число"нуля и следующего числа. Возможны другие подобные системы.
* Поддержка входных и выходных данных (I/O), причём без формальных ограничений в объёме. Если Очевидно, что если любая программа, написанная на каком-то языке программирования, принимает на вход не более фиксированного n бит данных и возвращает не более n бит, этот язык не может быть Тьюринг-полным.
==Тьюринг-полнота и неполнота некоторых языков программирования==
Доказать Тьюринг-полноту языка программирования можно, предложив способ реализации машины Тьюринга на этом языке. Кроме того, можно предложить на нём интерпретатор языка на другом Тьюринг-полном языкеполного языка.
===Assembly language===
Язык Ассемблера сильно ограничендостаточно примитивен относительно языков программирования высокого уровня: он рассчитан на архитектуру с конечной памятью и работает с конечным набором регистров. Однако, не был бы он полным по Тьюрингу, не были бы Тьюринг-полны и другие любые высокоуровневые языки программирования.
Всё необходимое для машины Тьюринга на 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> или ей подобную, чтобы выполнять определённую последовательность команд при определённом текущем значении, таким образом обеспечив ветвление.
===Pascal===
Язык Pascal позволяет смоделировать ленту машины Тьюринга с помощью двунаправленного списка из переменных, создаваемых оператором ''<tex>\mathrm{new''}</tex>, семантика которого не предполагает отказа в создании переменной. Также с помощью списков
можно смоделировать сколь угодно большие числа. Стандарт не накладывает никаких ограничений: указательный тип абстрактен, множество значений указательного типа языком не ограничено.
В Паскале есть еще один тип данных с неограниченным множеством значений, файловый, также пригодный для моделирования ленты машины Тьюринга и представления больших чисел. Достаточно утверждений для очевидности Тьюринг-полноты языка Pascal.
===SQL===
Сам по себе SQL никогда не считается считался полным по Тьюрингу языком. Однако, у него существует множество расширений, позволяющих делать рекурсивные запросы, циклы, списки, деревья и пр. Например, реализация решений некоторых известных задач например, с помощью 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:#EEE;padding:2px 8px"| '''Парадигма'''
!style="background-color:#EEE;padding:2px 8px"| '''Уровень'''
!style="background-color:#EEE;padding:2px 8px"| '''Машинно-зависимостьЗависимость от архитектуры процессора'''
!style="background-color:#EEE;padding:2px 8px"| '''Полнота по Тьюрингу'''
|-
|-
|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"| Высокий
===Шаблоны C++===
Шаблоны C++ позволяют производить сложные вычисления ещё на стадии компиляции программы. Впервые это было продемонстрировано Эрвином Унрухом, который реализовал рекурсивный алгоритм распознавания простых чисел в процессе компиляции. Позже в статье Университета Индиана было продемонстрировано кодирование машины Тьюринга в шаблонах C++<ref>[http://web.archive.org/web/20131101122512/http://ubietylab.net/ubigraph/content/Papers/pdf/CppTuring.pdf кодирование машины Тьюринга в шаблонах C++Templates are Turing-complete]</ref>.
===Java Generics===
Аналогично C++ Templates, Generics, несмотря на свои отличия, тоже оказались полными по Тьюрингу, что было подтверждено Раду Григор в одной из статей Кентского Университета<ref>[http://arxiv.org/pdf/1605.05274.pdf статье Кентского УниверситетаJava Generics are Turing-complete]</ref>. ===URISC=== '''URISC''' (от англ. ''Ultimate RISC'') — предельный случай процессора типа RISC (буквально: компьютер с предельно сокращённым набором инструкций), который умеет выполнять одну-единственную инструкцию. Обычно это «вычесть и пропустить следующую инструкцию, если вычитаемое было больше уменьшаемого» (англ. ''«reverse-subtract and skip if borrow»''). Аналогичная концепция, основанная именно на «вычесть и перейти, если результат не положительный» (англ. ''«subtract and branch unless positive»''), называется '''SUBLEQ'''. '''URISC''' также известен в современной литературе как '''OISC''' (англ. One Instruction Set Computer) и является полным по Тьюрингу.
===mov===
Утилита M/o/Vfuscator превращает любую программу на языке C в огромную последовательность из инструкций <tex>\mathrm {mov}</tex><ref>[https://github.com/xoreaxeaxeax/movfuscator M/o/Vfuscator] превращает любую программу на языке C в огромную последовательность из инструкций mov</ref>.  {| cellpadding="0" style= align="left";|[[Файл:gcc_asm.png|400px|thumb|left|Результат работы GCC]]|[[Файл:mov_asm. png|400px|thumb|left|Результат работы M/o/Vfuscator]]|}
{| cellpadding="30" style= align="margin-left: auto; margin-right: auto";"|[[Файл:gcc_asm.png|400px|thumb|Результат работы GCC]]|[[Файл:mov_asm.png|400px|thumb|Результат работы M/o/Vfuscator]]|[[Файл:Demo_mov.gif|rightthumb|thumb500px|900pxleft|Простые числа с использованием одной инструкции]]
|}
===HTML5 + CSS3===
Нововведения новых версий HTML/CSS позволяют построить<ref>[http://eli.fox-epste.in/rule110-full.html позволяют построитьRule 110] </ref> [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_110 правило 110], которое является Тьюринг-полным. ===Excel=== Excel имеет свой скриптовый язык. Однако, для кодирования Машины Тьюринга в таблице Excel достаточно использование только формул<ref>[http://www.felienne.com/archives/2974 Excel Turing Machine]</ref>.
===MinecraftТьюринг-полнота в играх===
* Minecraft<ref>[https://www.youtube.com/watch?v===Little Big Planet===7sNge0Ywz-M|Demonstrating the CPU. Then coughing a lot. Sorry about that. I may be dying.]</ref>. Возможно, достижение Тьюринг-полноты в игре-песочнице с возможностью создания логических элементов было неизбежным, но сложность компьютеров, собираемых из блоков в данной игре, достойна внимания.
* Little Big Planet<ref>[https://www.youtube.com/watch?v===Super Mario World===13GOFa1C4e4| LittleBigLife — The Game of Life in LittleBigPlanet]</ref>. Некоторые элементы игры представляют из себя ничто иное, как небольшие клеточные автоматы, которые можно запрограммировать.
* Super Mario World<ref>[https://www.youtube.com/watch?v===Braid===hB6eY73sLV0 SNES Code Injection -- Flappy Bird in SMW]</ref>. Умелое обращение с багами игры позволяет сделать в ней буквально всё, что позволяет 2d-пространство Nintendo.
===Excel===* [[Неразрешимость игры Braid|Braid]].
==Тьюринговская трясина==
'''Тьюринговская трясина''' — жаргонное общее название для языков программирования, которые ''Тьюринг-полны'', но обладают крайне примитивными синтаксисом и семантикой. Они неудобны для практического программирования (из-за трудности написания программ и низкой производительности), зато хорошо подходят для некоторых других задач (доказательство невычислимости некоторых функций, иллюстрация базовых принципов программирования и т. д.). Поэтому они интересны для информатики.
Первыми представителями "&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> доказывает не только истинные факты (так как она только непротиворечива), т.е. доказываемое утверждение может быть ложным.
# Тем не менее, мы фактически решили проблему остановки.
}}
==См. также==
 
* [[Машина Тьюринга]]
 
* [[Лямбда-исчисление]]
 
* [[Игра «Жизнь»]]
 
* [[Busy beaver]]
==Примечания==
 
<references />
==Источники информации==
* [http://habrahabr.ru/post/231897/ Хабрахабр — Является ли HTML языком программирования?]
 
* [http://web.archive.org/web/20131101122512/http://ubietylab.net/ubigraph/content/Papers/pdf/CppTuring.pdf Todd L. Veldhuizen — C++ Templates are Turing Complete]
 
* [http://arxiv.org/pdf/1605.05274.pdf Radu Gregore — Java Generics are Turing Complete]
* [http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html Andreas Zwinkau — Accidentially Turing-complete]
* [https://wwwru.youtubewikipedia.comorg/watch?v=7sNge0Ywz-M Demonstrating the CPU. Then coughing a lot. Sorry about that. I may be dying. (Minecraft)] * [https://www.youtube.comwiki/watch?v=hB6eY73sLV0 SNES Code Injection -- Flappy Bird in SMWURISC Википедия — URISC]
[[Категория: Теория формальных языков]]
[[Категория: Теория вычислимости]]
[[Категория: Вычислительные формализмы]]
[[Категория: Машина Тьюринга]]
Анонимный участник

Навигация