Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int isTheFunCalculable (int input) {
if (input == 5) return 7;
return 5;
}int main() {std::cout << "Hello, world!";} Такую программу (у вас соответствующую номеру 5), конечно, можно найти. Но возвращая на все остальные входы именно ее, рано или воздно алгоритм наткнется на вход:int main() {std::cout << "Hello, " << "world!";} Скажем, эта программа будет иметь номер N, и N будет неподвижной точкой преобразователя, поскольку обе программы с номерами 5 и N эквивалентны.int isTheFunCalculable (int input) {
if (prints_hello_world(input)) return 7;
return 5;
} у вас не получится, поскольку невозможно реализовать функцию bool prints_hello_world(source)
. Так вот, данная теорема о неподвижной точке говорит о том, что для любой вычислимой g существует такое n, что
.
, которая возвращает текст программы под номером n и оракул
, который возвращает true, если программы s1 и s2 вычисляют одинаковые функции и false в противном случае (это явно оракул согласно теореме Райса). Тогда мы можем написать такую программу:function m = g(n)
m = 1;
while O(A(n), A(m)) == true
m = m + 1;
end
end

Если есть программа, получающая на вход исходный код и возвращающая исходный код, то можно подобрать такой исходник, который по смыслу не изменится после данного преобразования
if (s=="main;") {
return s;
} else {
return "main(){return -1}";
}
Теорема Клини о неподвижной точке: квайны