ふたつの無限とコンピュータの限界

0.999…=1であるとするような、無限が存在するという立場での無限を「実無限」いいます。
一方、0.999…<1であるとして、無限というのは伸びていく有限であるという立場での無限を「可能無限」といいます。


数学では、実無限の立場をとります。
たとえば数学的帰納法といって、P(0)が成り立って、P(k)が成り立つときP(k+1)が成り立つとすれば、すべてのP(n)が成り立つという証明法があります。
P(0)が成り立てばP(1)が成り立つ、P(1)が成り立てばP(2)が成り立つ、という手順を無限に繰り返すことですべてのP(n)が成り立つわけです。


コンピュータでは、可能無限の立場をとります。
チューリングマシンの非停止問題では、計算に無限の手順を必要とするなら、それは計算不可能だとみなします。
例えば↑の数学的帰納法の証明を

for(int n = 0; ; ++n){
   if(!P(n)) return false;//成り立たなかった。
}
return true;//成り立った。

というプログラムで実現するなら、この証明が成り立つ場合は計算不可能ということになります。
「無限ループが終わったとき」のプログラムは実行できません。


世の中は、無限が存在するという「実無限」の方が都合がいいようにできています。
無限は存在するのです。
ところがコンピュータでは無限は処理できません。
この、実在する無限を処理できないという制約が、ソフトウェアの問題の根本的な理由(の表現方法のひとつ)です。


実現不可能な仕様書には、こっそりと無限が含まれていることが多いものです。
仕様の中に無限が隠れていないか確認するようにすると、実現不可能な仕様書を減らすことができるかもしれません。