コンパイラ – 原理と構造 初版 – 練習問題の解答例
コンパイラ – 原理と構造 初版 – 練習問題の解答例

第 1 章 計算とプログラミング言語

1.5 練習問題

問 1.1

Σをアルファベットとする言語の要素(文)は,Σの要素 の有限の並びである. この言語(文の集合)をΣ*と書くことにする.

  1. 1.

    Σ*は可算無限集合,すなわち,自然数の集合と1対1対応がある集合であることを Σ*の要素に通し番号をつけることによって示せ.

  2. 2.

    このことから,自然数から自然数への関数に限っても,コンピュータ・ プログラムで表現できないものが存在することを確認せよ.

  3. 3.

    有理数係数の代数方程式の解として表される実数を代数的数と呼ぶ. 有理数係数の代数方程式は,Σを適当に取れば,Σ*の要素 で表現できることを確認せよ. このことから,非代数的数(代数的数ではない数) は無限に存在することを示せ.

解答例  本問の主旨は,集合や数の性質の分析ではなく,第1章の主旨である記 号Σによる情報の表現の原理と限界を理解することである. そこで,以下数学的な性質などを極力避け,Σによる情報の表現の観点 から具体的な分析を行う.

  1. 1.

    以下の方針でΣ*の要素に0から始まる通し番号をつけることができる.

    1. (a)

      Σ*={Σk|k0}であり, klならΣkΣk=であるから, Σ*は,{Σk|k0}に分割できる.

    2. (b)

      Σの要素数をnとし,Σ={a0,,an-1}とする. Σkの要素数はnkである. このnk個の各要素を,a0からan-1n個の数字とする k桁のn進数表現と見做すことにより, 0からnk-1の数を一意に割り当てることができる. ただし,ϵΣ0には0を割り当てる. この要素wΣkに割り当てられた数をnum(w)と書く.

    3. (c)

      Σ0Σ1Σk-1の要素数は 1+n1++nk-1=nk-1n-1である. Σ*の要素wに対して, wΣkに属するなら, その通し番号をnum(w)+nk-1n-1とする.

    例えばΣ={0,1}の場合の通し番号のいくつかを以下に示す.

    wΣ* ϵ 0 1 00 01 10 11 000 001
    通し番号 0 1 2 3 4 5 6 7 8

    実際,001Σ3の通し番号は,num(001)=1であるから1+23-12-1=8である. この通し番号は連続しており,重なりがないから, Σ*は自然数の集合と1対1に対応することがわかる.

  2. 2.

    自然数から自然数への関数全体の集合は数え上げることができない(非可算である). (もし数え上げ系列{f0,f1,,fn,}が存在するとすると, この系列の何処にも出てこない関数 f(n)=fn(n)+1が定義できてしまい,矛盾してしまう.(対角線論法)) 一方,プログラムはΣ*の要素であるから,項目1の通し番号の若い順に 通し番号をつけることができる. したがって,自然数から自然数への関数全体の集合には,プログラムでは表現できない 関数が存在する. 非可算集合から可算集合を取り除いた要素が有限であれば,非可算集合は数え上げることが できてしまうので,プログラムでは表現できない関数は無限に存在する.

  3. 3.

    有理数係数の代数方程式は,有限の記号(数字,変数名,プラス・マイ ナス記号,等号等)で書かれたものであるから,これらの方程式を書き下すために必要な 記号をΣと取れば,個々の方程式はΣ*の要素である. 項目1から,すべての有理数係数の代数方程式の集合は可算無限である. 一つの方程式の解は高々有限個であるため,有理数係数の代数方程式の解の集合 は,有限の要素をもつ可算無限個の集合の和集合である. この和集合の要素は,それが属する集合の順に数え上げることができる ため,可算無限である. 従って,有理数係数の代数方程式で表しうる実数の集合は,この可算無 限集合の部分集合であり,可算である. 一方,実数の集合は非可算である(項目2と同様に,対角線論法で示すことができる). 以上から,実数の集合には,有理数係数の代数方程式で表し得ない数が無限に存在する.

    (注釈)教科書の初版では,「代数方程式」を「連立方程式」としているが,正誤表の通り, 代数的数の定義は「有理数係数の(一変数の)代数方程式の解と表される数」である. ただし,本問の主旨は,代数的数の集合が可算であることは,代数的数の性質等によらず,

    「記号で表現できる式はΣ*の要素であり,従ってそのような式全体の集 合は可算である」

    という性質のみをつかって導かれる性質であることを理解する ことである. 従ってこの議論は,記号で表記できる有限個の解をもつ「方程式」で表現可能な数と 一般化しても,問題なく成立する.