(in-package :cs325-user) (defparameter *facts* '((bird isa animal) (pet isa animal) (canary isa bird) (penguin isa bird) (animal can-fly no) (animal has-owner no) (pet has-owner yes) (bird can-fly yes) (penguin can-fly no) (tweety isa pet) (tweety isa canary) (chilly isa penguin))) (defun foo (x) (cons x (cons (bar x) (baz x)))) (defun bar (x) (mapcan (lambda (fact) (and (eql (car fact) x) (eql (cadr fact) 'isa) (list (caddr fact)))) *facts*)) (defun baz (x) (mapcan (lambda (fact) (and (eql (car fact) x) (not (eql (cadr fact) 'isa)) (list (cdr fact)))) *facts*)) (defun triples-to-frames () (mapcar 'foo (remove-duplicates (mapcar 'car *facts*)))) (defparameter *frames* (triples-to-frames)) (defun get-frame (subj) (assoc subj *frames*)) (defun frame-value (subj pred) (cadr (assoc pred (cddr (get-frame subj))))) (defparameter *absts* nil) (defun all-absts (subj) (or (assoc subj *absts*) (add-absts subj))) (defun add-absts (subj) (let ((absts (remove-duplicates (collect-absts subj)))) (setq *absts* (cons absts *absts*)) absts)) (defun collect-absts (subj) (cons subj (mapcan 'collect-absts (cadr (get-frame subj))))) (defun infer (subj pred) (some (lambda (abst) (frame-value abst pred)) (all-absts subj))) ;;; for testing (defun show-all () (pprint (mapcar 'foo '(animal bird canary pet tweety penguin chilly))))