SICP 4.4.3 Ex. 4.66

  • 投稿日:
  • カテゴリ:

Ex. 4.66

sum は rule と似たような感じで動作する。

(sum ?amount
     (and (job ?x (computer programmer))
          (salary ?x ?amount)))

の動作を考える

query5

こんな感じでうまく動作する。

次に wheel の給料の合計を求めるために sum を変える。

(sum ?amount
     (and (wheel ?x )
          (salary ?x ?amount)))

これの動作を考えてみる。 query6

こんな感じ。

前の問い Ex. 4.65 で見たように Oliver が wheel に4回ヒットするので、wheelの給料の合計が

Benの給料+Oliverの給料 × 4 = 660000

になってしまう。欲しい合計は

 Benの給料+Oliverの給料 = 210000

なので、これはまずい。

打開案は、Oliverさんの重複を取り除くような仕組みがあればよい。例えば

(sum ?amount
     (and (wheel ?x )
          (distinct ?x)
          (salary ?x ?amount)))

みたいな感じで、「(distinct ?x) はフレームストリームから ?x の重複を取り除く。」というような機能があればよい。

SQLの select distinct ... と同じ機能。