I contacted one of the best experts in the field of the theory computation of about my own ideas on the halting problem and he gave me permission to quote him.
MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022
If simulating halt decider H correctly simulates its input D until H correctly determines that its simulated D would never stop running unless aborted then
H can abort its simulation of D and correctly report that D specifies a non-halting sequence of configurations.
MIT Professor Sipser agreed to ONLY these verbatim words 10/13/2022
typedef void (*ptr)();
typedef int (*ptr2)();
int H0(ptr P);
int H(ptr2 P, ptr2 I);
void Infinite_Loop()
{
HERE: goto HERE;
}
void Infinite_Recursion()
{
Infinite_Recursion();
}
void DDD()
{
H0(DDD);
}
int P(ptr2 x)
{
int Halt_Status = H(x, x);
if (Halt_Status)
HERE: goto HERE;
return Halt_Status;
}
int main()
{
H0(Infinite_Loop);
H0(Infinite_Recursion);
H0(DDD);
H(P,P);
}
Every C programmer that knows what an x86 emulator is knows that when H0 emulates the machine language of Infinite_Loop, Infinite_Recursion, and DDD that it must abort these emulations so that itself can terminate normally.
When this is construed as non-halting criteria then simulating termination analyzer H0 is correct to reject these inputs as non-halting by returning 0 to its caller.
It turns out that this same reasoning equally applies to H(P,P). It is impossible for the correctly emulated call to H(P,P) to return to P correctly emulated by H.
This same issue doesn't arise with the directly executed P(P) because the directly executed P(P) is essentially the first call in a recursive chain where the second call is always aborted.
If H(P,P) did not correctly recognize that it must abort the simulation of its input to correctly prevent its own non-termination the directly executed P(P) would never halt.
f
intoh
. Just write it again as a literal string. $\endgroup$