外国語論文講読III.
Object-Oriented Programming: the CLOS Perspective MIT Press, 1993.

12.3 Implementation

この章では、CLOSを使った視覚知識表現ツールの実装について述べる.
  1. 最初に知識表現に対するCLOSでのアプローチについて述べる。 ここでMetaobject Protocol が使われる.
  2. 次にツール全体の構造について概観し、CLOSの寄与について触れる.
  3. 最後に適合性と拡張性について述べる。

12.3.1 Using CLOS for the Database

CLOSにはフレーム表現のための機構はもちろん備わっていないので、 CLOSを拡張することによってフレーム表現のクラスを作る。 必要な拡張には以下のようなものがある: これらの拡張を行うには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マクロを単に拡張する場合、次のようになる.
(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つの問題点を挙げている。
  1. プロトコルがユーザにわかりやすく慎重に書かれなければならない。
  2. プロトコルの設計は難しい.なぜなら将来的に必要になるであろう機能を すべて予知することは不可能だからである.

後半では、総称関数の中で呼ばれる関数が中で独自の判断をするため、それを 後から制御できないという問題と、関数のprecedence orderを変えたいときの 問題などを言っている。(やや自明か?)

12.4 Conclusions

12.4.1 Main Characteristics of the Tool and Further Work

computer visionを題材としてこの章で述べたツールの特徴は次のように まとめられる: この章で述べた computer vision のためのツールは実際に存在する. それは(普通の) Common Lisp および CLOS で書かれている. 詳細は文献[21],[22].

12.4.2 An Assessment of CLOS and Its MOP

まとめると、CLOSは Hybrid Knowledge Representation に適した言語であると 評価できる. CLOSの概念は難しいが、学べばそれだけの価値が得られるだろう。 どのような部分が理解しにくいかというと: などである.

また、Metaobject Protocolの仕様がまだ定まっていないこと、 難しいためもっと構造化が必要であることなどがこれからの課題として指摘できる。


Daichi Mochihashi <daichi6@dolphin.c.u-tokyo.ac.jp>
Last modified: Thu Jan 30 12:42:10 1997
memo: