終端記号 、非終端記号 、開始記号 をもち、次の 3 つの生成規則からなる文脈自由文法 を考える。
文字列 は で生成される。この文字列の からの導出に対応する導出木(構文木)を描いたとき、その頂点の個数を求めよ。ただし、頂点は根と葉を含めたすべての頂点(非終端記号のラベルをもつ頂点と終端記号のラベルをもつ頂点)を数える。
文脈自由文法の導出と導出木
生成規則から開始記号 を書き換えて文字列を導出でき、最左導出と導出木(構文木)の対応を使って、与えられた文字列が文法で生成されるかを確かめ、小さな例で導出木を描ける
前提
中学までに習ったことだけで始められます。
説明
文脈自由文法とは、記号を書き換える規則の集まりで、文字列の集合(言語)を定めるものです。開始記号 から規則に従って書き換えを繰り返し、文字列を作る操作を導出といいます。この技能を使うと、ある文字列がその文法で作れるかを確かめられ、作り方を木の形(導出木)で表せるようになります。プログラミング言語の構文解析や、括弧の対応のような入れ子の構造を扱う場面で使います。
なぜそうしてよいのか
文法は次の 4 つで決まります。
(1) 終端記号:最終的な文字列に現れる文字( など小文字)。
(2) 非終端記号:まだ書き換える途中の記号( など大文字)。
(3) 生成規則: の形の規則。「非終端記号 を記号列 に置き換えてよい」という意味です。左辺が非終端記号 1 個だけなので、周りの記号(文脈)に関係なく置き換えられます。これが「文脈自由」という名前の由来です。 は と の 2 つの規則をまとめて書いたものです。長さ 0 の文字列(空文字列)は と書きます。
(4) 開始記号 。
記号列の中の非終端記号 1 個を、規則 1 つで置き換えることを 1 段の導出といい、 で表します。0 段以上の導出をまとめたものは で表します。 となり、 が終端記号だけでできているとき、「 は文法で生成される」といいます。生成される文字列すべての集合を、その文法の言語といいます。
同じ文字列でも、どの非終端記号から先に置き換えるかで導出の順番はいくつも考えられます。しかし「どの非終端記号を、どの規則で置き換えたか」だけを記録すると、導出は木の形になります。根を とし、規則 を使った節点 の下に子 を左から順に付けた木です。これを導出木(構文木)といいます。 を使ったときは、子として を 1 個付けます。葉を左から順に読むと、生成された文字列になります( の葉は読み飛ばします)。
導出木は置き換えの順番を忘れた記録です。そこで順番を「いつも最も左の非終端記号を置き換える」と決めます。こうした導出を最左導出といいます。最左導出は、木を根から左側優先でたどる順に節点を展開することに当たります。そのため、導出木 1 つに対して最左導出がちょうど 1 つ対応します。したがって「 が生成されるか」を調べるときは、最左導出だけを探せば十分です。このとき、置き換える場所を迷う必要はなく、迷うのは使う規則だけになります。
手順
文法を読み取る:終端記号・非終端記号・開始記号 と、各非終端記号の規則をすべて書き出す。
開始記号 から始め、今の記号列の中で最も左にある非終端記号を 1 つ選ぶ。
その非終端記号を左辺にもつ規則のうち、目標の文字列 と矛盾しないものを選んで置き換える(1 段で置き換えるのは 1 個だけ)。矛盾しないかは、記号列の左端に並んだ終端記号が の先頭と一致するかで判断する。規則に がない文法では、記号列の長さが を超えないかも確認する。
非終端記号がなくなるまで手順 2・3 を繰り返す。結果が に一致すれば であり、 は生成される。行き詰まったら前の段に戻って別の規則を試す。すべての可能性が失敗すれば、 は生成されない。
導出木を描く:根を とし、各段で置き換えた非終端記号の節点の下に、使った規則の右辺の記号を左から順に子として付ける。葉を左から読んで になることを確かめる。
例題
非終端記号を 、終端記号を 、開始記号を とし、生成規則を 、、 とする文法を考える。文字列 がこの文法で生成されることを最左導出で示し、その最左導出で生成規則を使う回数( の個数)を求めよ。
例題の解答
手順 1: の規則は だけです。 の規則は と 、 の規則は です。 の規則はないので、記号列の長さは を超えてはいけません。
手順 2・3(1 段目): を で置き換えて 。
2 段目:最も左の非終端記号は です。 を選ぶと になり、 は にしかならないので で終わってしまい、 に届きません。そこで を選び、 とします。左端の終端記号 は の先頭と一致し、長さは です。
3 段目:最も左の非終端記号は再び です。 を選ぶと で長さが になり、 を超えるので不可です。そこで を選び、 とします。
4 段目(手順 4):残る非終端記号 を で置き換えて 。非終端記号がなくなり、目標と一致しました。
まとめると、最左導出は
となり、 は生成されます。各段で選べる規則は 1 通りに決まったので、最左導出はこれ 1 つだけです。
手順 5(導出木):根 の子は左から です。その の子は左から で、下の の子は です。 の子は です。葉を左から読むと で、 になります。子をもつ節点(、上の 、下の 、)はちょうど 4 個です。これは導出の段数と一致しています。
よって、生成規則を使う回数は 回です。
答え:
よくある誤り
1 段で複数の非終端記号を同時に置き換えてしまう誤り(例: を 1 段と数える)。正しくは、1 段で置き換えるのは非終端記号 1 個だけで、 の 2 段になる。
最左導出と言いながら、左端でない非終端記号を先に置き換えてしまう誤り(例:)。正しくは、最左導出では必ず最も左の非終端記号から置き換えるので、 のように を先に展開する。
1 通り試して失敗しただけで「生成されない」と結論する誤り(例: となり にならないので生成されない、とする)。正しくは、各段で使える規則をすべて試す必要がある。 を選べば となる。
導出木で子の並び順を規則の右辺と変えたり、 の葉を文字として数えたりする誤り(例: の子を の順に描く)。正しくは、子は右辺の記号を左から順に並べ、葉を左から読むときは を読み飛ばす。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。
入口の問題
終端記号 、非終端記号 、開始記号 をもち、次の 4 つの生成規則からなる文脈自由文法 を考える。
文字列 は で生成される。開始記号 から を得る最左導出を書いたとき、生成規則を何回適用するか(導出のステップ数)を求めよ。
この技能を使う問題
終端記号 、非終端記号 、開始記号 をもち、次の 3 つの生成規則からなる文脈自由文法 を考える。
文字列
(長さ )について、 における の導出木(構文木)の個数を求めよ。終端記号 、非終端記号 、開始記号 をもち、次の 4 つの生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
文字列 について、 における の構文木(導出木)の個数を求めよ。ここで、構文木の個数は の最左導出の個数に等しい。非終端記号 (開始記号)、終端記号 をもつ文脈自由文法 の生成規則を
の 3 つとする( は空列)。ここで から終端記号列 への導出とは、文形式の列 ( は正の整数)であって、各 が の中の 1 つの を 1 つの生成規則の右辺で置き換えたものであるものをいう。2 つの導出は、文形式の列として異なるとき異なるものと数える。を 0 以上の整数とする。 から への導出の個数がちょうど であることを証明せよ。
終端記号 、非終端記号 、開始記号 をもち、次の生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
長さ の文字列 について、 を根とし葉を左から読むと になる の構文木(導出木)は何通りあるか。すなわち、 から への最左導出の個数を求めよ。終端記号 、非終端記号 、開始記号 をもち、次の生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
文字列 (長さ )について、 における の相異なる構文木(導出木)の個数を求めよ。なお、これは から への相異なる最左導出の個数に等しい。終端記号 、非終端記号 、開始記号 をもち、次の生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
文字列 ( を 個並べた文字列 )の、 における最左導出の個数を求めよ。
この技能の次に学べること
- CYK 法 (大学数学 オートマトン・形式言語)