Що робить мову Тьюрінга повноцінною?


79

Який мінімальний набір мовних особливостей / структур, завдяки яким Тьюрінг є повним?


21
Хіба не буде краще просто погуглювати його? en.wikipedia.org/wiki/Turing_completeness
aml90

2
Привіт допитливий кіт, ласкаво просимо до програмістів! Дзвінки до списків тут не є темою: я видалив цю частину з вашого питання. Однак, цей квест надзвичайно широкий: чи існує конкретна проблема, над якою ви працюєте, чи замислюєтесь ви про повну цінність Тьюрінга?

3
@amalantony: Як виноска .
Боббі

З точки зору інформатики дивіться тут .
Рафаель

Відповіді:


73

Тьюринга тарпіттінга є свого роду езотеричного мови програмування , який прагне бути Тьюринг-повній, використовуючи в якості декількох елементів , як це можливо. Brainfuck - це, мабуть, найвідоміший тарпіт, але їх багато.

  • Iota та Jot - це функціональні мови з двома та трьома символами відповідно на основі обчислення комбінатора SK (I) .

  • OISC ( One Computer Set Computer ) позначає тип імперативних обчислень, для яких потрібна лише одна інструкція з одного або декількох аргументів, як правило, "віднімання та розгалуження, якщо менше або дорівнює нулю", або "зворотне віднімання та пропуск, якщо запозичити". X86 MMU реалізує попередню інструкцію і, таким чином, завершує Turing.

Загалом, щоб імперативна мова була повною для Тьюрінга, вона потребує:

  1. Форма умовного повторення або умовного переходу (наприклад, while, if+ goto)

  2. Спосіб читання та запису певної форми зберігання (наприклад, змінних, стрічки)

Щоб функціональна мова, заснована на лямбда-числення, була TC, вона потребує:

  1. Можливість абстрактних функцій над аргументами (наприклад, лямбда-абстракція, цитата)

  2. Можливість застосовувати функції до аргументів (наприклад, скорочення)

Звичайно, існують й інші способи розгляду обчислень, але це звичайні моделі для Тюрінга. Зауважте, що справжні комп’ютери не є універсальними машинами Тьюрінга, оскільки вони не мають необмеженого сховища. Строго кажучи, вони є "обмеженими машинами зберігання". Якби ви продовжували додавати їм пам'ять, вони б асимптотично наближалися до потужних машин Тьюрінга. Однак для обчислення корисні навіть обмежені машини зберігання та машини з кінцевим станом ; вони просто не універсальні .

Строго кажучи, введення-виведення не потрібно для цілісності Тьюрінга; TC лише стверджує, що мова може обчислити потрібну вам функцію, а не те, що вона може показати вам результат. На практиці кожна корисна мова має якийсь спосіб взаємодії зі світом.


