フレーム
驚いたことに"フレーム"の具体的説明が全然出てこない。p.290でやっと出てくる。ほとんど嫌がらせ。
フレームは連想リストである。こんなの↓ ((?x . Adam)(?y . Cain))
?x は Adam に束縛されている。?y は Cain に束縛されている。という。
フレームストリームは、フレームのリストである。(連想リストのリスト)
フレームストリーム ( ((?x . Adam)(?y . Cain)) ((?x . Cain)(?y . Enoch)) ((?x . Enoch)(?y . Irad)) ) フレーム1 フレーム2 フレーム3
フレーム(連想リスト)も、ストリームも1列に並んでいる状態が一番値打ちがあるので、入れ子にしたりはしていないと思われる。
3章、4章前半の環境フレームとは別物なので注意。
環境フレーム ( (x y z) 1 2 3)
パターンマッチング
パターンマッチングの説明も、いまいち要領を得ないが具体的には多分このようなことと思われる。
パターンマッチャは、入力のフレームと表明とパターンを見比べて出力のフレームを作る。
合成質問
以下の例を考える。ANDの例。
(and (job ?x (computer programmer)) (address ?x ?y))
この合成質問の処理はこんな感じと思われる。
フレーム1が最初のパターンマッチの後
((?x . (Hacker Alyssa P)))
だったのが、次のパターンマッチの後
((?x . (Hacker Alyssa P)) (?y . (Cambridge (Mass Ave) 78)))
となっている。?yの束縛が追加されている。これをフレームが拡張されたという。
(フレームに変数束縛を追加するのを拡張といい、また、ストリームにフレームを追加することも拡張という。)
2つ目のパターンマッチャがフレームを拡張するときの動作の詳細、、、まあ図から想像されるとおり。
ユニフィケーション
p267のlives-nearの例を考える。
(lives-near ?x (Bitdiddle Ben))
処理はこんな感じと思われる。
ユニフィケーションは、パターンマッチの一種である。
パターンとDBの両方に ?変数 が入った場合のパターンマッチをユニフィケーションと呼んでいる。
ユニフィケーションとパターンマッチの処理の違いは以下のとおり。
パターンマッチの場合 パターン=(job ?x BBB) と DBの表明=(job AAA BBB) に対して → フレーム=((?x . AAA))
ユニフィケーションの場合 パターン=(lives-near ?x BBB) と DBの規則=(rule (lives-near ?p1 ?p2)) に対して → フレーム=((?x . ?p1) (?p2 . BBB))
パターンマッチは、パターン側の ?変数 だけフレームに入れる。
ユニフィケーションは、パターン側の ?変数 と DB側の ?変数 の両方をフレームに入れる。(違いっても、そんだけ)
rule内の変数は適用の度に連番がつけられる。(p283)
規則の本体の評価
ruleの結論部分でユニファイしたあと、ruleの本体部分を評価する。(p274)
append-to-formの動作
ついでに気になる append-to-form の動作も考えてみる。
- パターン1は最初の引数が ( ) でないので規則2の結論部とはユニファイしない。
- パターン1は規則1の結論部とユニファイしてフレーム1を作る。unify1
(なお、規則の変数には、適用ごとに連番がつく。) - 続いて、規則1の本体が評価される。unify2
- 規則1の本体パターン2は、フレーム1で ?v-1 が ( ) に束縛されているので、規則1と本体パターン2のユニファイは失敗する。
「→規則の本体評価→規則の本体が規則の場合さらに規則の本体評価→・・・」
の繰り返しはここで止まる。 - 規則1の本体パターン2は、規則2の結論部とユニファイして、フレームストリーム2 をつくる。
- 規則2には本体がないので、本体の評価はしない。
フレームストリーム2を使ってパターン1を具体化する。
フレームストリーム2を見ると
?x = ?y-1 = ?y-3 = ?z-1 = (b)
なのでパターン1は
(append-to-form (a) (b) (a b))
と印字される。