next up previous
Next: 1.3 変数の定義 Up: 1 変数を含むパターンとデータのマッチング Previous: 1.1 マッチング関数の仕様

1.2 マッチング関数の構造

パターン中の変数がデータと照合するかどうかを調べるマッチング関数の構造 は,tree-equalと同様に考えることができます.

(defun tree-equal (a b)
  (cond
   ((or (atom a) (atom b)) (eql a b))
   (t (and (tree-equal (first a) (first b))
           (tree-equal (rest a)  (rest b))))))
tree-equalと違って,比較するパターンが変数であればそれと対応関係を調べ られるデータがなんであろうとマッチします.変数ではなく,どちらかがアトムな らばeqlで等しいことをチェックし,そうでなければ再帰的に各要素に対して マッチング処理を繰り返します.

(defun match (a b)
  (cond
   ((variable-p a) t)   ;;; ここがちがう
   ((or (atom a) (atom b)) (eql a b))
   (t (and (match (first a) (first b))
           (match (rest a)  (rest b))))))
しかし,これだけでは,前に述べたように,同じ変数が複数箇所で現れるパター ンの場合には,同じデータにマッチングしているかどうかを判定させることが できなくなります. そこで,マッチング処理の中でバインディング情報を参照して 判定する処理が必要となります.

(defun match (a b &optional bindings)
  (cond
   ((variable-p a)
         (match-variable a b bindings))
   ((or (atom a) (atom b))
         (match-atom a b bindings))         
   (t (match-list a b bindings))))
match-variable, match-atom, match-listというようにデータの型ごとに 副手続きを用意することで実現できそうです. このように手続きを副手続きに分けて実現する方法は手続きの抽象化と 呼ばれたりして重要なプログラミング手法です.
next up previous
Next: 1.3 変数の定義 Up: 1 変数を含むパターンとデータのマッチング Previous: 1.1 マッチング関数の仕様
generated through LaTeX2HTML. M.Inaba 平成18年5月21日