Озадачен теоремой Райс


37

Реферат: Согласно теореме Райс, все невозможно. И все же, я делаю это якобы невозможное постоянно!


Конечно, теорема Райс не просто говорит, что «все невозможно». В нем говорится что-то более конкретное: «Каждое свойство компьютерной программы не вычислимо».

(Если вы хотите разделить волосы, каждое «нетривиальное» свойство. То есть свойства, которыми обладают все программы или нет программ, тривиально вычисляемы. Но любое другое свойство не вычислимо.)

Это то, что говорит или, кажется, говорит теорема. И, вероятно, множество очень умных людей тщательно проверили правильность этой теоремы. Но, похоже, это совершенно не поддается логике! Есть множество свойств программ, которые тривиально вычислить! Например:

  • Сколько шагов выполняет программа перед остановкой? Решить, является ли это число конечным или бесконечным, - это как раз проблема Халтинга, которая не вычислима. Решить, является ли это число большим или меньшим некоторого конечного , тривиально! Просто запустите программу до шагов и посмотрите, останавливается она или нет. Легко!NN

  • Точно так же, использует ли программа больше или меньше единиц памяти на своих первых шагах выполнения? Тривиально вычислимо.мNм

  • Упоминает ли текст программы переменную с именем ? Тривиальный текстовый анализ покажет ответ.К

  • Программа вызывает команду ? Снова отсканируйте текст программы в поисках имени этой команды.σ

Я вижу множество свойств, которые также выглядят не вычисляемыми; Например, сколько дополнений выполняет полный прогон программы? Ну, это почти то же самое, что спрашивать, сколько шагов выполняет программа, что фактически является проблемой остановки. Но, похоже, существует множество программных свойств, которые очень легко вычислить. И все же теорема Райс настаивает на том, что ни одна из них не является вычислимой.

Что мне здесь не хватает?


8
«Согласно теореме Райс, все невозможно». -- Нет. «Каждое свойство компьютерной программы не вычислимо». -- Нет. Вы не одиноки: большинство студентов сталкиваются с этим заблуждением.
Рафаэль

Ответы:


36

Для целей этого обсуждения «программа» - это фрагмент кода, который всегда принимает целое число в качестве входных данных и либо выполняется вечно, либо возвращает целое число. Мы говорим , что две программы и г являются экстенсионально равны , если они вычислить ту же функцию, то есть для каждого числа п либо как е ( п ) и г ( п ) бежать навсегда, или они оба прекратить и выводить тот же номер.егNе(N)г(N)

Экстенсиональное свойство программ является свойство , что уважает экстенсиональное равенство, то есть, если е и г является экстенсионально равно , то они либо оба имеют свойство P или оба не имеют его.пегп

Вот некоторые примеры , не являющиеся -extensional свойств:

  1. Программа останавливается в течение шагов. (Мы всегда можем изменить программу на равную по длине и работать дольше.)N
  2. Программа использует меньше чем ячеек памяти в течение первых m шагов выполнения. (Мы всегда можем изменить программу до экстенсивно равной, чтобы она использовала некоторую память без веской причины.)Nм
  3. В тексте программы упоминается переменная с именем k. (Мы можем переименовать переменные.)
  4. σσσ

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

Теорема (Райс): вычислимое экстенсиональное свойство программ либо содержит все программы, либо их нет.

Есть еще один способ объяснить это: вы должны различать программу и функцию, которую она вычисляет. Многие разные программы вычисляют одну и ту же функцию (все они одинаково). Теорема Райса о свойствах функций, а не о свойствах программ, которые их вычисляют.


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

1
N+мзнак равном+N

Кроме того, вы совершаете странный скачок рассуждений в своих рассуждениях: так как экстенсиональное равенство не разрешимо, теорема Райс может быть неверной. Как же так? И только потому, что экстенсиональное равенство неразрешимо, это не означает, что нет никаких примеров этого, которые мы можем решить. Те, что я упомянул - мы можем решить это.
Андрей Бауэр

36

Фундаментальное недоразумение:

Каждое свойство компьютерной программы не вычислимо

прЕ

{M|еMп}

п

Теорема Райса имеет дело с семантическими свойствами (свойствами функции, вычисляемой программой, например, доменом или диапазоном значений). Вы ссылаетесь на синтаксические свойства (свойства программы , такие как время выполнения или количество используемых переменных).

Похоже, мало что известно о синтаксических свойствах; см этот вопрос .


1
Я заблудился после первого предложения или около того. Сожалею. Может ли кто-нибудь уточнить разницу между семантическим и синтаксическим свойством?
Математическая

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

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