next up previous
Next: 2.9 実行例(1) Up: 2 プロダクションシステム Previous: 2.7 競合解消(conflict resolution)

2.8 競合解消(conflict resolution)の戦略

4つの競合解消(conflict resolution)の戦略は以下のような働きを 持つ.
  1. 同じ行動部パターンを生成したことがないルールを選ぶ (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))
    
  2. もっとも以前に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))
    
  3. 最も単純な行動部パターンをもつルールを選ぶ (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))))))
    
  4. 最初の候補を選ぶ (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は必ずひとつだけのルールを返すからである.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日