ESP – Prologでオブジェクト指向

その昔、ESP(Extended Sequential Prolog)という
Prologにオブジェクト指向を加えたような言語があったそうです。
このESPはFlavorsを参考にして作られており、なかなか面白いです。
ESPについての資料第五世代コンピュータプロジェクト・アーカイブスにおいてあります。
T. Chikayama, “Unique Features of ESP”
ここから分かるように、ESPではクラスの多重継承が可能で、
beforeデモン、afterデモンなんてものがあります。

class with_a_lock has
instance
component lock is lock;
before:open(Obj) :- unlocked(Obj!lock);
...
end.
class door has
instance
component state := closed;
:open(Door) :- Door!state := open;
...
end.
class door_with_a_lock has
nature door, with_a_lock;
end.

クラスwith_a_lockは成分lockを持ち、その初期値値はlock(これはアトム)です。
また、beforeデモン述語openを持ち、これは引数のunlock(ここでは定義されていない)を行います。
クラスdoorは成分stateを持ち、その初期値はclosedです。
また、述語openを持ち、これは引数のlockスロットの値をopenに設定します。
クラスdoor_with_a_lockはdoorとwith_a_lockを継承しています。
ここで次のように、door_with_a_lockのインスタンスを作り、
openを呼ぶと、まずbeforeデモンによりwith_a_lockのopenが呼ばれ、
その後にdoorのopenが呼ばれるという仕組みです。

:new(#door_with_a_lock, DWL),
:open(DWL),

これをCommon LispでCLOSを使って書くと次のような感じでしょうか。

(defclass with_a_lock ()
((lock :accessor with_a_lock-lock
:initform 'lock)))
(defclass door ()
((state :accessor door-state
:initform 'closed)))
(defclass door_with_a_lock (with_a_lock door) ())
(defmethod my-open :before ((obj with_a_lock))
(format t "with_a_lock open~%")
(setf (with_a_lock-lock obj) 'unlock))
(defmethod my-open ((obj door))
(format t "door open~%")
(setf (door-state Obj) 'open))

実行してみると、with_a_lockのopenが呼ばれてからdoorのopenが呼ばれているのが分かります。

CL-USER> (setf *dwl* (make-instance 'door_with_a_lock))
#<DOOR_WITH_A_LOCK #x19FAE3A9>
CL-USER> (my-open *dwl*)
with_a_lock open
door open
OPEN

Flavorsが出来た時期を考えてみたら、
影響を受けた言語が沢山あってもおかしくはないのに、
なかなか見かけないのはなんでだろ…

Leave a Reply