第5章 値

参考

SmallOPS を発展させた Toy Open Production SystemSourceForge.jp にて公開しています。

また、本コンテンツを書くに辺り、以下の参考書を参考にしています。

5. 1. 定数と変数

SmallOPSには、アトムと整数と変数の3つの値が存在するが、 アトムと整数をまとめて定数という。 前章で説明したとおり事実の属性値が取り得る値は、アトムと整数の定数であり変数は含まれない。 また、変数が取り得る値は定数であり、すなわちアトムと整数のいずれかである。 これらの関係を以下のクラス図に示す。



図1: 値のクラス図

Valueクラスは、全ての値のルートクラスで抽象クラスである。 AtomクラスもIntegerクラスもVariableクラスもすべてValueクラスの子(あるいは孫)クラスとして定義されている。 また、AtomクラスとIntegerクラスはValueクラスとの中間クラスとしてConstantクラスがある。 このConstantクラスも抽象クラスである。 Variableクラスは、値として定数を持つためConstantクラスと関連を持っている。

Valueクラス・Constantクラスが持っている unificateメソッド・instantiateメソッド・equalsメソッドそれぞれの抽象メソッドについて以降で説明する。


5. 2. Constantクラスの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 が同じであり、かつ持っている値が同じであるということである。

*1: ここで言う型とは、AtomかIntegerかということである。

5. 3. Valueクラスのunificateメソッド

Valueクラスのinstantiateメソッドは、 前章で説明したConditionクラスのconditionメソッドで呼び出されるメソッドで 値同士のマッチングを行うメソッドである。 定数の場合、同一の値を持つ場合はマッチング成功とし、異なる値を持つ場合はマッチング失敗とする。 以下に、ConstantクラスのunificateメソッドのC++コードを示す。

bool Constant::unificate(const Constant& constant, Variables& variables) {
  return equals(constant);
}

同一の値を持つかどうかを判断するメソッドとして定数は既にequalsメソッドが定義されているので、 unificateメソッドはそれをそのまま呼び出している。

それに対して変数で行われるマッチングは、以下のように行われる。

  1. 変数が空の場合は、変数の値をマッチングした定数とし、マッチング成功とする。
  2. 変数が空で無い場合は、変数の値と同一かどうかを判断しマッチング結果とする。

従って、対応する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)という。


5. 4. Valueクラスのinstantiateメソッド

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クラスという 定数や変数について説明を行った。 次章では、行動についての説明を行う。

前へ:OAV形式のデータ
次へ:行動