問題4-64〜66

「4.4.2 質問システムはどう働くか」「4.4.3 論理型プログラミングは数学的論理か」というトピックを何度か読みましたが、いまいち理解が深まっていません。次のトピックである質問システムの実装の部分を読み進めながら、このあたりにも戻ってこようと思っています。
問題4-64。再帰的に質問が定義されているoutranked-by規則をLouisのように書き替えた場合、無限ループに陥ってしまうそうです。変更された箇所は、最後のand条件で指定している二つの質問を並べる順番ですが、Louisのそれは、再帰的な質問を先に持ってきています。こうしてしまうと、and条件の最初に(supervisor ?staff-person ?middle-manager)を持ってくれば、(Louisが問いかけた質問の場合)?staff-personは決まっているので、?middle-managerも決めることができ、その上で、(outranked-by ?middle-manager ?boss)と問いかけても、無限ループに陥ることなく、?bossを特定することができます。
しかし、逆の場合だと、?middle-managerも?bossも特定の値に束縛されないまま、処理が走ってしまうため、無限ループに陥ってしまうのでは考えられます。
問題4-65。(wheel ?who)と問いかけると、重複した答えが返ってきてしまうらしいのですが、その理由について考察してみます。wheel規則は、本文で、

(rule (wheel ?person)
      (and (supervisor ?middle-manager ?person)
           (supervisor ?x ?middle-manager)))

と定義されています。?personに特定の人物を束縛してやれば、一件の値が返ってくるか、何も答えが返ってこない(エラーが返ってくる?)かのどちらかですが、?personを特定してやらない場合、まず、全ての表明(データベースのレコード)がand条件の最初の質問でパターンマッチングされます。次に、?middle-managerが特定の人に束縛された上で、もう一つのand条件でのパターンマッチングが行なわれます。?xと?personの組み合わせ的には重複になっていなくても、最後に印字されるのは?personだけですから、Cyが悩んでいるような、?personが重複して表示されてしまうという現象が起こってしまいます。
問題4-66。なぜこれでダメなのかが、いまいちはっきりとしていません。前の問題で悩んだCyが助言しているところを見ると、これでは上手くフィルタリングできず、全ての人の給与に対してaccumulation-functionされてしまうんだろうなと考えられますが、自分にはフィルタリングされたストリームが返ってきて、しっかりとmapされているように見えるので、どこかで問題を読み間違えている(sumなどのfunctionの使い方)のかもしれません。