オートマトン・形式言語の問題
終端記号 、非終端記号 、開始記号 をもち、次の 3 つの生成規則からなる文脈自由文法 を考える。
文字列
(長さ )について、 における の導出木(構文木)の個数を求めよ。
この問題で使うもの
- 文脈自由文法の導出と導出木(説明と入口の問題)
- 導出木の個数の数え上げ(説明と入口の問題)
この問題を解けるようになるまで(3 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
を開き括弧、 を閉じ括弧と見ると、 は対応のとれた括弧列を生成する文法である。 を「これ以上切れないまとまり」に分けてみよう。
ヒント 2
個のまとまりの並びを で作る方法は、葉が 個の全二分木の個数であるカタラン数 通りある。また、両端の が対応しているまとまりは でしか作れない。
ヒント 3
と分かれる。外側の分け方は 通りで、 の内側の についても同じように数えよう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
を開き括弧、 を閉じ括弧とみなすと、 が生成する言語 は「空でない、括弧の対応がとれた文字列」全体である。
準備: 分解できない文字列
の文字列 のうち、どの真の接頭辞(空でも 全体でもない接頭辞)も と の個数が等しくならないものを「素な文字列」とよぶ。
- 素な文字列 に を最初に使うことはできない。 から ()と分けると、 は の個数が等しい真の接頭辞になってしまうからである。したがって の導出木の根では ( のとき)か が使われる。 は空文字列を生成しないので、 のときは だけが使え、 のときは だけが使える。
- 素でない文字列は、 の個数が等しくなる位置で切ると、素な文字列の並び ()にただ 1 通りに分解される。このとき や は根に使えない(両端が の 1 組に対応しないため)ので、根からは を繰り返して 個の に分け、それぞれが を導出する。 による分け方の個数は、葉が 個の全二分木の個数、すなわちカタラン数 である。
の分解
を左から読み、( の個数) ( の個数) を記録すると
となり、 になる位置で区切ると
と 個の素な文字列に分かれる。よって、この 4 つへの による分け方は 通りである。
各部分の導出木
- の導出木は の 通り。
- は素なので、根は で、内側の が を導出する。 は 個の素な文字列に分かれ、それぞれの導出木は 通りなので、 の導出木は 通り。よって の導出木は 通り。
まとめ
導出木の個数は、外側の分け方と各部分の導出木の個数の積なので
である。
答え:
別解
で を 、 を とすると累積和は で、各接頭辞で 0 以上、最後に 0 となるのでダイク語(括弧列)である。0 に戻る位置は 8, 10, 12, 14 なので、既約な成分に分けると
の導出木の数を で表す。
(1) 既約成分 について: 規則 は既約語の導出の根には使えない(既約語を 2 つの空でない文字列に分けるとどちらもダイク語にならない)。よって根は ( が空のとき、)か ( が空でないとき、)。
(2) 既約成分が 個の語 ()について: 根は でなければならない。これは 個の成分を二分木状に括る方法に対応し、括り方は 番目のカタラン数 通り、各成分の導出木は独立なので
( のときは (1)。)
計算:
- 成分 : 。
- 成分 : 内側 は成分 3 個で各 、。よって 。
- 全体: 成分 4 個、、積は 。
検算: ( と )、 で、小さい例 、 とも整合する。