Який мінімальний набір мовних особливостей / структур, завдяки яким Тьюрінг є повним?
Який мінімальний набір мовних особливостей / структур, завдяки яким Тьюрінг є повним?
Відповіді:
Тьюринга тарпіттінга є свого роду езотеричного мови програмування , який прагне бути Тьюринг-повній, використовуючи в якості декількох елементів , як це можливо. Brainfuck - це, мабуть, найвідоміший тарпіт, але їх багато.
Iota та Jot - це функціональні мови з двома та трьома символами відповідно на основі обчислення комбінатора SK (I) .
OISC ( One Computer Set Computer ) позначає тип імперативних обчислень, для яких потрібна лише одна інструкція з одного або декількох аргументів, як правило, "віднімання та розгалуження, якщо менше або дорівнює нулю", або "зворотне віднімання та пропуск, якщо запозичити". X86 MMU реалізує попередню інструкцію і, таким чином, завершує Turing.
Загалом, щоб імперативна мова була повною для Тьюрінга, вона потребує:
Форма умовного повторення або умовного переходу (наприклад, while
, if
+ goto
)
Спосіб читання та запису певної форми зберігання (наприклад, змінних, стрічки)
Щоб функціональна мова, заснована на лямбда-числення, була TC, вона потребує:
Можливість абстрактних функцій над аргументами (наприклад, лямбда-абстракція, цитата)
Можливість застосовувати функції до аргументів (наприклад, скорочення)
Звичайно, існують й інші способи розгляду обчислень, але це звичайні моделі для Тюрінга. Зауважте, що справжні комп’ютери не є універсальними машинами Тьюрінга, оскільки вони не мають необмеженого сховища. Строго кажучи, вони є "обмеженими машинами зберігання". Якби ви продовжували додавати їм пам'ять, вони б асимптотично наближалися до потужних машин Тьюрінга. Однак для обчислення корисні навіть обмежені машини зберігання та машини з кінцевим станом ; вони просто не універсальні .
Строго кажучи, введення-виведення не потрібно для цілісності Тьюрінга; TC лише стверджує, що мова може обчислити потрібну вам функцію, а не те, що вона може показати вам результат. На практиці кожна корисна мова має якийсь спосіб взаємодії зі світом.
З більш практичної точки зору: якщо ви можете перекласти всі програми на мові, що повністю завершує Тьюрінг, на вашу мову, то (наскільки я знаю), ваша мова повинна бути повною Тюрінгом. Таким чином, якщо ви хочете перевірити, чи розроблена вами мова Тюрінга є повною, ви можете просто написати Brainf *** до компілятора YourLanguage і довести / продемонструвати, що він може компілювати всі легальні програми BF.
Для уточнення, я маю на увазі, що крім перекладача для YourLanguage, ви пишете компілятор (будь-якою мовою), який може компілювати будь-яку програму BF до YourLanguage (зберігаючи таку ж семантику, звичайно).
</sarcasm>
Систему можна вважати Тюрінгом повною лише тоді, коли вона може зробити все, що може зробити універсальна машина Тьюрінга. Оскільки, як кажуть, універсальна машина Тьюрінга здатна вирішувати будь-яку обчислювальну функцію за даний час, цілісні системи Тьюрінга можуть, таким чином, також робити це.
Щоб перевірити, чи є щось із Тьюрінга завершеним, подивіться, чи можна впровадити машину Тюрінга всередині нього. Іншими словами, перевірте, чи може вона імітувати наступне:
Це справжні мінімальні вимоги до системи, яку Тюрінг вважатиме завершеною. Нічого більше, нічого менше. Якщо він не може імітувати будь-яке з них якимось чином, це не є завершенням Тьюрінга. Запропоновані іншими людьми способи є лише засобом до кінця, оскільки існує декілька повних систем Тьюрінга, які не мають цих особливостей.
Зауважте, що не існує відомого способу побудувати справжню повну систему Тьюрінга. Це тому, що не існує відомого способу по-справжньому моделювати безмежність стрічки машини Тьюрінга у фізичному просторі.
Мова програмування є завершеним, якщо ви можете зробити будь-який розрахунок з ним. Існує не один набір функцій, який робить мову turing повною, тому відповіді, які говорять, що вам потрібні петлі, або що вам потрібні змінні, невірні, оскільки є мови, які не мають, але є turing завершеними.
Алан Тьюрінг зробив універсальну машину для тюрінгу, і якщо ви можете перекласти будь-яку програму, розроблену для роботи на універсальній машині, щоб вона працювала на вашій мові, це також Тюрінг завершено. Це також працює опосередковано, так що ви можете сказати, що мова X є завершеною, якщо всі програми для мовлення цілої мови Y можуть бути перекладені на X, оскільки всі програми універсальних машин Turing можуть бути переведені в програму Y.
Часова складність, складність простору, простота формату введення / виводу та простота написання будь-якої програми не включаються до рівняння, тому така машина теоретично може робити всі обчислення, якщо обчислення не зупиняються втратами енергії або землею проковтне сонце.
Зазвичай для підтвердження повноти випробування вони перекладачами перевіряють будь-яку перевірену мовою цілковитості, але для її роботи потрібні засоби введення та виведення, дві речі, які справді не потрібні, щоб мова була завершеною. Досить, що ваша програма може змінити стан при запуску і щоб ви могли перевірити пам'ять після зупинки програми.
Для того, щоб зробити мову успішною, вона потребує більше, ніж твердження повноти, і це справедливо навіть для виправлення тарпітів. Я не думаю, що BrainFuck був би популярним без ,
і .
.
Ви не можете сказати, чи буде вона нескінченно циклічною чи зупиниться.
Пояснення: Враховуючи деякий вклад, неможливо в кожному випадку сказати (використовуючи інший апарат Тьюрінга), якщо річ буде нескінченно циклічна або врешті-решт зупиниться, за винятком запуску її (що дає відповідь, якщо вона зупиняється, але не якщо це петлі!).
Це означає, що ви повинні бути в змозі зберігати потенційно необмежену кількість даних деяким чином - він повинен бути еквівалент нескінченній стрічці, незалежно від того, наскільки це складено! (Інакше існує лише обмежена кількість станів, і тоді ви можете перевірити, чи раніше ви пройшли цей стан і врешті-решт зупинитесь). Як правило, машини Тьюрінга можуть збільшувати або зменшувати розміри свого стану якимись контрольованими засобами.
Оскільки оригінальна універсальна машина Тьюрінга у Тьюрінга має нерозв'язну проблему зупинки, то у вашої власної машини Тьюрінга також має бути нерозв’язна проблема.
Тюрінг повних систем може імітувати будь-яку іншу повну систему Тьюрінга, тому, якщо ви можете створити емулятор для якоїсь відомої повної системи Тюрінга у вашій системі, це доводить, що ваша система також є Тюрінгом завершеною.
Наприклад, припустимо, ви хочете довести, що Змії та драбини є Тюрінгом завершеним, отримавши дошку з нескінченно повторюваним шаром сітки (з іншою версією зверху та зліва). Знаючи, що машина 2-лічильника Міньського є Тюрінг завершеною (у якої є 2 необмежених лічильника і 1 стан із кінцевого числа), ви можете побудувати еквівалентну дошку, де позиції X і Y у сітці - це поточне значення двох лічильників а поточний шлях - поточний стан. Вибух! Ви щойно довели, що Змії та сходи Тюрінг завершені.
Однією необхідною умовою є цикл з максимальним числом ітерацій, який не визначається до ітерації, або рекурсія, де максимальна глибина рекурсії не визначена вперед. В якості прикладу, для ... в ... петлях , як ви їх знайдете в багатьох нових мовах НЕ досить , щоб зробити мову Тьюринг (але вони матимуть інші засоби). Зауважте, що це не означає обмежену кількість ітерацій або обмежену глибину рекурсії, але що максимальні ітерації та глибина рекурсії повинні бути розраховані заздалегідь.
Наприклад, функція Ackermann не може бути обчислена мовою без цих функцій. З іншого боку, безліч цих складних і дуже корисних програм можна написати, не вимагаючи цих функцій.
З іншого боку, з кожної ітерації графа і кожної глибини рекурсії обчисленої вперед, не тільки може бути прийнято рішення , чи буде програма зупинити чи ні, але це буде зупинити.
я знаю, що це не формально правильна відповідь, але як тільки ви виймете «мінімум» з «Тюрінга-повного» і покладете «практичне» назад, куди йому належить, ви побачите найважливіші функції, які відрізняють мову програмування від мова розмітки є
наступний приход
щоб перевірити ці твердження, почніть з мови розмітки, скажімо, HTML. ми можемо винайти HTML + лише зі змінними, або лише з умовними умовами (MS це зробив із умовними коментарями), або з якоюсь конструкцією циклу (яка за відсутності умовних умов, ймовірно, закінчиться як щось подібне <repeat n='4'>...</repeat>
). виконання будь-якого з них зробить HTML + значно (?) потужнішим, ніж звичайний HTML, але це все ж буде більше розмітки, ніж мови програмування; з кожною новою функцією ви робите менше декларативним і більше імперативним мовою.
прагнення до мінімальності в логіці та програмуванні, безумовно, є важливим і цікавим, але якби мені довелося навчати молодих чи старих людей "чого програмувати" та "як навчитися програмувати", я навряд чи почав би з усієї ширини та ширини теоретичних основ повноти Тьюрінга. вся суть приготування та програмування - це робити речі в правильному порядку, повторюючи до готовності, як це робила ваша мама. що про це підсумовує це для мене.
потім знову, я ніколи не закінчив свій CS.