Pattern Matching
(defun equal (pat inp) (if (consp pat) ; interior node? (and (consp inp) (equal (car pat) (car inp)) (equal (cdr pat) (cdr inp))) (eql pat inp) ) ) ; leaf node (defun match (pat inp) (matchb pat inp '((t . t)))) (defun matchb (pat inp bindings) (and bindings (if (consp pat) ; interior node? (and (consp inp) (matchb (cdr pat) (cdr inp) (matchb (car pat) (car inp) bindings))) (if (varp pat) ; leaf: variable? (let ((binding (assoc pat bindings))) (if binding (and (equal inp (cdr binding)) bindings) (cons (cons pat inp) bindings))) (and (eql pat inp) bindings)) ) ) )