next up previous
Next: 2.11 実行例(3) Up: 2 プロダクションシステム Previous: 2.9 実行例(1)

2.10 実行例(2)

haltで終了する例を次に示します.これは2桁の数の引き算を行なう例です. たとえば,83から25を引くという例において,この引き算を (sub 8 3 2 5)というように表現しています.

(defun rule-demo2 (&optional (*verbose* nil))
  (set-up-rules
   'two-column-subtraction
   '((r1  ==>
          (7 2 5) (8 4 4) (4 3 1) (6 2 4)
          (8 1 7) (7 4 3) (7 1 6)
          (add10 7 17) (add10 3 13) (13 5 8))
     (r2 (sub ?tl ?tr ?bl ?br)
         ==>
         (nbondr ?tr ?br) (nbondl ?tl ?bl))
     (r3 (nbondr ?tr ?br) (nbondl ?tl ?bl)
         (?tr ?br ?a1) (?tl ?bl ?a2)
         ==>
         (answer ?a2 ?a1))
     (r4 (answer ?x ?y)
         ==>
         (%%halt%%))
     (r5 (sub ?tl ?tr ?bl ?br)
         (add10 ?tr ?newtr)
         (?tl 1 ?newtl)
         ==>
         (sub ?newtl ?newtr ?bl ?br))))
  (ps 'two-column-subtraction '((sub 8 3 2 5)) nil)
  )
ルールにでてくる(7 2 5)などのような(a b c)は,a から b を引くと c にな るという意味です. 下位の桁で引けない場合には,10を足して引き,上位の桁の数から1を引く という計算になりますが,これはルール r5 で表されています. nbondrは下位の桁の引き算を行ない,nbondlは上位の引き算を行なうという ものです. 条件部がなにもないルールr1があります.これは次の実行例にあるようにただ 単にデータを行動部のインスタンスを作業領域に付加するだけになります. 終了条件は,r4にあるように(answer ?x ?y)というデータが作業記憶に現れる ということです.answerは r3 の条件がなり立てば生成されます.

<cl> (rule-demo2 t)

0: rule R2 adds ((NBONDR 3 5) (NBONDL 8 2)). 
        SIMPLEST-INSTANTIATIONS effects.
        (R1 R2) -> (R2).
        FIND-FIRST effects.
        (R2) -> R2.
1: rule R1 adds
       ((7 2 5) (8 4 4) (4 3 1) (6 2 4) (8 1 7) (7 4 3)
        (7 1 6) (ADD10 7 17) (ADD10 3 13) (13 5 8)). 
        FIREABLE-RULES effects.
        (R1 R2) -> (R1).
        FIND-FIRST effects.
        (R1) -> R1.
2: rule R5 adds ((SUB 7 13 2 5)). 
        FIREABLE-RULES effects.
        (R1 R2 R5) -> (R5).
        FIND-FIRST effects.
        (R5) -> R5.
3: rule R2 adds ((NBONDR 13 5) (NBONDL 7 2)). 
        FIREABLE-RULES effects.
        (R1 R2) -> (R2).
        FIND-FIRST effects.
        (R2) -> R2.
4: rule R3 adds ((ANSWER 5 8)). 
        FIREABLE-RULES effects.
        (R1 R2 R3) -> (R3).
        FIND-FIRST effects.
        (R3) -> R3.
Rule Interpreter Halted
Halt Signalled
Here are contents of working memory: 
((%%HALT%%)
 (ANSWER 5 8)
 (NBONDR 13 5)
 (NBONDL 7 2)
 (SUB 7 13 2 5)
 (7 2 5)
 (8 4 4)
 (4 3 1)
 (6 2 4)
 (8 1 7)
 (7 4 3)
 (7 1 6)
 (ADD10 7 17)
 (ADD10 3 13)
 (13 5 8)
 (NBONDR 3 5)
 (NBONDL 8 2)
 (SUB 8 3 2 5))
NIL
ここで,r1の行動部インスタンスがr2のものより長い(アトムが多い)ため, 最初にr2が発火しています. ここでのルールは,83から25を引くためのルールになっています.任意の2桁 の数どうしの引き算ではもっと多くのルールが必要です.
next up previous
Next: 2.11 実行例(3) Up: 2 プロダクションシステム Previous: 2.9 実行例(1)
generated through LaTeX2HTML. M.Inaba 平成18年5月21日