応用情報技術者 2014年 春期 午前2 問03
問題文
次のBNFにおいて非終端記号〈A〉から生成される文字列はどれか。
〈〉 ::=0.3|6|9
〈〉 ::=1|4|7
〈〉 ::=2|5|8
〈〉 ::=〈〉|〈〉〈〉|〈〉〈〉|〈〉〈〉
〈〉 ::=〈〉|〈〉〈〉|〈〉〈〉|〈〉〈〉
〈〉 ::=〈〉|〈〉〈〉|〈〉〈〉|〈〉〈〉
選択肢
ア:123(正解)
イ:124
ウ:127
エ:128
🔒 解説は解答すると表示されます
BNF導出の手順【午前2解説】
正解の理由
選択肢アの文字列「123」は、非終端記号〈A〉から生成可能です。具体的には,右端に属する記号群がそれぞれ
〈R_1〉 → {1,4,7}, 〈R_2〉 → {2,5,8}, 〈R_0〉 → {0,3,6,9}
であることに着目すると,望む並び 1(R1) 2(R2) 3(R0)はクラス列として R1 R2 R0 に対応します。正しい導出順序で展開すると次の通りです。
- まず 〈A〉 を 〈A〉〈R_0〉 に展開して末尾に R0(ここでは "3" を選ぶ)を確保します。
- 次に左側の 〈A〉 を 〈B〉〈R_2〉 に展開して,左から2番目に R2 を置きます。
- さらにその 〈B〉 を 〈R_1〉 に展開して先頭に R1 を得ます。
- 各 〈R_i〉 を具体的な端末記号に置き換えれば,例えば 〈R_1〉→1, 〈R_2〉→2, 〈R_0〉→3 として「123」が得られます。
以上で 〈A〉 ⇒* 1 2 3 となり,選択肢アは生成されます。
(導出は左から順に拡張する左most展開で記述しました。導出の適用順序は上の通りで,前回指摘の誤りを修正した順序で示しています。)
解法ステップ
- 各記号群の端末集合を確認:〈R_0〉={0,3,6,9}, 〈R_1〉={1,4,7}, 〈R_2〉={2,5,8}。
- 問題の文字列の各桁がどの 〈R_i〉 に属するかを対応付ける(例: 123 → R1 R2 R0)。
- そのクラス列を得るために,文法規則でどの順序・どの非終端を展開すればよいかを考える。
- 末尾が R0 なら〈A〉→〈A〉〈R_0〉を使うのが自然(末尾を固定)。
- 残りを左側の 〈A〉 部分で作ればよい。
- 実際に導出を行い(上記「正解の理由」を参照)、端末記号に置き換えて照合する。
- 必要ならば同様の手順で他の候補も試し,生成可否を列挙する。
選択肢別の誤答解説
-
ア(123)
先に示した通り生成可能。導出の順序は と進めます。 -
イ(124)・ウ(127)
どちらもクラス列としては R1 R2 R1 に対応します。これらは次のように生成できます:
あとは各 〈R_i〉 を具体的に選べば(先頭の R1→1, 中央の R2→2, 終端の R1→4 または 7 等)「124」や「127」が得られます。したがってこれらも〈A〉から生成可能です。 -
エ(128)
クラス列は R1 R2 R2 になりますが,上で列挙した長さ3の可能なクラス列(下節参照)には R1 R2 R2 が含まれません。総当たりで導出パターンを調べると,〈A〉から長さ3の文字列として生成できるクラス列は次の9通りに限られます:- A→A R0 系: R0 R0 R0、R1 R2 R0、R2 R1 R0
- A→B R2 系: R0 R1 R2、R1 R0 R2、R2 R2 R2
- A→C R1 系: R0 R2 R1、R1 R2 R1、R2 R0 R1
上記に R1 R2 R2(= 1 2 8)は含まれないため,128 は〈A〉から生成できません。
(まとめ)精査すると,ア・イ・ウ は生成可能で,エのみ不可です。問題文の選択肢設計や採点基準により「唯一の正解」とされる場合があるため,答えの扱いに注意が必要です。
よくある誤解
- 導出の適用順序を雑に書く(前回の誤り)。例えば「〈A〉→〈B〉〈R_2〉の形で…さらに〈A〉が '3' を生成」といった順序逆転は誤りです。正しい導出順序を左から順に(または右から順に)明確に書くこと。
- 〈R_i〉 を単一の記号と見なして交互作用を無視する。〈R_0〉等は複数の端末を含み,「どの具体的端末を選べるか」を意識すること。
- 「非終端記号の名前=最後に出るクラス」と誤解すること。文法は相互再帰しており,非終端の展開によって最後のクラスは変わり得ます。
補足コラム
短い文字列(ここでは長さ3)については,生成可能なクラス列を系統的に列挙すると誤答を防げます。今回のように左辺が複数の非終端を結合する文法では,「最初の一手で末尾を決める」戦術(末尾を固定する規則を使う)と「残りを短い部分問題として解く」戦術が有効です。
また,この文法は再帰を含むので「同じ文字列に複数の導出が存在する(曖昧文法)」である点にも注意してください。試験対策としては「与えられた文字列が生成可能か」を判定する実践的な演習を繰り返すのが近道です。
簡単な検証スクリプト(深さ制限付き幅優先探索)を示します(実装例):
# 深さ制限付きの単純な導出探索(擬似実装)
rules = {
'A': [['R0'], ['A','R0'], ['B','R2'], ['C','R1']],
'B': [['R1'], ['A','R1'], ['B','R0'], ['C','R2']],
'C': [['R2'], ['A','R2'], ['B','R2'], ['C','R0']],
'R0': [['0'],['3'],['6'],['9']],
'R1': [['1'],['4'],['7']],
'R2': [['2'],['5'],['8']],
}
# 幅優先で導出列を展開し,目標文字列が得られるかを判定することができます。
FAQ
Q. 同じ文字列を別ルートで導出できるか?
A. はい。文法は相互再帰を含み,曖昧性が生じ得ます。例として「124」「127」は同じクラス列 R1 R2 R1 に対応し,生成経路は存在します。
A. はい。文法は相互再帰を含み,曖昧性が生じ得ます。例として「124」「127」は同じクラス列 R1 R2 R1 に対応し,生成経路は存在します。
Q. 本問で唯一の正解はどれか?
A. 厳密に言うと,本問に与えられた4つの具体的文字列のうち「123」「124」「127」は〈A〉から生成可能で,「128」だけが生成不可です。したがって「128(エ)」が除外される一方で,ア・イ・ウは生成可能です(採点基準によっては注意が必要)。
A. 厳密に言うと,本問に与えられた4つの具体的文字列のうち「123」「124」「127」は〈A〉から生成可能で,「128」だけが生成不可です。したがって「128(エ)」が除外される一方で,ア・イ・ウは生成可能です(採点基準によっては注意が必要)。
関連キーワード: BNF、導出、再帰文法、左再帰、導出列挙

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

