(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))
(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))
(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))))))
(defun find-first (rules) (car rules))