- 同じ行動部パターンを生成したことがないルールを選ぶ (fireable-rules)
まだ一度もfireしたことがないルールか,fireしていても同じ行動部パターン
(instantiation)としてfireしたことがないルールを選ぶ.以前にfireされた
instantiationはすべてprevious-fired-instantiations属性に保存されており
その属性値を利用する.これにより同じ処理が無限に繰り返されるのを防ぐこ
とができる.
(defun fireable-rules (rules)
(remove nil (mapcar #'fireable rules)))
(defun fireable (rule)
(if (set-difference
(consequent-instantiation rule)
(previous-fired-instantiations rule)
:test #'equal)
rule))
- もっとも以前にfireしたルールから選ぶ (Find-least-recently-fired-rules)
あるルールが一度fireすると次にそのルールがfireするまでに,他の全てのルー
ルが一度はfireすべきであるという考えに基づいた戦略である.fireした順番
の古い方から並べて,最も古いものを返す.まだfireしていないものがある場
合にはそれらすべてを返す.
(defun find-least-recently-fired-rules
(matching-rules)
(let* ((candidates
(sort matching-rules
#'< :key #'cycle-last-fired)))
(find-least-recently-fired-rules-2
candidates
(cycle-last-fired (car candidates)))))
(defun find-least-recently-fired-rules-2
(candidates lowest-cycle)
(cond ((null candidates) nil)
((> (cycle-last-fired (car candidates))
lowest-cycle) nil)
(t (cons
(car candidates)
(find-least-recently-fired-rules-2
(cdr candidates)
lowest-cycle)))))
(defun cycle-last-fired (rule)
(get rule 'cycle-last-fired))
- 最も単純な行動部パターンをもつルールを選ぶ (Simplest-instantiations)
最も単純な行動パターン(instantiation)としては,個々の行動要素の数が小
さいという定義も考えられるが,ここでは行動部パターンの中に現れるアトム
の数で判断する.条件部に現れる変数が行動部にも使われていて,その変数が
多くのアトムを含む場合には簡単なルールとならなくなる場合も考えられる.
(defun simplest-instantiations (matching-rules)
(let ((rules (sort matching-rules
#'< :key #'complexity)))
(simplest-insts-2
rules (complexity (car rules)))))
(defun simplest-insts-2 (rules simplest)
(cond
((null rules) nil)
((> (complexity (car rules)) simplest) nil)
(t (cons
(car rules)
(simplest-insts-2 (cdr rules) simplest)))))
(defun complexity (rule)
(length
(atomize (consequent-instantiation rule))))
(defun atomize (lis)
(cond
((null lis) nil)
((atom (car lis))
(cons (car lis) (atomize (cdr lis))))
(t (append (atomize (car lis))
(atomize (cdr lis))))))
- 最初の候補を選ぶ (Find-first)
上記の戦略を通しても残っているルール群の最初のルールを選ぶ.
(defun find-first (rules) (car rules))
まだ一度も fire していないルールがある状況においては,fireable-rules
,simplest-instantiations ,find-first が有効となります.すべてのルー
ルが一度は fire した状況になると,fireable-rules と
find-least-recently-fired-rules のみが有効となります.
理由は,一回のサイクルで fire するルールはかならず一つであるために,す
べてのルールが一度は fire した状況になれば,
find-least-recently-fired-rulesは必ずひとつだけのルールを返すからです.