オートマトン・形式言語の問題
終端記号 、非終端記号 、開始記号 をもち、次の生成規則からなるチョムスキー標準形の文脈自由文法 を考える。
長さ の文字列 について、 を根とし葉を左から読むと になる の構文木(導出木)は何通りあるか。すなわち、 から への最左導出の個数を求めよ。
この問題で使うもの
- 導出木の個数の数え上げ(説明と入口の問題)
- CYK 法(説明と入口の問題)
- 文脈自由文法の導出と導出木(説明と入口の問題)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
CYK 法の表の各マスに、非終端記号だけでなく「その記号を根とする構文木の個数」を書き込むことを考えましょう。
ヒント 2
部分文字列 について、 は のときだけ、 は先頭の を切り離す分割、 は末尾の を切り離す分割だけが使えます。( を代入)という漸化式が得られます。
ヒント 3
、、、、、 です。あとは を計算しましょう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
方針:CYK 法の表に「個数」を記録する。
CYK 法では、 の各部分文字列について、それを導出できる非終端記号を表に書き込む。ここでは記号だけでなく、その記号を根とする構文木の個数も記録する。構文木と最左導出は 1 対 1 に対応するので、 を根とする の構文木の個数を数えればよい。
の部分文字列のうち または 以外の非終端記号が導出しうるのは ()の形のものだけである( の後に が来る部分文字列は、どの規則の右辺も「 側の記号が左、 側の記号が右」なので導出できない)。そこで部分文字列 から , を根とする構文木の個数を , と書く。
分割の考え方. 長さ 以上の部分文字列を左右 2 つに分けるとき、
- :左が (1 文字 )、右が (1 文字 )なので、 のときだけ 通り。
- :左が先頭の 1 文字、右の を が導出する。 は から始まるので を 1 個以上含む必要があり、 のときだけ 通り。
- :右が末尾の 1 文字、左の を が導出するので 通り( が必要)。
- :同様に 。
よって
( は のとき 、それ以外は 。定義されない項は とする)。
表を短い部分文字列から埋める.
- ()。
- ()。()であることも同様にわかる。
-
-
-
-
-
-
したがって の構文木は 通りである。
確認. 構文木は、中心の ()から始めて「外側に を付ける操作()」と「右に を付ける操作()」を順に施したものとみなせる。 では前者が 回、後者が 回で、その並べ方は 通りとなり一致する。
答え:
別解
文字列 を から導出する構文木の数を 、 から導出する構文木の数を とおく。 はともに空列を導出しないので、 でなければ 、 とする。また生成規則から導出される文字列はすべて の形である。
より 。
の各規則について考える。
- は のときだけ使え、寄与は 。
- の寄与は 。
- の寄与は 。
よって次の漸化式を得る。
のとき、 であり、 では なので 。
のとき、、、、、。
のとき、、、、、。
したがって の構文木は 通りである。
検算として、 を何回使うかで場合分けする。この文法の構文木は、根から を繰り返し使い、最後に か に至る構造をしており、 を 1 つ消費するたびに が 1 つ対応づけられる。 が 3 個、 が 5 個のとき、 ごとの の置き方の数え上げは漸化式の結果と一致する。
文法が構文木ごとに異なる最左導出を与えるので、最左導出の個数も である。