Haltはなぜ計算不可能なのか?

数式がHTMLではうまく書けないので、文章で説明することにする。
まず、関数fが計算可能とは、あるプログラムUが存在して、そのプログラムに任意の入力xを与えた場合、停止して結果が、f(x)であるようなものである。
簡単な例でいえば2倍するような関数はxを2とすればf(x)は4である。つまりこの4というものを、停止して結果をちゃんと返すプログラムが書けるかどうかというものである。
さて、Haltは2変数関数で、Halt(a,x)と書く、aはプログラム、xはそのプログラムへの入力である。この関数は1を返せば、計算が停止し、0を返せば停止しない関数であるとする。
この証明として、入力a、xをもつプログラムUを仮定し、この結果がHalt(a,x)であればよい。
さて、ここで対角線論法を使う。あるプログラムXがある。引数は一つとする。この中でUの引数をいずれもプログラムXの引数とする。Uが1を返した場合は無限ループに入り、0を返した場合は1を返すとする。
さて、このプログラムXの引数にプログラムX自身を代入する。つまりUはプログラムXがプログラムXを引数でとった場合に停止するかどうかという判定を行う。(つまり無限回をあらわしている)停止するとすると、Uは1を返すが、1は無限ループに入ってしまう。またUが0を返すと、Xは1を返す。となると、Halt(X、X)は1でなければならないから、矛盾する。
なお、tステップ以内に終わるかどうかというHaltInTimeという関数は計算可能である。
これは、tを1ずつ増やしながら、tステップ以内で停止できるかどうかをチェックし、停止できれば停止したという値を返せばよい。