Якщо проблема зупинки занадто неясна, подумайте про це так.
Візьміть математичну задачу, яка вважається істинною для всіх позитивних цілих чисел n , але не доведено, що вона є правдою для кожного n . Хорошим прикладом може бути припущення Гольдбаха , що будь-яке додатне навіть ціле число, що перевищує два, може бути представлено сумою двох простих чисел. Потім (з відповідною бібліотекою bigint) запустіть цю програму (псевдокод випливає):
for (BigInt n = 4; ; n+=2) {
if (!isGoldbachsConjectureTrueFor(n)) {
print("Conjecture is false for at least one value of n\n");
exit(0);
}
}
Виконання програми isGoldbachsConjectureTrueFor()
залишається читачем як вправа, але для цього може бути простою ітерацією для всіх праймерів меншеn
Тепер, логічно, вищезазначене повинно бути або еквівалентом:
for (; ;) {
}
(тобто нескінченна петля) або
print("Conjecture is false for at least one value of n\n");
оскільки гіпотеза Гольдбаха повинна бути або правдою, або неправдою. Якщо компілятор завжди міг би усунути мертвий код, тут безумовно був би усунутий мертвий код в будь-якому випадку. Однак, принаймні, вашому компілятору потрібно буде вирішити довільно важкі проблеми. Ми могли б забезпечити проблеми доказово важко , що б вирішити (наприклад , NP-повних задач) , щоб визначити , який біт коду усунути. Наприклад, якщо ми беремо цю програму:
String target = "f3c5ac5a63d50099f3b5147cabbbd81e89211513a92e3dcd2565d8c7d302ba9c";
for (BigInt n = 0; n < 2**2048; n++) {
String s = n.toString();
if (sha256(s).equals(target)) {
print("Found SHA value\n");
exit(0);
}
}
print("Not found SHA value\n");
ми знаємо, що програма або роздрукує "Знайдене значення SHA" або "Не знайдено значення SHA" (бонусні бали, якщо ви можете сказати мені, яке з них є правдивим). Однак, щоб компілятор міг обґрунтовано оптимізувати, що брало б порядку 2 ^ 2048 ітерацій. Насправді це була б велика оптимізація, оскільки я прогнозую, що вищезгадана програма буде (або може) працювати до теплової смерті Всесвіту, а не надрукувати щось без оптимізації.