(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桁 の数どうしの引き算ではもっと多くのルールが必要です.