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

データベーススペシャリスト 2022年 午前204


問題文

関係R(A, B, C, D, E)に対し、関数従属の集合 W={A→{B, C}、{A, D}→E, {A, C, D}→E, B→C, C→B}がある。関数従属の集合X, Y, Zのうち、Wから冗長な関数従属をなくしたものはどれか。
X = {A→B, B→C, C→B, {A, D} →E} Y = {A→C, B→C, C→B, {A, D} →E} Z = {A→B, C→B, {A, C, D} →E}

選択肢

Xだけ
XとY(正解)
YとZ
Zだけ

🔒 解説は解答すると表示されます

関数従属の最小被覆【午前2解説】

正解の理由

与えられた関数従属集合 W を単項右辺に分解し、左辺の不要属性を取り除き、さらに他の従属から導出可能な冗長な従属を消すと、最小被覆として得られる候補は次の二通りになります。
  • A→B, B→C, C→B, {A,D}→E (これが X)
  • A→C, B→C, C→B, {A,D}→E (これが Y)
したがって選択肢のうち正しいのは X と Y を含むもの、すなわち です。ポイントは A→C が A→B と B→C から導出可能であれば冗長となるが、A→B を外して A→C を残す別の最小被覆を作ることも可能であり、最小被覆は一意ではない、という点です。

解法ステップ

  1. W を単項右辺に分解する。
    • A→{B,C} を A→B, A→C に分解。
    • 他は既に単項右辺({A,D}→E, {A,C,D}→E, B→C, C→B)。
    • 結果: A→B, A→C, {A,D}→E, {A,C,D}→E, B→C, C→B。
  2. 左辺の最小化(各従属の左辺属性が不要か検査)。
    • {A,C,D}→E は左辺の A,D だけで十分かを確認。{A,D}→E が既にあるため {A,C,D}→E は冗長(左辺を減らしても別に {A,D}→E がある)で削除可能。
    • {A,D}→E の左辺の A または D を外せない(単独では E を導けない)のでそのまま。
  3. 従属そのものの冗長性検査(ある従属が他の従属から導出可能か)。
    • A→C は A→B と B→C があるとき、A→B と B→C より A→C が導出可能:A→B, B→C ⇒ A→C。従って A→C は冗長となる(ただし A→B を削除した場合は話が変わる)。
    • {A,C,D}→E は {A,D}→E があれば冗長(部分集合左辺が存在するため)なので削除。
    • B→C と C→B は互いに独立に必要(どちらか一方から他方は導けない)。
  4. 得られる最小被覆の候補
    • X: A→B, B→C, C→B, {A,D}→E(上記操作で得られる標準的な最小被覆)
    • 別の等価な最小被覆として Y: A→C, B→C, C→B, {A,D}→E(A→B を削除し A→C を残すことで成立)
    • Z は {A,C,D}→E を残し B→C を削除しているなどで W の冗長除去として適切でない
以上から、W の冗長を取り除いたものとして成立するのは X と Y であり、選択肢としては が正しい。

選択肢別の誤答解説

  • ア: Xだけ
    • X は正しい最小被覆だが、Y も W から冗長を取り除いた別の等価な最小被覆であるため「Xだけ」は誤り。
  • イ: XとY
    • 正しい。前述の通り X と Y はどちらも W と同じ意味(同じ閉包)を保ちながら冗長性を除去した最小被覆である。
  • ウ: YとZ
    • Y は正しいが Z は不適切。Z は {A,C,D}→E のように左辺が冗長な従属を残しており、また B→C を欠いているため W の冗長除去の結果として妥当でない。
  • エ: Zだけ
    • 間違い。Z は既に述べたように W からの冗長除去として正しくない(部分左辺の冗長を除去しておらず、元の依存を保持していない)。

よくある誤解

  • 「最小被覆は一意である」
    • 誤り。最小被覆は一意とは限らず、同値な(同じ閉包を持つ)複数の最小被覆が存在することがある(本問の X と Y がその例)。
  • 「右辺を単項にすればそれで終わり」
    • 右辺を単項にするのは第一段階だが、その後に左辺の不要属性除去と、従属自体が他から導出可能かのチェックを必ず行う必要がある。

補足コラム

最小被覆(最小カバー、minimal cover)を求める標準アルゴリズムの流れは次の3段階です。
  1. 右辺を単項に分解(A→BC を A→B, A→C に分解)。
  2. 各従属について左辺の各属性が不要か検査して取り除く(属性 X を外しても右辺が導出可能かを closure で確認)。
  3. 従属自体が他の従属から導出可能か(冗長か)を検査し、導出可能なら削除する。
重要なのは「導出可能か」の判定に閉包(ある属性集合の属性閉包)を使う点です。たとえば属性集合 の閉包 を現在の従属集合(検査対象の従属を除いた集合)で計算し、閉包に目的の右辺が含まれればその従属は冗長です。

FAQ

Q: A→C が A→B と B→C から導出可能なら常に A→C を削除してよいですか?
A: W の中に A→B と B→C の両方が含まれている限りは A→C を削除して差し支えありません。しかし「最小被覆は一意でない」ため、別の等価な最小被覆では A→B を削除して A→C を残すこともあります。
Q: なぜ {A,C,D}→E は {A,D}→E があると冗長なのですか?
A: 左辺が部分集合になっている従属が存在する場合、より大きな左辺を持つ従属は同じ結果を与えるなら不要です。{A,D} が {A,C,D} の部分集合で、{A,D}→E があれば {A,C,D}→E は常に導出可能(冗長)です。
Q: 最小被覆を求める際に注意すべき点は?
A: 手順を順番どおりに行うこと(右辺単項化→左辺削除→従属削除)。順序や途中での削除判断を誤ると誤った被覆に至ることがあります。

関連キーワード: 関数従属、最小被覆、属性閉包、冗長性除去、部分関数従属
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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