SmallOPS を発展させた Toy Open Production System を SourceForge.jp にて公開しています。
また、本コンテンツを書くに辺り、以下の参考書を参考にしています。
SmallOPSには、アトムと整数と変数の3つの値が存在するが、 アトムと整数をまとめて定数という。 前章で説明したとおり事実の属性値が取り得る値は、アトムと整数の定数であり変数は含まれない。 また、変数が取り得る値は定数であり、すなわちアトムと整数のいずれかである。 これらの関係を以下のクラス図に示す。
Valueクラスは、全ての値のルートクラスで抽象クラスである。 AtomクラスもIntegerクラスもVariableクラスもすべてValueクラスの子(あるいは孫)クラスとして定義されている。 また、AtomクラスとIntegerクラスはValueクラスとの中間クラスとしてConstantクラスがある。 このConstantクラスも抽象クラスである。 Variableクラスは、値として定数を持つためConstantクラスと関連を持っている。
Valueクラス・Constantクラスが持っている unificateメソッド・instantiateメソッド・equalsメソッドそれぞれの抽象メソッドについて以降で説明する。
Constantクラスのequalsメソッドは、 前章で説明したFactクラスのequalsメソッドで呼び出されるメソッドで 値同士が同一であることを判断するメソッドである。 以下に、AtomクラスとIntegerクラスのunificateメソッドのC++コードを示す。
bool Atom::equals(const Constant& constant) const { const type_info& ti=typeid(constant); if(ti==typeid(Atom)) { const Atom* atom=dynamic_cast<const Atom*>(&constant); return atom_==atom->atom_; } else { return false; } } bool Integer::equals(const Constant& constant) const { const type_info& ti=typeid(constant); if(ti==typeid(Integer)) { const Integer* integer=dynamic_cast<const Integer*>(&constant); return value_==integer->value_; } else { return false; } }
値が同一であるというのは、 まず型*1 が同じであり、かつ持っている値が同じであるということである。
Valueクラスのinstantiateメソッドは、 前章で説明したConditionクラスのconditionメソッドで呼び出されるメソッドで 値同士のマッチングを行うメソッドである。 定数の場合、同一の値を持つ場合はマッチング成功とし、異なる値を持つ場合はマッチング失敗とする。 以下に、ConstantクラスのunificateメソッドのC++コードを示す。
bool Constant::unificate(const Constant& constant, Variables& variables) { return equals(constant); }
同一の値を持つかどうかを判断するメソッドとして定数は既にequalsメソッドが定義されているので、 unificateメソッドはそれをそのまま呼び出している。
それに対して変数で行われるマッチングは、以下のように行われる。
従って、対応するC++のコードは以下のようになる。
bool Variable::unificate(const Constant& constant, Variables& variables) { // 空の場合は代入する if(empty()) { // 既に登録されている場合は失敗する if(!variables.add(this)) { return false; } else { value_=&constant; return true; } } // 空で無い場合は中身を比較する else { return constant.equals(*value_); } }
このような処理のことを単一化(unification)という。
Valueクラスのinstantiateメソッドは、 前章で説明したObjectInOperationクラスのinstantiateメソッドで呼び出されるメソッドで 変数を具体的な定数の値に変換するメソッドである。 定数の場合、instantiateメソッドはそれ自身と同じ定数を返すだけである。 以下に、AtomクラスとIntegerクラスのinstantiateメソッドのC++コードを示す。
ConstantPtr Atom::instantiate() const { return ConstantPtr(new Atom(atom_)); } ConstantPtr Integer::instantiate() const { return ConstantPtr(new Integer(value_)); }
特徴的なのは、変数の場合であり、その対応するC++のコードを以下に示す。
ConstantPtr Variable::instantiate() const { if(empty()) { return ConstantPtr(new Null()); } else { return value_->instantiate(); } }
Variableクラスは、変数の値が空の場合はNULL定数を返し、 変数の値が入っている場合はその変数の値を返す。
本章では、 Valueクラス・Constantクラス・Atomクラス・Integerクラス・Variableクラスという 定数や変数について説明を行った。 次章では、行動についての説明を行う。