(defvar *verbose* nil) (defun rule-demo1 (&optional *verbose*) (set-up-rules 'c+q '((rule1 (?x is a woman) ==> (?x is human)) (rule2 (?x is a man) ==> (?x is human)) (rule3 (?x is human) ==> (?x is a carnivore)) (rule4 (?x is human) (?x eats meat) ==> (?x is a carnivore)) (rule5 (?x is human) (?x eats vegetables) ==> (?x is a vegetarian)) (rule6 (?x is a carnivore) ==> (?x is a living-thing)) (rule7 (?x is a vegetarian) ==> (?x is a living-thing)))) (setf *wmcq* '((queen-elizabeth is a woman) (dad is a man) (queen-elizabeth eats meat) (dad eats vegetables))) (ps 'c+q *wmcq* '(dad is a living-thing)) )ここでは7つのルールがある.それぞれ?xという変数を使ってルールを表 している.作業記憶には4つの事実が入っている.作業記憶には変数は含 まれない.最後のpsという手続きで最終状態として(dad is a living-thing) が得られたらば推論を終了するということを行なうという記述 になっている. 作業記憶とルールを見て人間が推論してみることにすると, (dad is a man)というのがあるため,rule2が適用でき, (dad is human)が事実として得られ,(dad is human) と(dad eats vegetables)がなり立つことになり,rule5より(dad is a vegetarian)と なる.これによりrule7から(dad is a living-thing)が得られる. このように,人間の場合には,(dad is a living-thing)がゴールなので, dadに纏わるものばかりから推論をしてゆけるが,ここで紹介したシステム では,作業記憶の内容の順に処理を進めることになる. 実行してみると,
> (rule-demo1 t) 0: rule RULE1 adds ((QUEEN-ELIZABETH IS HUMAN)). FIND-FIRST effects. (RULE1 RULE2) -> RULE1. 1: rule RULE2 adds ((DAD IS HUMAN)). FIREABLE-RULES effects. (RULE1 RULE2 RULE3 RULE4) -> (RULE2 RULE3 RULE4). SIMPLEST-INSTANTIATIONS effects. (RULE2 RULE3 RULE4) -> (RULE2). FIND-FIRST effects. (RULE2) -> RULE2. 2: rule RULE3 adds ((DAD IS A CARNIVORE)). FIREABLE-RULES effects. (RULE1 RULE2 RULE3 RULE5) -> (RULE3 RULE5). FIND-FIRST effects. (RULE3 RULE5) -> RULE3. 3: rule RULE5 adds ((DAD IS A VEGETARIAN)). FIREABLE-RULES effects. (RULE1 RULE2 RULE3 RULE5 RULE6) -> (RULE5 RULE6). FIND-FIRST effects. (RULE5 RULE6) -> RULE5. Rule Interpreter Halted Goal (DAD IS A LIVING-THING) Achieved Here are contents of working memory: ((DAD IS A LIVING-THING) (DAD IS A VEGETARIAN) (DAD IS A CARNIVORE) (DAD IS HUMAN) (QUEEN-ELIZABETH IS HUMAN) (QUEEN-ELIZABETH IS A WOMAN) (DAD IS A MAN) (QUEEN-ELIZABETH EATS MEAT) (DAD EATS VEGETABLES)) NILという具合に,0でまず,作業記憶の(queen-elizabeth is human) がrule1に,(dad is a man)がrule2にマッチする. 2つのルールがマッチするので競合解消手続きが働く. 競合解消手続きでは,まずfireable-rulesが試され,rule1,rule2とも 一度も発火していないので,そのまま次のfind-least-recently-fired-rules へ渡される.しかし,まだ何も発火していないので,そのまま simplest-instantiationsへ渡される.simplest-instantiationsでは,行動 処理結果としてできあがるインスタンスのなかのアトムの数を比較するが, rule1,rul2とも3つのアトムを返すため,(rule1 rul2)のままで次の競合解消 find-firstを行ない,rule1が選ばれることになる. 実行例にも表示されているように,find-firstがeffectsとなり(rule1 rule2) -> rule1が選ばれたとなる. 以下同様に処理を行なう.