オートマトン・形式言語の問題
終端記号 、非終端記号 、開始記号 をもち、次の 3 つの生成規則からなる文脈自由文法 を考える。
文字列 は で生成される。この文字列の からの導出に対応する導出木(構文木)を描いたとき、その頂点の個数を求めよ。ただし、頂点は根と葉を含めたすべての頂点(非終端記号のラベルをもつ頂点と終端記号のラベルをもつ頂点)を数える。
この問題で使うもの
- 文脈自由文法の導出と導出木(説明と入口の問題)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
「文脈自由文法の導出と導出木」を使う。まず開始記号 から を導出し、その導出を木の形に描こう。
ヒント 2
規則を 1 回使うごとに、書き換えた の頂点の下に右辺の記号を子として並べる。 や では子が 3 個、 では子が 1 個できる。
ヒント 3
導出は となる。あとは根と、各段階で増えた子を数え上げればよい。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
手順1:導出を作る。
生成規則は を「両端に同じ文字をつけた形」か に書き換えるので、文字列 を外側から順に見ていく。
- 両端が と なので、まず を使う。
- 残りの中央 の両端は と なので を使う。
- さらに残りの中央 の両端も なので を使う。
- 最後に残った中央 は で作る。
したがって導出は
となる。各段階で非終端記号は が 1 つだけなので、これはそのまま最左導出でもある。
手順2:導出木を描く。
生成規則を 1 回使うごとに、書き換えた の頂点の下に右辺の記号を子として左から順に並べる。
- 根 の子:(3 個)
- その中央の の子:(3 個)
- その中央の の子:(3 個)
- その中央の の子:(1 個)
葉を左から読むと となり、確かに になる。
手順3:頂点を数える。
根の 個に、各規則の適用で増えた子の個数を加えると
(確認: のラベルの頂点が 個、終端記号の葉が文字列の長さと同じ 個で、。)
よって頂点の個数は である。
別解
文字列 は長さ 7 で、、、、 の順に導出される。
導出:。
この文法は曖昧でなく、各文字列の導出木は一意に定まる。
頂点の数え方:
- 非終端記号 の頂点は、規則を 4 回適用するので 4 個。
- 葉(終端記号)は、文字列の長さと同じ 7 個。
内訳の確認:
- は子が 3 個(、、)。
- も子が 3 個。
- は子が 1 個。
頂点は 4 個、終端記号の頂点は 7 個なので、合計は 。
検算:根以外の頂点数は子の総数に等しい。子の総数は 。根を加えて 。
ε を表す頂点はなく、この文法には ε 規則もない。