почему не может быть программа, которая проверяет другую программу - PullRequest
0 голосов
/ 29 апреля 2010

Я пытаюсь найти логическое объяснение, почему не может быть программа, которая проверяет другие программы.

Я помню, что мы учились на курсе вычислений, но сейчас я просто не могу найти решение, и мне нужно объяснить это кому-то на моей работе.

Спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 29 апреля 2010

Вы ищете проблему остановки .

Алан Тьюринг доказал в 1936 году, что Общий алгоритм решения остановки проблема для всех возможных программ ввода пары не могут существовать. Мы говорим, что проблема остановки неразрешима Машины Тьюринга.

2 голосов
/ 29 апреля 2010

«Проверяет другую программу» очень широк. Фактически, некоторые функции программ можно проверить , например, проверяет ли тип программы Java. Тем не менее, проверка типов в Java-программе также отвергнет некоторые программы, которые никогда не приведут к ошибке типа при запуске, например:

int foo() {
    if (true) return 5;
    else return null;
}

Этот метод никогда не вернет null, но средство проверки типов не может этого увидеть. Но разве мы не могли бы сделать систему более умного типа?

К сожалению, ответ - нет. Рассмотрим следующую программу:

int bar() {
    if (infiniteComputation()) return 5;
    else return null;
}

Средство проверки типов не может проверить, будет ли infiniteComputation когда-либо возвращать false, из-за проблемы остановки .

Другая связанная теорема - Теорема Райса , которая, вероятно, ближе к тому, о чем был задан ваш вопрос, чем к проблеме остановки.

Стоит отметить, что в теореме утверждается только то, что нет программного свойства, которое можно было бы точно проверить, но все еще можно достаточно хорошо аппроксимировать такие проверки для практических целей. Одним из примеров являются системы типов, где мы принимаем, что некоторые «правильные» программы отклоняются, как фрагмент кода выше. Компиляторы также могут устранять мертвый код во многих случаях, хотя это невозможно сделать в в каждом случае.

2 голосов
/ 29 апреля 2010

В этом Википедии есть запись ...

Но в основном, чтобы определить, можно ли остановить какую-либо достаточно сложную программу, вам нужно запустить ее, чтобы отследить путь выполнения. Это означает, что вы вернулись к одной программе, на которой запущена другая программа, и если эта программа не останавливается, программа, которая ее просматривает, также не остановится.

Это похоже на вычисление цифр в пи ... это остановится? Как вы можете сказать, что он бесконечен во время выполнения, в отличие от страдания от некоторых вычислительных проблем? Мы знаем, что эта конкретная проблема бесконечна, но другие подобные проблемы не были так доказаны.

0 голосов
/ 29 апреля 2010

Ответ Байрона должен указать вам на важную информацию. Кроме того, вы можете иметь программу, которая проверяет конкретную программу. Чего у вас не может быть, так это программы, которая проверяет правильность произвольной программы.

...