停止の問題があまりにもあいまいな場合は、このように考えてください。
すべての正の整数のために真であると考えられている数学の問題乗りのnが、すべてのために真であることが証明されていないn個を。良い例はゴールドバッハの予想です。2より大きい正の偶数は2つの素数の和で表すことができます。次に、(適切な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");
プログラムは「Found SHA value」または「Not found SHA value」のいずれかを出力することを知っています(どちらが真であるかを教えてくれればボーナスポイント)。ただし、コンパイラーが合理的に最適化できるようにするには、2 ^ 2048回の繰り返しが必要になります。上記のプログラムは最適化せずに何かを印刷するのではなく、宇宙の熱死まで実行される(または実行される可能性がある)と私は予測しているので、それは実際には素晴らしい最適化です。