Skip to main content

Why the halting problem is unsolvable

Loading...
  • Imagine there is a function bool doesItHalt({function f, input i}) that returns if the parameter function f(i) halts or not.
  • Now consider the following functions:
pair duplicator(input i) {
return {i, i}
}

bool invertHalt(bool b) {
if(b) {
while(true); // hangs forever
return 0;
} else {
return 0;
}
}
  • Essentially, if f(i) halts, the invertHalt will hang (i.e., wouldn't halt), and if f(i) hangs, the invertHalt will halt.
  • Let us consider the composition of the two functions:
bool unknown(input i) {
auto a = duplicator(i) // a = {i, i}
auto b = doesItHalt(a) // does i(i) halt?
auto c = invertHalt(b) // hangs if i(i) halts and vice versa.
}
  • Will unknown(unknown) halt? What should doesItHalt({unknown, unknown}) return?
  • Let us suppose it will return true. Then, it means that doesItHalt({unknown, unknown}) returned false because invertHalt(b) would've hung otherwise. Therefore, this contradicts our supposition that doesItHalt({unknown, unknown}) returns true.
  • Let us suppose it will return false. Then, it means that doesItHalt({unknown, unknown}) would return true because invertHalt wouldn't hang otherwise. Therefore, this contradicts our supposition that doesItHalt({unknown, unknown}) returns false.
  • Therefore, unknown cannot hang nor halt; therefore, no such doesItHalt can exist.