(defun fail (environment) (eq environment 'fail)) (defun match-antecedent (antecedent memory &optional environment) (cond ((or (null antecedent) (fail environment)) environment) (t (match-antecedent (cdr antecedent) memory (match* (car antecedent) memory environment 'fail))))) (defun match* (pattern patterns environment last-matched-environment) (cond ((null patterns) last-matched-environment) ((not (fail last-matched-environment)) last-matched-environment) (t (match* pattern (cdr patterns) environment (match pattern (car patterns) environment)))))この方法だと,もし引き継がれていった順番が悪いと途中でmatchが失敗し, そのルールは候補とはならなくなります. それは,マッチが失敗した時点で別のバインデイング対応に対して も調べ直すといったバックトラックを行っていないからです. 変数を含んだ条件要素と作業記憶のデータとの照合には 最初に述べたmatchを使っています.