Чи є чітке визначення поняття "обчислювальне" для моделей обчислень, які не закінчуються?


9

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

Типовим визначенням обчислювальної схеми є наступне:

Визначення 1: Функція називається turing computable iff. Існує машина turing яка обчислює використовуючи відповідне кодування натуральних чисел як рядків.f:NкNМf

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

А що робити, якщо ми подивимось на слабкіші моделі обчислень, ніж машини націлювання? Наприклад, давайте розглянемо набір " " машин з алфавітом який може рухатися лише праворуч, і визначення обчислюваного, яке відповідає встановленню turing обчислюваності:Мc{0,1}

Визначення 2: Функція називається калікою що обчислюється або обчислюється в iff, є яка обчислює використовуючи відповідне кодування натуральних чисел як рядок.f:NкNМcМf

Якщо ми визначимо "відповідну кодування" в якості "двійкового кодування", то функція є НЕ обчислюваних в . Якщо ми аксіоматизована «підходящу кодування» як «одномісний кодування», то є обчислимо в . Це здається незручним, враховуючи той факт, що кожен може за бажанням зафіксувати одне з нескінченно багатьох інтуїтивних кодувань. Повинно бути зрозуміло, чи може обчислювальна модель обчислити чи ні, не посилаючись на якесь конкретне кодування - принаймні, я ніколи не бачив, щоб хтось згадував, яке кодування використовується, коли заявляли, що "петльові програми слабкіші за тирінг машини".f:NN,нн+1Мcf Мcf


Після цього вступу я можу остаточно сформулювати своє запитання: як би можна було визначити "відповідні кодування" та "обчислюваність" для довільних моделей обчислення, які не збігаються з інтуїтивним поняттям обчислюваності? Чи можливо це в рамках затвердження обчислюваності?

Редагувати: я скоротив вступ, він не додав до питання.

Відповіді:


6

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

Обчисленість є сутністю властивості рядкових функцій f:ΣΣ. Коли ви визначаєте обчислюваність у будь-якому іншому домені, вам потрібно виправити кодування. На практиці всі "розумні" кодування є рівнозначними в значенні попереднього пункту, тому точне кодування значення не має.

Однак кодування має значення в обмежених моделях обчислення. Для кращого прикладу, припустимо, ви вважаєте, що машини Тьюрінга з обмеженим часом: скажіть, ви хочете, щоб ваша машина вчасно закінчиласяО(нc) для деяких c, де н- довжина вводу (у вигляді рядка). Ми більше не можемо перемикатися між бінарним кодуванням та одинарним кодуванням, оскільки двійкове кодування набагато компактніше. Коли ми говоримо про багаточленну обчислювану функцію цілих чисел , ми вказуємо, що цілі числа кодуються у двійковій формі . Навіть це дещо довільний вибір, оскільки десяткове кодування призвело б до того ж поняття обчислення поліноміального часу.

Отже, щоб відповісти на ваше запитання - кодування вказано як частина визначення моделі з обмеженням.


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

1
Одне визначення витягує з капелюха. Оскільки різні визначення, як правило, рівнозначні, точне визначення не має значення. Коли це станеться, з'явиться кілька різних понять складності. Наприклад, для деяких алгоритмів графіків це має значення, якщо вам надана матриця суміжності або список ребер.
Yuval Filmus

Отже, підсумовуючи: а) Визначення кожної окремої моделі обчислень повинно включати її синтаксис, семантику І відповідне кодування. б) Визначення "придатного кодування" повністю не залежить від синтаксису та семантики моделі. c) Немає можливості дати визначення "підходящого кодування", яке справедливо для всіх моделей обчислень. Це правильно?
Стефан Луц

Я згоден з а) і б), але з в) лише частково. Ви можете визначити відповідне кодування, яке виконує функцію "стандартного кодування", яке використовується, якщо чітко не згадується факт. Що стосується чисел, існує таке стандартне кодування - двійкове кодування.
Yuval Filmus

Гаразд, але це насправді не є загальним визначенням, воно просто економить час людей, оскільки їм не потрібно чітко записувати "У цій моделі М, ми використовуємо двійкове кодування ", оскільки це мається на увазі, якщо вони не записують його. Вони все одно можуть вибрати інше кодування для своєї моделі. Я мав на увазі під" загальним визначенням "- це набір властивостей, які повинно виконувати кожне кодування, щоб бути дозволеним як кодування.
Стефан Луц

4

Перш за все, ви не можете виправити "відповідне кодування", щоб бути двійковими рядками або будь-яким іншим кодуванням. Це тому, що ви втратите занадто багато моделей обчислень, тому що різні моделі обчислень можуть мати дуже різні моделі введення та виведення. Іншими словами, вони можуть не "говорити" рядків.

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

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

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


Чи можливо, що у вас в минулому абзаці обернулися речі? Ви пишете, що кодування виконується простою моделлю, а не еталонною моделлю - у попередньому абзаці ви хочете, щоб кодування виконувалася еталонною моделлю, а не іншою моделлю (обчислення лямбда).
Стефан Луц

Якщо ви вивчаєте слабкіші моделі обчислень, ви не хочете використовувати машини Тьюрінга ніде, навіть у фазі кодування / декодування. Тоді ви могли просто виконати всі обчислення на фазі кодування, і приблизно будь-яка модель обчислень була б завершеною Тьюрінгом. Тому для кодування / декодування вам потрібно використовувати простішу еталонну модель.
Hoopje

1
Тоді я не бачу, як ми можемо довести цілісність обчислення лямбда за допомогою церковних цифр, якщо зафіксувати машини для твердження. Ми повинні припустити, що LC слабкіший за TM, тому деякий екземпляр «слабшої» моделі лямбда-кальцю дається числонN використовуючи його кодування cгодуrcгод:Nламбгатеrм як cгодуrcгод(н), потім обчислює свою функцію тоБiнаrу:ламбгатеrмламбгатеrм які виводять двійковий рядок шΣ? Кодомени не відповідають. Навіть якщо я дозволяю лямбдатерм тлумачити як рядки, є інші моделі, які не говорять про рядки, як ви заявили.
Стефан Луц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.