Редактирование: Тьюринг-полнота

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

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 2: Строка 2:
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
Вычислительное устройство является '''Тьюринг-эквивалентным''' (англ. ''Turing-equivalent''), если оно может эмулировать [[Машина Тьюринга|машину Тьюринга]].  
+
Вычислительное устройство является '''Тьюринг-эквивалентным''' (англ. ''Turing-equivalent''), если оно может эмулировать машину Тьюринга.  
 
}}
 
}}
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
Задача называется '''Тьюринг-полной''' (англ. ''Turing-complete''), если её можно решить, используя только машину Тьюринга или любую систему, являющуюся Тьюринг-эквивалентной.  
+
Задача называется '''Тьюринг-полной''' (англ. ''Turing-complete''), если её можно решить, используя только [[Машина Тьюринга|машину Тьюринга]] или любую систему, являющуюся Тьюринг-эквивалентной.  
 
}}
 
}}
  
Строка 13: Строка 13:
 
В теории вычислимости ''исполнитель'' (множество вычисляющих элементов) называется '''Тьюринг-полным''', если на нём можно реализовать любую вычислимую функцию. Другими словами, для каждой вычислимой функции существует вычисляющий её элемент (например, машина Тьюринга) или программа для исполнителя, а все функции, вычисляемые множеством вычислителей, являются вычислимыми функциями (возможно, при некотором кодировании входных и выходных данных).
 
В теории вычислимости ''исполнитель'' (множество вычисляющих элементов) называется '''Тьюринг-полным''', если на нём можно реализовать любую вычислимую функцию. Другими словами, для каждой вычислимой функции существует вычисляющий её элемент (например, машина Тьюринга) или программа для исполнителя, а все функции, вычисляемые множеством вычислителей, являются вычислимыми функциями (возможно, при некотором кодировании входных и выходных данных).
  
Любой полный по Тьюрингу язык достаточно универсален, чтобы иметь возможность имитировать любой другой язык (хотя и с потенциальным замедлением в работе). Такие языки эквивалентны в рамках вычислений, которые могут произвести. Полные по Тьюрингу языки настолько распространены, что их можно обнаружить даже в примитивных на первый взгляд системах, например, [[Линейный клеточный автомат, эквивалентность МТ | клеточных автоматах]] или мозаичных системах.
+
Любой полный по Тьюрингу язык достаточно универсален, чтобы иметь возможность имитировать любой другой язык (хотя и с потенциальным замедлением в работе). Такие языки эквивалентны в рамках вычислений, которые могут произвести. Полные по Тьюрингу языки настолько распространены, что их можно обнаружить даже в примитивных на первый взгляд системах, например, [Линейный клеточный автомат, эквивалентность МТ|клеточных автоматах] или мозаичных системах.
  
 
На практике полнота по Тьюрингу похожа на идеализацию. Компьютеры имеют ограниченное количество памяти, а неограниченная по времени их работа может быть прервана физическим воздействием (выключение, поломка), что как бы ограничивает число задач, которые они могут решить. На самом деле, физические ограничения в контексте Тьюринг-полноты не берутся во внимание: Тьюринг-полный исполнитель не должен быть ограничен по времени и памяти лишь самим исполнителем.
 
На практике полнота по Тьюрингу похожа на идеализацию. Компьютеры имеют ограниченное количество памяти, а неограниченная по времени их работа может быть прервана физическим воздействием (выключение, поломка), что как бы ограничивает число задач, которые они могут решить. На самом деле, физические ограничения в контексте Тьюринг-полноты не берутся во внимание: Тьюринг-полный исполнитель не должен быть ограничен по времени и памяти лишь самим исполнителем.
Строка 23: Строка 23:
 
* Конечность (нет бесконечных символьных множеств и пр.).
 
* Конечность (нет бесконечных символьных множеств и пр.).
  
* Фиксированное описание (формальность<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>).
+
* Фиксированное описание ([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 формальность]).
  
 
* Всегда достаточный объём доступной памяти — в идеале здесь имеется в виду неограниченная память, однако физические рамки не позволяют сделать память ЭВМ бесконечной, поэтому она просто должна быть ''"always big enough"''.
 
