外国語論文講読III.
Object-Oriented Programming: the CLOS Perspective MIT Press, 1993.
12.3 Implementation
この章では、CLOSを使った視覚知識表現ツールの実装について述べる.
- 最初に知識表現に対するCLOSでのアプローチについて述べる。
ここでMetaobject Protocol が使われる.
- 次にツール全体の構造について概観し、CLOSの寄与について触れる.
- 最後に適合性と拡張性について述べる。
12.3.1 Using CLOS for the Database
CLOSにはフレーム表現のための機構はもちろん備わっていないので、
CLOSを拡張することによってフレーム表現のクラスを作る。
必要な拡張には以下のようなものがある:
- フレームの階層構造:部分関係.
- クラス間の継承以外の関係:visual imageを扱っているので画像の相互関係.
- 多値スロット
- クラス<->インスタンス間の相互アクセス
- ユーザインターフェース
これらの拡張を行うにはMOPが重要な役割を果たす。
しかし、MOPの標準はまだ決定しておらず、制限がある。これについては後でも触れる.
以下で実装を行う。
12.3.1.1 A Mataclass and a Base Class for Frames
フレーム表現のための基本的なクラスとして standard-class, standard-object
に対応した standard-frame-class と standard-frame を作る.
(defclass standard-frame-class (standard-class)
((instances :reader instances :initform nil)))
(defmethod validate-superclass ((class standard-frame-class)
(super standard-class))
t)
(defclass standard-frame (relations-mv-mixin)
((name-of-frame :reader name-of-frame :iniarg :name-of-frame)
(part-of :initform nil :relation t :inverse parts)
(parts :initform nil :relation t :inverse part-of))
(:metaclass standard-frame-class))
mvはMultivalueのことである.
standard-frame は precedence listでstandard-object の前に挿入されるので、
そのために compute-class-precedence メソッドを書き換える。
(defmethod compute-class-precedence-list
((class standard-frame-class))
(let ((prec-list (call-next-method))
(std-frame-list (class-precedence-list
(find-class 'standard-frame))))
(append (remove-if '#(lambda (el)
(member el std-frame-list :test #'equal))
prec-list)
std-frame-list)))
このほか、以前出てきた short-term memory と long-term memory のために
ltm と stm という2つのクラスを定義しておく。
(defclass ltm () ())
(defclass stm (rms-mixin) ())
こうしておくのは 'future extension'のためである。
ltmはstaticな情報を記録するが、stmは必要に応じてgarbage collectされてもよい。
新たに定義された情報はこの2つのどちらかに属するが、そうでないものも存在して
よい。(この辺、少しいい加減)
12.3.1.2 User Interface Macros
ここでは、class と instance というマクロを用意して
フレーム表現をユーザーが簡単に作れるようにする。
visual image representationにおける例としては:
(class line (imagedata)
start
end
length
(connected-with :relation t :inverse connected-with))
(instance l-1 line
(part-of 'cube)
(length 125))
instance マクロは make-instance を拡張して作られるが、
class マクロはどのmethodを拡張するのかに任意性があり、
- defclass を拡張する方法
- MOPを用いて ensure-class, ensure-class-using-class プロトコルを拡張する
という選択がある.
defclassマクロを単に拡張する場合、次のようになる.
(defmacro class (name supers &rest slots)
(let ((slotlist (preprocess-slots slots)))
`(ensure-class ',name
:direct-superclasses ',supers
:metaclass 'standard-frame-class
:direct-slots ',slotlist)))
だが、この方法だと渡されるオプションが標準と違っていたりすると
うまくいかないことが予想される.従って、MOPを用いてプロトコルを拡張する方向の
ほうが望ましい。
12.3.1.3 Instance naming and link from class to instance
12.3.1.4 Multiple-valued Slots and Relations
12.3.1.5 Other Slot Options and Accessors
12.3.1.6 Discussion
これまででわかったように、Metaobject Protocolを用いた拡張は
どこでその拡張を行うかが必ずしも明らかでない.
だが一方で、MOPを用いれば非常に柔軟で将来性の高い拡張が可能である。
このように目的に特化したクラスを作ることで、CLOS自身とユーザ拡張とを
区別することができ、扱いやすくなる.
しかし、MOPの仕様がまだ固まっていないため、可搬性を重視するなら
MOPを用いた拡張にはデメリットが大きい。
12.3.2 Using CLOS for the System Design
システムデザインにおけるCLOS,ということであるが、ここで言っている内容は
CLOSというより一般のオブジェクト指向システムデザインのメリットについて
である。
前半の内容はありきたりなので省略する。
図について説明を加えておくと、Fig.12.2 はcomponentがオブジェクトの
階層構造になっている、という図である.このような構造になっているので、
新しいheuristic searchのようなメソッドを簡単に追加することができる,と
言っている.
CLOSでは、ルールもオブジェクトとすることができる。
次のコード
(defrule test ruleset-1
(if (image parts ?part)
(?part size ?x)
(test (> ?size 100))
(?part color blue)
(assert (?part interpretation lake))
(print "found a lake"))
は適用される前に前処理され、ruleset-1 の中の test ルールオブジェクトとして
連結される. 中では、推論部、結論部がそれぞれのスロットに入る。これを示したのが
Fig.12.3である。
ここからはオブジェクト指向の話になるが、一般にオブジェクト化されない論理推論が
これによってモジュール化され、他componentとの不要なinteractionが減って
総称関数が適用可能になるなどの利点が得られる、ということである。
この他、オブジェクト化することで並列計算に適合するということが挙げられる。
ただし、これまで見てきたようにすべてオブジェクトにすると、オブジェクトの生成、
破壊や継承などにかかわるオーバーヘッドが大きくなる。
これを軽減するためには,動的に生成/破棄されるオブジェクトを最適化する
オプティマイザが必要になってくるだろう。
12.3.3 Using CLOS for Enhancing Flexibility
ここでも言っているのは、CLOS,特にMetaobject Protocolを用いれば
システムの flexibility が増し、拡張が容易になるというオブジェクト指向の
当たり前の話である。
筆者はここで、MOPに対して2つの問題点を挙げている。
- プロトコルがユーザにわかりやすく慎重に書かれなければならない。
- プロトコルの設計は難しい.なぜなら将来的に必要になるであろう機能を
すべて予知することは不可能だからである.
後半では、総称関数の中で呼ばれる関数が中で独自の判断をするため、それを
後から制御できないという問題と、関数のprecedence orderを変えたいときの
問題などを言っている。(やや自明か?)
12.4 Conclusions
12.4.1 Main Characteristics of the Tool and Further Work
computer visionを題材としてこの章で述べたツールの特徴は次のように
まとめられる:
- 柔軟性と強力さ
- 拡張性
- modularityとinteractivity
- アプリケーションの素早いプロトタイピング
この章で述べた computer vision のためのツールは実際に存在する.
それは(普通の) Common Lisp および CLOS で書かれている.
詳細は文献[21],[22].
12.4.2 An Assessment of CLOS and Its MOP
まとめると、CLOSは Hybrid Knowledge Representation に適した言語であると
評価できる. CLOSの概念は難しいが、学べばそれだけの価値が得られるだろう。
どのような部分が理解しにくいかというと:
- CLOSとMOPの生まれた背景と目的
- metalevel architecture の考え方
- 同じ目的に達するための複数の(MOP プログラミングの)方法の存在
などである.
また、Metaobject Protocolの仕様がまだ定まっていないこと、
難しいためもっと構造化が必要であることなどがこれからの課題として指摘できる。
Daichi Mochihashi
<daichi6@dolphin.c.u-tokyo.ac.jp>
Last modified: Thu Jan 30 12:42:10 1997
memo:
- lambda list
- message passing approach <-> data-driven approach