5.3 Segmentパターンマッチ

この節ではパターンマッチに複数の単語にマッチさせる変数を導入しました。

Segmentパターンは"(?* var)"の形で表し、以下のように使います。

 ((?* ?x) is (?* ?y))

このパターンを '(this is a pen)とマッチさせると、

((?x . this)
 (?y a pen))

とマッチします。


Segmentマッチのさせ方の基本は、パターンがSegmentマッチ変数だった場合に

  • 「パターンの次の要素」に一致する入力要素を探す
  • 一致する入力要素がある場合、現在の入力要素から一致する入力要素の前までを変数の値とする

とします。

選択したSegmentマッチの結果で矛盾が起きたり、残りのパターンがマッチしなかった場合、Segmentを伸ばしてマッチを繰り返します。

CL-USER> (pat-match '((?* ?x) is a (?* ?y))
                    (what he is is a fool))

での動きを確認すると、

  1. ?xに(what he)が束縛されますが、その後の(is a (?* ?y))が(is is a fool)にマッチしません。
  2. ?xに(what he is)が束縛されると、(is a (?* ?y))に(is a fool)がマッチします

となります。