* Всегда достаточный объём доступной памяти — в идеале здесь имеется в виду неограниченная память, однако физические рамки не позволяют сделать память ЭВМ бесконечной, поэтому она просто должна быть ''"always big enough"''.
Строка 49: Строка 49:
 
Всё необходимое для машины Тьюринга на asm можно сделать примерно так:
 
Всё необходимое для машины Тьюринга на 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>
   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> или ей подобную, чтобы выполнять определённую последовательность команд при определённом текущем значении, таким образом обеспечив ветвление.
 
И далее использовать инструкцию <tex>\mathrm{BEQ}</tex> или ей подобную, чтобы выполнять определённую последовательность команд при определённом текущем значении, таким образом обеспечив ветвление.
Строка 68: Строка 68:
 
===SQL===
 
===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.
+
Сам по себе 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===
 
===HTML===
Строка 141: Строка 141:
 
|-
 
|-
 
|style="background-color:#FFF;padding:2px 8px"| JavaScript
 
|style="background-color:#FFF;padding:2px 8px"| JavaScript
|style="background-color:#FFF;padding:2px 8px"| 1995
+
|style="background-color:#FFF;padding:2px 8px"| 1965
 
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
 
|style="background-color:#FFF;padding:2px 8px"| Объектно-ориентированный
 
|style="background-color:#FFF;padding:2px 8px"| Высокий
 
|style="background-color:#FFF;padding:2px 8px"| Высокий
Строка 200: Строка 200:
 
|[[Файл:gcc_asm.png|400px|thumb|left|Результат работы GCC]]
 
|[[Файл:gcc_asm.png|400px|thumb|left|Результат работы GCC]]
 
|[[Файл:mov_asm.png|400px|thumb|left|Результат работы M/o/Vfuscator]]
 
|[[Файл:mov_asm.png|400px|thumb|left|Результат работы M/o/Vfuscator]]
|}
+
|-
 
 
{| cellpadding="0" style= align="left";
 
 
|[[Файл:Demo_mov.gif|thumb|500px|left|Простые числа с использованием одной инструкции]]
 
|[[Файл:Demo_mov.gif|thumb|500px|left|Простые числа с использованием одной инструкции]]
 
|}
 
|}
Строка 228: Строка 226:
 
'''Тьюринговская трясина''' — жаргонное общее название для языков программирования, которые ''Тьюринг-полны'', но обладают крайне примитивными синтаксисом и семантикой. Они неудобны для практического программирования (из-за трудности написания программ и низкой производительности), зато хорошо подходят для некоторых других задач (доказательство невычислимости некоторых функций, иллюстрация базовых принципов программирования и т. д.). Поэтому они интересны для информатики.
 
'''Тьюринговская трясина''' — жаргонное общее название для языков программирования, которые ''Тьюринг-полны'', но обладают крайне примитивными синтаксисом и семантикой. Они неудобны для практического программирования (из-за трудности написания программ и низкой производительности), зато хорошо подходят для некоторых других задач (доказательство невычислимости некоторых функций, иллюстрация базовых принципов программирования и т. д.). Поэтому они интересны для информатики.
 
   
 
   
Первыми представителями &laquo;трясины&raquo; были ''лямбда-исчисление'', ''комбинаторная логика'' и сама машина Тьюринга.  
+
Первыми представителями "трясины" были ''лямбда-исчисление'', ''комбинаторная логика'' и сама машина Тьюринга.  
  
 
Многие эзотерические языки программирования также являются «трясинами Тьюринга» (напр. Brainfuck, Spoon, Malbolge, Whitespace).
 
Многие эзотерические языки программирования также являются «трясинами Тьюринга» (напр. 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> доказывает не только истинные факты (так как она только непротиворечива), т.е. доказываемое утверждение может быть ложным.
 
# Тем не менее, мы фактически решили проблему остановки.
 
}}
 
  
 
==См. также==
 
==См. также==

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблоны, используемые на этой странице: