SmallOPS を発展させた Toy Open Production System を SourceForge.jp にて公開しています。
また、本コンテンツを書くに辺り、以下の参考書を参考にしています。
SmallOPS(Small Official Production System)とは、 C/C++で書かれたOPS5と似た文法を持つ簡単な前向き推論型のプロダクションシステムである。 SmallOPSは、プロダクションシステムの諸概念がクラスとしてすっきり表現されているため その構成がわかりやすいのが特徴である。 これ以降の教材としてSmallOPSを取り上げるため、 まずは以下のリンクをたどりそのソースコードをダウンロードしておくと便利である。
SmallOPSは、文法解析にantlr 2.7.0というパーサジェネレータを使用している。 従って、以上のソースコードをコンパイルするためには、 antlrを事前にセットアップしておくことが必要である *1。 antlrはマルチプラットフォームを意識して製作されたパーサジェネレータであり、 UNIX・Linux・Windowsのいずれの環境でも動くものである。 また、SmallOPS自体もマルチプラットフォームを意識して製作したものである。 従って、場合によっては多少のコード修正を行う必要があるが UNIX・Linux・Windowsのいずれの環境でもコンパイルできると期待される。 SmallOPSには、Windows環境用にMicrosoft Visual C++ 6.0用のプロジェクトファイルと UNIX・Linux環境用に簡単なMakefileが用意されている。
また、メモリ管理を簡略化するために本プログラムではスマートポインタを多用しており、 そのためにBoost C++ Librariesというライブラリをセットアップしておくことも必要である。 スマートポインタについては以下のページの説明を参考にするといくらかの知識を得ることができる。
全ての人が以上のソースコードを自分でコンパイルして、 動かしながら本ページを読み進めるられることが望ましい。 しかし、コンパイルするためにはantlrのセットアップや場合によってはソースコードの修正などを行う必要があり、 またコンパイルする環境を持っていない人などがいることも予想されることから 本ページでは、SmallOPSの実行結果を出力するCGIプログラムを用意した。 以下のフォームの実行ボタンを押すと、新しいウィンドウにSmallOPSの実行結果が出力される。
ソースコードをわざわざダウンロードしてコンパイルするのが面倒と思われる方も、 プロダクションシステムとはどういうものなのか、まずは雰囲気だけでも味わっていただけたらと思う。 SmallOPSの仕様に関しては以下で説明している。
SmallOPSはOPS5と同じ文法を持っているため、 事実およびプロダクションルールで使用される基本的な要素はOAV形式で表現される。 そのうちOPS5と異なるのは、属性値に書くことのできる値である。 SmallOPSで書くことのできる属性値は以下の3つである。
名前を表す記号で、英字・数字からなる文字列のこと。例:smallops, ops5
符号・数字からなる整数値のこと。例:0, 10, 123
<, >によって囲まれた文字列を変数名とする可変な値のこと。例:<name>, <time>
アトムとは、名前を表す記号であり英字・数字からなる文字列である (SmallOPSは日本語には対応していない点に注意)。 それに対して、整数値は数字だけからなる値である。
また、行動部にはワーキングメモリに新しい事実を追加するmakeだけが使用可能である。
これらの文法に関しては、antlr 2.7.0が使われている。 library/parser/parser.gがantlrへの入力となる文法ファイルである。
SmallOPSは競合解消を行う戦略として、以下に示すような単純なアルゴリズムを採用している。
一度実行した例化を二度以上実行しない。
最初にマッチした例化を実行する。 マッチングはルールベースにプロダクションルールを入れた順序で行われるため、 早く入れたプロダクションルールほど早く発火する。