(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))))))