戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2014年 春期 午前203


問題文

次の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 に対応します。正しい導出順序で展開すると次の通りです。
  1. まず 〈A〉 を 〈A〉〈R_0〉 に展開して末尾に R0(ここでは "3" を選ぶ)を確保します。
  2. 次に左側の 〈A〉 を 〈B〉〈R_2〉 に展開して,左から2番目に R2 を置きます。
  3. さらにその 〈B〉 を 〈R_1〉 に展開して先頭に R1 を得ます。
  4. 各 〈R_i〉 を具体的な端末記号に置き換えれば,例えば 〈R_1〉→1, 〈R_2〉→2, 〈R_0〉→3 として「123」が得られます。
    以上で 〈A〉 ⇒* 1 2 3 となり,選択肢は生成されます。
(導出は左から順に拡張する左most展開で記述しました。導出の適用順序は上の通りで,前回指摘の誤りを修正した順序で示しています。)

解法ステップ

  1. 各記号群の端末集合を確認:〈R_0〉={0,3,6,9}, 〈R_1〉={1,4,7}, 〈R_2〉={2,5,8}。
  2. 問題の文字列の各桁がどの 〈R_i〉 に属するかを対応付ける(例: 123 → R1 R2 R0)。
  3. そのクラス列を得るために,文法規則でどの順序・どの非終端を展開すればよいかを考える。
    • 末尾が R0 なら〈A〉→〈A〉〈R_0〉を使うのが自然(末尾を固定)。
    • 残りを左側の 〈A〉 部分で作ればよい。
  4. 実際に導出を行い(上記「正解の理由」を参照)、端末記号に置き換えて照合する。
  5. 必要ならば同様の手順で他の候補も試し,生成可否を列挙する。

選択肢別の誤答解説

  • ア(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 に対応し,生成経路は存在します。
Q. 本問で唯一の正解はどれか?
A. 厳密に言うと,本問に与えられた4つの具体的文字列のうち「123」「124」「127」は〈A〉から生成可能で,「128」だけが生成不可です。したがって「128(エ)」が除外される一方で,ア・イ・ウは生成可能です(採点基準によっては注意が必要)。

関連キーワード: BNF、導出、再帰文法、左再帰、導出列挙
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について