중지 문제가 너무 모호한 경우이 방법으로 생각하십시오.
모든 양의 정수 n에 대해 참으로 여겨지 지만 모든 n에 대해 참으로 입증되지는 않은 수학적 문제를 취하십시오 . 좋은 예는 Goldbach의 추측 인데, 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");
우리는 프로그램이 "발견 된 SHA 값"또는 "발견되지 않은 SHA 값"을 출력한다는 것을 알고 있습니다 (어느 것이 참인지 알려면 보너스 포인트). 그러나 컴파일러가 2 ^ 2048 반복의 순서를 취하는 합리적으로 최적화 할 수 있습니다. 실제로 위의 프로그램이 최적화없이 아무것도 인쇄하지 않고 우주의 열사병까지 실행될 것이라고 예측 했으므로 실제로는 큰 최적화가 될 것입니다.