;; IS-SUBSET ;; helper function (defun is-subset (small big) (setf small (remove-if #'(lambda (symbol) (find symbol big :test 'eql)) small)) (eql small nil)) ;; FORWARD-CHAIN-REC ;; recursive call function (defun forward-chain-rec (literals rules) (let ((inferred literals)) (dolist (rule rules) (if (is-subset (car rule) literals) (setf inferred (append inferred (list (cadr rule)))))) (if (equalp (remove-duplicates inferred) literals) (remove-duplicates inferred) (forward-chain-rec (remove-duplicates inferred) rules)))) ;; FORWARD-CHAIN ;; Main function. Usage should be self-explanatory. (defun forward-chain (kb) (let* ((literals (remove-if-not 'atom kb)) (rules (remove-if 'atom kb)) (inferred (forward-chain-rec literals rules))) (remove-if #'(lambda (symbol) (find symbol literals :test 'eql)) inferred)))