(define answer-by-pattern (lambda (query p/a-list) (cond ((null? p/a-list) (display '(i do not understand))) ((matches? (pattern (car p/a-list)) query) (let ((subs (substitutions-in-to-match (pattern (car p/a-list)) query))) (let ((result (apply (action (car p/a-list)) subs))) (if (null? result) (display '(i do not know)) (display result))))) (else (answer-by-pattern query (cdr p/a-list))))))