SmallOPS を発展させた Toy Open Production System を SourceForge.jp にて公開しています。
また、本コンテンツを書くに辺り、以下の参考書を参考にしています。
SmallOPSは、行動の種類としてmake一種類だけしかサポートしていない。 しかし、後にmodifyやremoveなどの行動を追加できるようにすることを考慮して 行動のクラスを以下のような構成とした。
Actionクラスは、全ての行動のルートクラスであり、 FireableActionクラスは全ての発火可能行動のルートクラスである。 行動はプロダクションルールの行動部に書かれるものであるが、 行動部には変数を含むオブジェクトが書かれる可能性がある。 従って、そのままでは新しい事実を追加するような行動を起こすことはできない。 そこでActionクラスのinstantiateメソッドは、 その変数を具体的な定数の値に変換して発火可能行動であるFireableActionインスタンスを生成する。 FireableActionクラスは、変数を含まない具体的な値を持つ行動であり、発火可能になった操作である。 従って、FireableActionクラスは、発火を行うためのfireメソッドを持っている。
一つの行動は、ActionクラスとFireableActionクラスの双方を派生した二つのクラスとして表現される。 makeの場合はMakeActionクラスとFireableMakeActionクラスがそれに当たる。
MakeActionクラスは、 プロダクションルールの行動部に書かれたワーキングメモリに新しい事実を追加する行動を表している。 図1に書かれているように、MakeActionクラスはオブジェクトを一個持っている。 これは、発火時にワーキングメモリに追加するべき事実を表したオブジェクトで 属性値に定数または変数を含むものである。 従って、このままでは発火時にワーキングメモリに事実を追加することはできず、 これを具体的な定数に直し、発火可能な行動を生成しなければならない。
それを行うためのメソッドがinstantiateメソッドであり、 MakeActionクラスのinstantiateメソッドのC++コードを以下に示す。
FireableActionPtr MakeAction::instantiate() const { return FireableActionPtr(new FireableMakeAction(object_->instantiate())); }
MakeActionクラスのinstantiateメソッドは、 オブジェクトのinstantiateメソッドを呼び具体化した値を使って FireableMakeActionインスタンスを生成していることがわかる。
FireableMakeActionクラスは、 MakeActionクラスと違って実際にワーキングメモリに追加するべき具体的な事実を持った発火可能な行動を表すクラスである。 図1に書かれているように、FireableMakeActionクラスは事実を一個持っている。 FireableMakeActionクラスは、発火すると持っている事実をワーキングメモリに追加する。
それを行うためのメソッドがfireメソッドであり、 FireableMakeActionクラスのfireメソッドのC++コードを以下に示す。
bool FireableMakeAction::fire(ProductionSystem& system, const Instance& instance) { return system.getWorkingMemory().add(fact_); return true; }
FireableMakeActionクラスは、持っている事実をそのままワーキングメモリに追加し、 ワーキングメモリに既に同一の事実が含まれている場合は失敗することから、 その結果をそのまま返していることがわかる。
MakeActionクラスとFireableMakeActionクラスで見てきたように、 行動を定義することは比較的簡単である。 新しい行動を定義するためには、 まずActionクラスとFireableActionクラスの双方の子クラスを一つずつ構築する。 さらに、ActionクラスのinstantiateメソッドをオーバーライドしFireableActionインスタンスを生成する記述を書く。 また、FireableActionクラスではfireメソッドをオーバーライドし具体的な行動を書けば良い。
本章では、 Actionクラス・FireableActionクラス・MakeActionクラス・FireableMakeActionクラスという 行動について説明を行った。 以上でSmallOPSを構成する基本的な構成要素についてはあらかた説明した。 プロダクションルールは、 ConditionクラスやActionクラスの集合として定義される簡単なものでこれについて深くは説明しない。 詳しくは付属のソースコードを参照して欲しい。 次章では、動作に深く関わる話としてSmallOPSの競合解消機構についての説明を行う。