Ex. 4.66
sum は rule と似たような感じで動作する。
(sum ?amount
(and (job ?x (computer programmer))
(salary ?x ?amount)))
の動作を考える
こんな感じでうまく動作する。
次に wheel の給料の合計を求めるために sum を変える。
(sum ?amount
(and (wheel ?x )
(salary ?x ?amount)))
これの動作を考えてみる。
こんな感じ。
前の問い 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 ... と同じ機能。