Тюрінг-повнота говорить лише одне і одне: модель обчислень є Тюрінг-повною, якщо будь-які обчислення, які можуть бути змодельовані машиною Тьюрінга, також можуть бути змодельовані цією моделлю.
Отже, які обчислення може моделювати машина Тюрінга? Ну, і в першу чергу, Алана Тьюрінга та всіх його колег цікавились лише функції натуральних чисел. Отже, машина Тьюрінга (і λ-обчислення, числення комбінатора СК, μ-рекурсивні функції, ...) говорять лише про обчислюваність функцій за натуральними числами. Якщо ви не говорите про функцію на натуральних числах, то поняття Тюрінг-повноти навіть не має сенсу, воно просто не застосовується.
Однак зауважте, що ми можемо кодувати безліч цікавих речей як натуральні числа. Ми можемо кодувати рядки як натуральні числа, ми можемо кодувати графіки як натуральні числа, ми можемо кодувати булеви як натуральні числа. Ми можемо кодувати машини Тюрінга як натуральні числа, що дозволяє нам створювати машини Тьюрінга, які говорять про машини Тюрінга!
І, звичайно, не всі функції на натуральних числах обчислюються. Машина Тьюрінга може обчислювати лише деякі функції на натуральних числах, λ-обчислення може обчислювати лише деякі функції на натуральних числах, розрахунок комбінатора SK може обчислювати лише деякі функції на натуральних числах…. Дивно (або ні) виявляється, що кожна модель обчислення (реально реалізована у нашому фізичному Всесвіті) може обчислити однакові функції на натуральних числах (принаймні для всіх моделей, які ми знайшли до цього часу). [Примітка: очевидно, є слабкіші моделі обчислення, але ми ще не знайшли сильнішої, за винятком тих, які, очевидно, несумісні з нашим фізичним всесвітом, наприклад, з моделями, що використовують реальні числа чи подорож у часі.]
Цей факт, що після тривалого пошуку багатьох моделей, ми щоразу виявляємо, що вони можуть обчислити абсолютно однакові функції, є основою для тези тези Церкви-Тьюрінга, яка говорить (приблизно), що всі моделі обчислень однаково потужні, і всі вони фіксують "ідеальне" уявлення про те, що означає бути "обчислюваним". (Існує також другий, більш філософський аспект CTT, а саме те, що людина, керуючись алгоритмом, може також обчислювати абсолютно ті самі функції, які TM може обчислити, і не більше.)
Однак ніщо з цього нічого не говорить
- наскільки ефективні різні моделі
- як зручно ними користуватися
- що ще вони можуть зробити, окрім обчислити функції на натуральних числах
І що саме там , де різниця між різними моделями обчислень (і мов програмування) вступає в гру.
O ( s i zеa r r a y)О ( сi zе2a r r a y)s i zеa r r a ys i zеa r r a y
Як приклад для різної зручності, ви можете просто порівняти код, написаний дуже високим рівнем мови, код, написаний у зборі, та опис TM для вирішення тієї ж проблеми.
І ваш перемикач світла - це приклад третьої різниці: речі, які можуть зробити деякі моделі, не функціонують на натуральних числах і, таким чином, не мають нічого спільного з повнотою Тьюрінга.
Щоб відповісти на ваші конкретні запитання:
Але чи можна будь-яку програму, написану цільною мовою Тюрінга, переписати іншою?
Ні. Тільки якщо програма обчислює функцію обчислення Тюрінга на натуральних числах. І навіть тоді може знадобитися складне кодування. Наприклад, у λ-обчислення немає навіть натуральних чисел, їх потрібно кодувати за допомогою функцій (адже функції - це єдине, що має λ-обчислення).
Таке кодування вводу та виходу може бути дуже складним, як і алгоритм вираження. Отже, хоча правда, що будь-яку програму можна переписати, переписана програма може бути набагато складнішою, значно більшою, використовувати набагато більше пам’яті та значно повільніше.
Що робити, якщо моя асамблея має код LIGHTBUTTON? Я фізично не можу наслідувати цю мову в системі (мові) без лампочки.
Лампочка не є функцією обчислення Тюрінга на натуральних числах. Дійсно, лампочка не є ні функцією, ні обчисленням. Увімкнення та вимкнення лампочки є побічним ефектом вводу / виводу. Машини Тьюрінга не моделюють побічних ефектів вводу-виводу, і Turing-завершеність для них не стосується.
Про довільні дійсні числа.
Тюрінг-повнота має справу лише з обчислюваними функціями на натуральних числах, вона не стосується справжніх чисел.
Тюрінг-повнота просто не дуже цікава, якщо мова йде про такі питання, як ваше, з двох причин:
- Це не дуже велике перешкода. Все , що вам потрібно , це
IF
, GOTO
, WHILE
і одне ціле число змінної (передбачається , що змінна може містити скільки завгодно великі цілі числа). Або рекурсія. Багато, багато і багато чого є Тюрінг-завершений. Карткова гра Magic: The Gathering завершена. CSS3 є Тьюрінгом. Файл sendmail
конфігурації завершено Тьюрінгом. Intel x86 MMU завершений Тьюрінгом. MOV
Інструкція Intel x86 є Turing-завершеною. Анімації PowerPoint завершені Тьюрінгом. Excel (без сценаріїв, лише за допомогою формул) є повним Тьюрінгом. Протокол маршрутизації BGP завершений Тьюрінгом. sed
є Тьюрінгом. mod_rewrite
Правила Apache завершені Тьюрінгом. Google для " (випадково АБО не дивно) завершення"щоб знайти деякі інші цікаві приклади. Якщо майже все є Тьюрінг-завершеним, то бути Тюрінг-завершенням перестає бути цікавою властивістю.
- Насправді не потрібно бути корисним. Багато корисних речей не є Тьюрінгом. CSS до версії 3 НЕ Тьюринг-повній (і той факт , що CSS3 є насправді не використовується ким - небудь). SQL до 1999 року не був повним Тьюрінгом, але він був надзвичайно корисним ще тоді. Мова програмування на C без додаткових бібліотек , схоже, не є повною для Тьюрінга . Залежно набрані мови, більш-менш за визначенням, не є повним Тюрінгом, але ви можете писати в них операційні системи, веб-сервери та ігри.
Едвін Брейді, автор "Ідріса", використовує термін "повний тетріс", щоб поговорити про деякі з цих аспектів. Бути повноцінним тетрісом не є чітко визначеним (крім очевидного "можна використовувати для впровадження тетрісу"), але воно включає в себе такі речі, як достатньо високий рівень та виразність, що ви можете писати гру, не божевільна, вміючи взаємодіяти із зовнішнім світом (вхід та вихід), вміючи виражати побічні ефекти, вміти писати цикл подій, вміти виражати реактивне, асинхронне та одночасне програмування, вміти взаємодіяти з операційною системою, вміти взаємодіяти з іноземними бібліотеками (іншими словами: вміти телефонувати та називатися за допомогою коду С) тощо. Це набагато цікавіші особливості мови програмування загального призначення, ніж це повнота Тьюрінга.
Можливо, ви знайдете мою відповідь на відповідне вами питання , яке стосується деяких тих самих моментів, хоча воно відповідає на інше питання.