数学ガール/計算可能性解析学

 「微妙だ」とミルカさんが言った。
 僕たちの前のカードには、こう書いてある。

[a,b]を計算可能な閉区間f:[a,b]\rightarrow\mathbb{R}を計算可能関数とする。このとき、f(a)f(b)の間にある任意の計算可能実数dに対して、ある計算可能実数c\in[a,b]が存在して、f(c)=dが成り立つ。

 「微妙?」テトラちゃんがカードを見つめながら言った。僕も、どこが微妙なのかわからない。カードには、定理が明瞭に書いてあるだけだ。
 「証明してみれば見えてくる。とりあえず、証明してみよう。中間値の定理のよく知られた証明をひねるだけでできる」と言ってミルカさんは僕のほうを見た。証明しろということらしい。
 「一般性を失うことなく、[a,b]=[0,1], f(a)<0, f(b)>0, d=0と仮定できる」
 僕はカードの下のほうに書き足した。

f:[0,1]\rightarrow\mathbb{R}を計算可能関数で、f(0)<0f(1)>0をみたすものとする。このとき、ある計算可能実数c\in[0,1]が存在して、f(c)=0が成り立つ。

(ここに、「一般性を失うことなく……仮定できる」の説明を入れるといいかも)
 僕は続けた。
 「あるm/2^n\in[0,1](ただし、mnは正整数)が f(m/2^n)=0 をみたすときは、cとしてm/2^nをとるとよい。そこで、そのようなmnが存在しない場合を考える。数列\{a_n\}\{b_n\}をこう定義する」
 a_0=0,\quad b_0=1.
 f((a_n+b_n)/2)<0のとき、a_{n+1}=(a_n+b_n)/2,\quad b_{n+1}=b_n.
 f((a_n+b_n)/2)>0のとき、a_{n+1}=a_n,\quad b_{n+1}=(a_n+b_n)/2.
 「区間縮小法より、\{a_n\}\{b_n\}は共通の極限値cをもつ。各nについてf(a_n)<0だから、f(c)\le0が成り立つ。同じくf(b_n)>0だから、f(c)\ge0が成り立つ。したがって、f(c)=0が成り立つ。ここまでで、非計算版の証明終わり」
 この後はミルカさんが引き継いだ。
 「あとは、この証明で出てくるcの計算可能性を確かめれば良い。あるmnf(m/2^n)=0が成り立ち、c=m/2^nとおいたときについては、有理数は計算可能実数である事実からOK。そのようなmnが存在せず、区間縮小法でcを構成したときについては、要するに、\{a_n\}\{b_n\}を順番に出力するアルゴリズムを書き下せば良い訳だ。きちんと書き下すと長くなるが」
(ここで、実際に書き下すと良いかも)
 「中間値dを与えるcは計算できるんですね」とテトラちゃんが言った。
 ミルカさんの返事は意外だった。
 「それは違う。計算可能なfと計算可能なdに対して計算可能なcが存在することを示しただけだ。fdからcを計算できることは示していない」
 「え、でも、証明ではfdからcを構成していますよね」
 「まだ、気づかないかな」
 「……」
 「あるm/2^nf(m/2^n)=0であるか、そのようなm/2^nは存在しないかは、実効的に判定できない」
 「あ、ああああああああっ!」
 テトラちゃんが大きな声を上げる。だから、ここは図書室だというのに。でも、叫びたくなる気持ちはよくわかる。
 ミルカさんは詠唱するように言う。
 「この証明は、計算可能な対象の存在を示しているが、それを計算する手続きは与えていない。実は、この証明がまずいのではなく、そのような手続きは本当に存在しないことがわかっている。この定理は本当に微妙なんだ」
 「計算可能なものがあることは証明できるのに、それを計算する手続きはない。お、おかしい!」
 テトラちゃんはまだ混乱している。
(このあと、どうしよう?)