(in-package :cs325-user) (defvar *facts* '((bird isa animal) (canary isa bird) (penguin isa bird) (bird can-fly yes) (penguin can-fly no) (tweety isa canary) (chilly isa penguin))) (defun matches (subj pred fact) (and (eql (car fact) subj) (eql (cadr fact) pred))) (defun answer (subj pred facts) (caddr (find-if (lambda (fact) (matches subj pred fact)) facts))) (defun infer (subj pred facts) (or (answer subj pred facts) (infer (answer subj 'isa facts) pred facts)))