Pattern Matching
Pattern matching is the inverse of substitution: it tests to see whether an input is an instance of a pattern, and if so, how it matches. [The pattern matcher code can be loaded using (load "/projects/cs375/patmatch.lsp") .]
(match '(defun ?fun (tree)
(if (consp tree)
(?combine (?fun (car tree))
(?fun (cdr tree)))
(if (?test tree) ?trueval ?falseval)))
'(DEFUN NNUMS (TREE)
(IF (CONSP TREE)
(+ (NNUMS (CAR TREE))
(NNUMS (CDR TREE)))
(IF (NUMBERP TREE) 1 0))) )
((?FALSEVAL . 0) (?TRUEVAL . 1) (?TEST . NUMBERP)
(?COMBINE . +) (?FUN . NNUMS) (T . T))
(match '(- ?x (- ?y))
'(- z (- (* u v))))
((?Y * U V) (?X . Z) (T . T))