(defun graphsearch (initial-state expand-fn goalp-fn lessp-fn result-fn) (loop for open = (list initial-state) then (merge 'list (cdr open) (funcall expand-fn (car open) lessp-fn) lessp-fn) when (funcall goalp-fn (car open)) return (funcall result-fn (car open))))