(defvar *working-memory* nil) (defun ps (ruleset-name working-memory goal) (setq *working-memory* working-memory) (setf *rules* (get '*rules* ruleset-name)) (initialize-ruleset *rules*) (production-system *rules* goal)) (defun initialize-ruleset (ruleset) (mapc #'(lambda (rule) (setf (consequent-instantiation rule) nil) (setf (antecedent-instantiations rule) nil) (setf (previous-fired-instantiations rule) nil)) ruleset) (mapc #'(lambda (rule) (setf (get rule 'cycle-last-fired) -1) (setf (previous-fired-instantiations rule) nil)) ruleset)) (defmacro previous-fired-instantiations (rule) `(get ,rule 'previous-fired-instantiations)) (defmacro consequent-instantiation (rule) `(get ,rule 'consequent-instantiation)) (defmacro antecedent-instantiations (rule) `(get ,rule 'antecedent-instantiations)) (defun cycle-last-fired (rule) (get rule 'cycle-last-fired))*working-memory* の更新は推論を行なった際にルールがマッチし, 行動部のパターンを実行したときになされる. 行動部の実行方法としては,make, remove, modifyといった 制御手続きがあればその手続きを実行する機構を組み込むことも 可能である. そのような手続きを設けず単に行動部パターンを追加するという場合には,以 下のようにルールの条件部でマッチした各変数の値を用いて行動部パターン (instantiation)を求めてそれをappendで追加することになる.