26.2.1 問題の分割

「問題」はすぐには解決できません.それでその「問題」を,「それよりは解決しやすそうな部分問題」に分割することを考えましょう.ピザの問題の場合,たとえば次のように分割します.

  1. (自宅で食べたいので)宅配ピザ店の電話番号を探す.
  2. 電話でピザ店に注文する.
  3. 届いたピザを料金を払って受け取る.

分割によって得られたものを部分問題(subproblems),あるいは解決すべき目標という意味で部分目標(subgoals)と呼びます.

多くの場合,部分問題自体もそのままではすぐには解決できません.「ピザ店の電話番号を探す」にしても,職業別電話帳から探す,新聞にチラシが入ってないかどうか探す,あるいは友人に教えてもらう,というような「解決」がさらに必要です.このように「問題-部分問題」構造は何段にも多重になります.もちろん個々の「部分問題」はより細かく,単純なものになってゆきます.そして,「もうそれ以上の分割をしないでも解決できる」という段階まで到達したら,それ以上は細かくせずに済みます.そして,分割された部分問題のすべてについてこの状態になった時点で,もとの問題に対する「解決法」が得られ,「問題解決」の手順記述が終了したことになります.

ここでは「ピザを食べたい」という問題を解決するための手順,すなわち「ピザを食べるためのプログラム」を作ってみました.このような作業をプログラミング(progamming)と呼びます.