2015-06-04 7 views
0

Скажем, я хочу, чтобы найти натуральное число п, которое п + п = 3 Чтобы решить эту проблему в вычислительном отношении, я бы запустить алгоритм:Признание Неразрешимые предложений (бесконечный цикл)

int n = 1; 
while(n+n!=3) 
    n++; 
System.out.println(n); 

Конечно, мы знаем, что этот цикл представляет собой бесконечный цикл. Но есть ли алгоритм, который может предсказать, будет ли этот цикл бесконечным или конечным? (похоже, но отличается от машины остановки, так как мой желаемый алгоритм рассматривает этот цикл только тогда, когда машина остановки может проверять все петли). Если есть, каков будет алгоритм?

+0

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

+0

, когда я написал свой комментарий, ваш вопрос выглядел совсем по-другому ... с потенциалом обмануть менее опытных людей в потенциально смущающий ответ. теперь, когда вы его уточнили, я удалил его. –

ответ

0

В ответ на конкретный заданный вопрос («существует ли алгоритм, который может предсказать, если этот цикл будет бесконечным или конечным»), алгоритм просто будет просто сообщать «INFINITE».

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

+0

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

+0

Я сделал: return "INFINITE"; Это алгоритм. –

0

Пока эта программа работает, ее состояние может быть полностью определено значением переменной «n» и следующей операцией (между конечным набором операций), которая должна быть выполнена. Алгоритм может имитировать выполнение этой программы шаг за шагом, на каждом шаге, проверяя, соответствуют ли данные и следующая операция предыдущим шагам. Если совпадение найдено, то алгоритм останавливает симуляцию и сообщает, что программа не останавливается. Если совпадение не найдено, новое состояние программы регистрируется для будущих сравнений. Если дальнейшая операция не выполняется, то есть программа завершает работу сама по себе, тогда алгоритм сообщает, что программа останавливается.

Этот алгоритм, конечно, очень неэффективен, но он показывает очень общий случай: можно предсказать, останавливается ли конкретная программа, когда эта программа не использует произвольно большой объем памяти (для кода и данных) ,