Заплутаний теоремою Райса


37

Короткий зміст: За теоремою Райса все неможливо. І все-таки я роблю це, нібито, неможливо весь час!


Звичайно, теорема Райса не говорить просто "все неможливо". У ньому сказано щось досить конкретніше: "Кожна властивість комп'ютерної програми не обчислюється".

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

Ось що говорить теорема, або, здається, говорить. І, мабуть, велика кількість дуже розумних людей ретельно перевірили правильність цієї теореми. Але це, здається, повністю не відповідає логіці! Є численні властивості програм, які тривіально обчислювати !! Наприклад:

  • Скільки кроків виконує програма перед зупинкою? Вирішити, чи є це число кінцевим чи нескінченним, саме проблема зупинки, яка не обчислюється. Вирішити, чи більша ця чи менша, ніж деяка кінцева , тривіально! Просто запустіть програму до n кроків і подивіться, зупиняється вона чи ні. Легко!нн

  • Аналогічним чином , робить використання програми більш-менш ніж одиниць пам'яті в своїх перших м кроків виконання? Тривіально обчислювані.нм

  • Чи згадується текст програми змінної з назвою ? Тривіальний текстовий аналіз виявить відповідь.к

  • Програма чи викликає команду ? Знову скануйте текст програми, шукаючи це ім'я команди.σ

Я можу побачити безліч властивостей, які також виглядають невичислими; наприклад, скільки доповнень виконує повна програма програми? Ну, це майже те саме, що запитати, скільки кроків виконує програма, що практично є проблемою зупинки. Але, схоже, є навантаження на човні програмних властивостей, які по-справжньому дуже просто обчислити. І все-таки теорема Райса наполягає на тому, що жодна з них не обчислюється.

Що я тут пропускаю?


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

Відповіді:


36

Для цілей цієї дискусії "програма" - це фрагмент коду, який завжди приймає ціле число як вхідний код і запускається назавжди або повертає ціле число. Ми говоримо, що дві програми f і є екстенсіонально рівними, якщо вони обчислюють одну і ту ж функцію, тобто для кожного числа n або обохгn і g ( n ) працюють назавжди, або вони припиняють і виводять одне і те ж число.f(n)g(n)

Екстенсіональності властивість програм є властивість , що поважає екстенсіональності рівність, тобто, якщо е і г є екстенсіонально одно , то вони або обидва мають властивість P або обидва не мають його.PfgP

Ось деякі приклади , які не є -extensional властивостей:

  1. Програма зупиняється протягом н кроків. (Ми завжди можемо змінити програму на рівну, яка триває довше.)
  2. Програма використовує менше клітинок пам’яті протягом першого mнм етапів виконання. (Ми завжди можемо змінити програму на рівну програму, щоб вона використовувала деяку пам'ять без поважних причин.)
  3. Текст програми згадує змінну з назвою k . (Ми можемо перейменувати змінні.)
  4. Програма чи викликає команду . Це може трохи залежати від того, що таке σ , але якщо це щось, що може бути змодельовано якимось чином, то ми можемо ухилитися від σ і все ж мати програму, яка дорівнює рівню вихідної.σσσ

Я впевнений, що ви помітили, що я перерахував саме ваші передбачувані зустрічні приклади до теореми Райса, яка говорить:

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

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


Я не можу отримати цю відповідь .. (Вибачте, якщо я прошу те саме, але було б добре уточнити цей пункт). Він говорить про те, що ви можете змінювати ці програми, змінюючи їх синтаксис, щоб отримати еквівалент розширення , але як перевірити в першу чергу ці еквівалентні розширення? Ви не можете використовувати програму для порівняння, якщо ці програми програми взагалі мають обидва властивості, тому, коли ви говорите "змінити її", я думаю, що це можливо, тому що це прості приклади, (ви б додали "ретельно модифікуйте"?) IDE для цього "? ..) Я думаю, що коли ви модифікуєтесь, ви не можете перевірити загалом, так, можливо, Райс дотримується.
Hernan_eche

1
n+m=m+n

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

36

Основні непорозуміння:

Кожна властивість комп'ютерної програми не обчислюється

PRE

{MfMP}

P тут кілька прикладів.

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

Не так багато, здається, відомих синтаксичних властивостей; див. це питання .


1
Я заблукав приблизно через перше речення чи так. Вибачте. Чи може хтось детальніше розглянути різницю між семантичною та синтаксичною властивістю?
MathematicalOrchid

@MathematicalOrchid: Ви можете сміливо ігнорувати це речення; перший абзац містить всю необхідну інформацію. Я все одно детальніше докладу.
Рафаель

2
Семантичний = про те, що робить програма. Синтаксичний = про те, як виглядає програма.
reinierpost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.