オートマトン・形式言語の問題
終端記号 、非終端記号 、開始記号 をもつ、次の生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
文字列 の における構文木(導出木)の個数を求めよ。
この問題で使うもの
- 導出木の個数の数え上げ(説明と入口の問題)
- CYK 法(説明と入口の問題)
この問題を解けるようになるまで(3 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
から導出できる文字列がどんな形かを考え、部分文字列 ごとに構文木の個数を数えよう(CYK 法の表を、真偽ではなく個数で埋めるイメージ)。
ヒント 2
に対する構文木の個数を とすると、根で使う規則が か かで場合分けでき、 が成り立つ。 と、 または のときの値に注意しよう。
ヒント 3
, , , となる。ここから を計算しよう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
部分文字列ごとに数える(CYK 法の考え方) から導出できる文字列を調べる。 はそれぞれ だけを導出する。 は を、 は「 + から導出できる文字列」を、 は「 から導出できる文字列 + 」を作るので、 から導出できる文字列は ()の形に限られる。
そこで を「 に対する、根が の構文木の個数」とする( または のときは )。 を根で 2 つに分ける方法を規則ごとに見ると、
- :左が で 、右が で なので、 のときだけ使え、1 通り。
- :左の が先頭の を導出し、右の が を導出する。 通り。
- :右の が末尾の を導出し、左の が を導出する。 通り。
異なる規則や異なる分け方からは異なる構文木ができるので
となる。
表を埋める
例えば 、、、 である。
(CYK 表で見ると、 の部分文字列のうち を含むのは ()の形のものだけで、その各マスについて「分け方ごとの構文木の数の積の和」を求めたものが上の表になっている。)
よって の構文木の個数は である。
(別の見方:根から下へ、 で を 1 個、 で を 1 個ずつはがし、最後に で終わる。 を 2 回、 を 2 回はがす順番の数なので となり、一致する。)
別解
から導出できる文字列は ()の形だけである。 を から への構文木の個数とする。、 は一意なので、根の規則で場合分けする。
- :、すなわち のときだけ使え、1 通り。
- :先頭の が 、残りが から導出される。 のとき 通り。
- :末尾の が 、残りが から導出される。 のとき 通り。
よって 、それ以外は 。これは から へ右・上に進む格子経路の数で、。
表で確認する(行 、列 ):
、
、
。
検算:。 などの小さい場合 ( 型と 型、 の 2 通り)とも整合する。よって答えは 6。