(defun clause-head (clause) (first clause)) (defun clause-body (clause) (rest clause)) (defun get-clauses (pred) (gethash pred *prolog-database*)) (defun predicate (relation) (first relation)) (defvar *prolog-database* (make-hash-table)) (defun init-prolog () (clrhash *prolog-database*)) (defun add-clause (clause) (let ((pred (predicate (clause-head clause)))) (setf (gethash pred *prolog-database*) (nconc (get-clauses pred) (list clause))) pred))add-clauseの中で注意するところとして,nconcを使っているところです. appendを使うとリスト構造がコピーされて無駄が多いのですが,nconcではそ の無駄がなくなります.nconcは副作用として破壊的な操作を行なってしまい ますが,ここでは,(list clause)をnconcしているため,新たなコンスを nconcしていることになり他のデータを破壊する心配はありません.