Чи достатньо простих змінних для імперативних мов? У мене було враження, що потрібна якась колекція (наприклад, масиви чи пов'язані списки).
luiscubal

1
@luiscubal вам потрібно мати змогу вказати довільну кількість даних. За допомогою простих змінних ви можете представити кількість даних, якими володіють самі змінні. Що робити, якщо вам потрібно представити N + 1 різних фрагментів даних. Можна стверджувати, що з такими трюками, як грає Fractran, ви можете це зробити навіть у простих змінних ... але це не зовсім те, що ви просите.

Чи не потрібно, щоб мова підтримувала цикли ENDLESS ?
сергіол

Зрештою, "кожна корисна мова має спосіб взаємодії зі світом". У Algol 60 не було визначеного способу взаємодії зі світом. Всі ваші введення-виведення в програмі Algol 60 були виконані за допомогою виклику функцій бібліотеки, і функції бібліотеки могли бути абсолютно різними в різних реалізаціях. Але я цим самим відмовляюся від будь-якої дискусії про те, чи був «Алгол 60 корисним» чи ні.
Соломон повільно

15

З більш практичної точки зору: якщо ви можете перекласти всі програми на мові, що повністю завершує Тьюрінг, на вашу мову, то (наскільки я знаю), ваша мова повинна бути повною Тюрінгом. Таким чином, якщо ви хочете перевірити, чи розроблена вами мова Тюрінга є повною, ви можете просто написати Brainf *** до компілятора YourLanguage і довести / продемонструвати, що він може компілювати всі легальні програми BF.

Для уточнення, я маю на увазі, що крім перекладача для YourLanguage, ви пишете компілятор (будь-якою мовою), який може компілювати будь-яку програму BF до YourLanguage (зберігаючи таку ж семантику, звичайно).


11
Так, це, безумовно, був би найбільш практичним способом наблизитись до цього. </sarcasm>
Роберт Харві

13
@RobertHarvey має сенс, але загальна ідея досить життєво важлива. Brainfuck, як відомо, є повним випробуванням і дуже простий, як і мови програмування. Для неезотеричних мов програмування реалізація перекладача мозкових можливостей може бути набагато простішим і швидшим, ніж надання жорсткого доказу з нізвідки (я можу реалізувати BF в декількох рядках Python, але я не впевнений, з чого почати з формальної доказ того, що Python завершується); і, як відомо, десятки езотеричних мов, натхнених мозком, є цілком завершеними, оскільки відомо, як вони відображаються на мозку.

7
@RobertHarvey: Чому ні? Безумовно, хтось, хто розробляє свою власну мову, зможе написати до неї компілятор BF (якщо це було б обов'язково, і знайти підходящу іншу мову в іншому випадку).
Антон Голов

5
@delnan: Ви будете повинні довести, однак, що ваш перекладач BF правильно реалізує специфікацію BF, IOW вам доведеться довести , що ваш перекладач BF є, по суті, перекладачем BF , а не перекладач для BF-подібного мови, може бути або не бути Тьюрінгом.
Йорг W Міттаг

2
@ DarekNędza, це лише природний наслідок того, як визначається повнота Тьюрінга; будь-яке розширення мови Тюрінга завершено все ще буде завершеним.
Антон Голов

8

Систему можна вважати Тюрінгом повною лише тоді, коли вона може зробити все, що може зробити універсальна машина Тьюрінга. Оскільки, як кажуть, універсальна машина Тьюрінга здатна вирішувати будь-яку обчислювальну функцію за даний час, цілісні системи Тьюрінга можуть, таким чином, також робити це.

Щоб перевірити, чи є щось із Тьюрінга завершеним, подивіться, чи можна впровадити машину Тюрінга всередині нього. Іншими словами, перевірте, чи може вона імітувати наступне:

  1. Здатність читати і записувати "змінні" (або довільні дані) : Досить багато пояснень.
  2. Можливість імітувати переміщення голови читання / запису : недостатньо просто змогти отримати та зберігати змінні. Повинно бути також можливим моделювати можливість переміщення голови стрічки з метою посилання на інші змінні. Це часто може бути змодельовано в мовах програмування з використанням структур даних масиву (або еквівалентних) або, у випадку деяких мов, таких як машинний код, можливість посилання на інші змінні за допомогою "покажчиків" (або еквівалентів).
  3. Здатність імітувати машину з кінцевим станом : Хоча це не згадується часто, машини Тьюрінга є насправді варіацією машин з кінцевим станом, які часто використовуються в процесі розвитку ШІ. Алан Тьюрінг сказав, що цілі штатів - моделювати людину "різних способів вирішення проблем".
  4. Стан "зупинки" : Хоча часто згадується, що набір правил повинен бути в змозі повторитись, щоб вважати Тюрінга завершеним, це насправді не є хорошими критеріями, оскільки формальне визначення того, що є алгоритмом, є алгоритми стану, завжди повинно бути врешті-решт укласти. Якщо вони не можуть укласти якийсь спосіб, то це не Тюрінг завершений, або зазначений алгоритм не є обчислювальною функцією. Тюрінг повноцінних систем, які технічно не можуть укласти за рахунок їх роботи (наприклад, ігрові консолі), подолають це обмеження, будучи можливим певним чином "імітувати" стан зупинки. Не плутати з "проблемою зупинки", невизначеною функцією, яка це підтверджує "

Це справжні мінімальні вимоги до системи, яку Тюрінг вважатиме завершеною. Нічого більше, нічого менше. Якщо він не може імітувати будь-яке з них якимось чином, це не є завершенням Тьюрінга. Запропоновані іншими людьми способи є лише засобом до кінця, оскільки існує декілька повних систем Тьюрінга, які не мають цих особливостей.

Зауважте, що не існує відомого способу побудувати справжню повну систему Тьюрінга. Це тому, що не існує відомого способу по-справжньому моделювати безмежність стрічки машини Тьюрінга у фізичному просторі.


4

Мова програмування є завершеним, якщо ви можете зробити будь-який розрахунок з ним. Існує не один набір функцій, який робить мову turing повною, тому відповіді, які говорять, що вам потрібні петлі, або що вам потрібні змінні, невірні, оскільки є мови, які не мають, але є turing завершеними.

Алан Тьюрінг зробив універсальну машину для тюрінгу, і якщо ви можете перекласти будь-яку програму, розроблену для роботи на універсальній машині, щоб вона працювала на вашій мові, це також Тюрінг завершено. Це також працює опосередковано, так що ви можете сказати, що мова X є завершеною, якщо всі програми для мовлення цілої мови Y можуть бути перекладені на X, оскільки всі програми універсальних машин Turing можуть бути переведені в програму Y.

Часова складність, складність простору, простота формату введення / виводу та простота написання будь-якої програми не включаються до рівняння, тому така машина теоретично може робити всі обчислення, якщо обчислення не зупиняються втратами енергії або землею проковтне сонце.

Зазвичай для підтвердження повноти випробування вони перекладачами перевіряють будь-яку перевірену мовою цілковитості, але для її роботи потрібні засоби введення та виведення, дві речі, які справді не потрібні, щоб мова була завершеною. Досить, що ваша програма може змінити стан при запуску і щоб ви могли перевірити пам'ять після зупинки програми.

Для того, щоб зробити мову успішною, вона потребує більше, ніж твердження повноти, і це справедливо навіть для виправлення тарпітів. Я не думаю, що BrainFuck був би популярним без ,і ..


2
"Мова програмування є завершеною, якщо ви можете зробити будь-який розрахунок з нею." Це теза Церкви Тьюрінга, а не те, що робить мову Тьюрінга завершеною.
Римоїд

@Rhymoid Отже, ви маєте на увазі, що нічого не закінчується, якщо ви не можете зробити перекладача? Тобто обчислення лямбда не закінчується, навіть якщо воно рівносильне?
Сільвестер

1
Я все ще шукаю авторитетного визначення термінів-еквівалентів Тьюрінга та Тьюрінга (і Тюрінга). Я вже бачив занадто багато випадків, починаючи від людей на дошках оголошень до дослідників у власних статтях, які по-різному трактують ці терміни.
Римоїд

У будь-якому випадку, я трактую "Turing-complete" як симуляцію, еквівалентну універсальній машині Тьюрінга (UTM; яка, в свою чергу, здатна імітувати будь-яку машину Тьюрінга - отже, "універсальну"). У праці Тьюрінга від 1936 року, де він представив свої машини, він визначив поняття UTM і дав ескіз доказу, що UTM є імітацією, еквівалентною обчислення лямбда Церкви. Тим самим він довів, що вони мають однакову обчислювальну силу. Теза Церкви Тьюрінга стверджує, просто кажучи, що "це вся обчислювальна сила, яку ти коли-небудь отримаєш".
Римоїд

Він має два формальні визначення для сторінки Тьюрінга про повноту Вікіпедії . Один вимагає вводу / виводу, інший - ні. Той, що не говорить про те, що машина turing завершена, якщо вона може обчислити кожну функцію, яку можна обчислити за Тьюрінгом. Це призводить до того, що обчислення лямбда повертається до завершення терміну, оскільки ви можете легко зробити рівносильну програму в обчисленні лямбда, яка обчислює те саме, що і будь-які програми машин тирінгу.
Сільвестер

4

Ви не можете сказати, чи буде вона нескінченно циклічною чи зупиниться.

-------------

Пояснення: Враховуючи деякий вклад, неможливо в кожному випадку сказати (використовуючи інший апарат Тьюрінга), якщо річ буде нескінченно циклічна або врешті-решт зупиниться, за винятком запуску її (що дає відповідь, якщо вона зупиняється, але не якщо це петлі!).

Це означає, що ви повинні бути в змозі зберігати потенційно необмежену кількість даних деяким чином - він повинен бути еквівалент нескінченній стрічці, незалежно від того, наскільки це складено! (Інакше існує лише обмежена кількість станів, і тоді ви можете перевірити, чи раніше ви пройшли цей стан і врешті-решт зупинитесь). Як правило, машини Тьюрінга можуть збільшувати або зменшувати розміри свого стану якимись контрольованими засобами.

Оскільки оригінальна універсальна машина Тьюрінга у Тьюрінга має нерозв'язну проблему зупинки, то у вашої власної машини Тьюрінга також має бути нерозв’язна проблема.

Тюрінг повних систем може імітувати будь-яку іншу повну систему Тьюрінга, тому, якщо ви можете створити емулятор для якоїсь відомої повної системи Тюрінга у вашій системі, це доводить, що ваша система також є Тюрінгом завершеною.

Наприклад, припустимо, ви хочете довести, що Змії та драбини є Тюрінгом завершеним, отримавши дошку з нескінченно повторюваним шаром сітки (з іншою версією зверху та зліва). Знаючи, що машина 2-лічильника Міньського є Тюрінг завершеною (у якої є 2 необмежених лічильника і 1 стан із кінцевого числа), ви можете побудувати еквівалентну дошку, де позиції X і Y у сітці - це поточне значення двох лічильників а поточний шлях - поточний стан. Вибух! Ви щойно довели, що Змії та сходи Тюрінг завершені.


1
Я не купую цей аргумент. Тільки тому, що проблема зупинки не можна визначити для машин Тьюрінга, це не означає, що кожне позначення, яке дозволяє задати програму, для якої проблема зупинки не визначена, є Тюрінг завершеним. Очевидно вірне лише зворотне: Якщо позначення Тьюрінга завершені, то, звичайно, можна писати програми, для яких проблема зупинки не визначена.
5gon12eder

Це необхідна умова. Якщо ви можете вирішити, чи зупиняється вона в кожній програмі, мова не завершиться.
gnasher729

4

Однією необхідною умовою є цикл з максимальним числом ітерацій, який не визначається до ітерації, або рекурсія, де максимальна глибина рекурсії не визначена вперед. В якості прикладу, для ... в ... петлях , як ви їх знайдете в багатьох нових мовах НЕ досить , щоб зробити мову Тьюринг (але вони матимуть інші засоби). Зауважте, що це не означає обмежену кількість ітерацій або обмежену глибину рекурсії, але що максимальні ітерації та глибина рекурсії повинні бути розраховані заздалегідь.

Наприклад, функція Ackermann не може бути обчислена мовою без цих функцій. З іншого боку, безліч цих складних і дуже корисних програм можна написати, не вимагаючи цих функцій.

З іншого боку, з кожної ітерації графа і кожної глибини рекурсії обчисленої вперед, не тільки може бути прийнято рішення , чи буде програма зупинити чи ні, але це буде зупинити.


-1

я знаю, що це не формально правильна відповідь, але як тільки ви виймете «мінімум» з «Тюрінга-повного» і покладете «практичне» назад, куди йому належить, ви побачите найважливіші функції, які відрізняють мову програмування від мова розмітки є

  • змінні
  • умовні умови (якщо / тоді ...)
  • loopage (цикл / перерва, поки ...)

наступний приход

  • анонімні та названі функції

щоб перевірити ці твердження, почніть з мови розмітки, скажімо, HTML. ми можемо винайти HTML + лише зі змінними, або лише з умовними умовами (MS це зробив із умовними коментарями), або з якоюсь конструкцією циклу (яка за відсутності умовних умов, ймовірно, закінчиться як щось подібне <repeat n='4'>...</repeat>). виконання будь-якого з них зробить HTML + значно (?) потужнішим, ніж звичайний HTML, але це все ж буде більше розмітки, ніж мови програмування; з кожною новою функцією ви робите менше декларативним і більше імперативним мовою.

прагнення до мінімальності в логіці та програмуванні, безумовно, є важливим і цікавим, але якби мені довелося навчати молодих чи старих людей "чого програмувати" та "як навчитися програмувати", я навряд чи почав би з усієї ширини та ширини теоретичних основ повноти Тьюрінга. вся суть приготування та програмування - це робити речі в правильному порядку, повторюючи до готовності, як це робила ваша мама. що про це підсумовує це для мене.

потім знову, я ніколи не закінчив свій CS.


2
Якщо ви не впевнені, спершу слід дослідити це. fractran є Тьюринга , як BrainF * ск . Зауважте також, що html 5 + CSS 3 є Turing завершеним, оскільки він може реалізувати правило 110 .

1
так, я знаю. але всі наведені приклади є більш-менш езотеричними (хоча, можливо, цікавими чи дивними), моя відповідь була прагматичною, і, мабуть, зовсім не мінімальною. я думаю, що важливо зазначити, що ця сторінка була №1 під час пошуку повноти Тьюрінга в Google, відповіді тут - IMHO мало корисного, скажімо, для n00bie, який хоче знати, що відрізняє HTML від PHP або Python. я маю на увазі, brainf ck не називається brainf ck без жодної причини.
течія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.