えちょ記

語らないブログ

CLIPS!

ルールエンジンという分野をかなり適当に紹介しただけで置いとくのは色々と無責任であり結局使える物はあるのかという可及的速やかな要求を満たすべくあちこち調べてたのですが。

結論から言うと、SHIORIから呼べそうな組み込みタイプのものは、CLIPSの一択ですね。

C Language Integrated Production System(C言語統合型プロダクションシステム)

これ以外はJavaスクリプト言語上のフレームワークなので、外部エンジンとして使うには大きすぎるのですが、このソフトは名前のとおり、C言語インターフェースのルール駆動型推論エンジンです。というか、NASAで1984年より開発が始まった、由緒正しい草分け的存在。

ルールとは?

「ある条件が満たされたときに」「あることを実行する」という決め事です。Wikipediaに挙げられている例をそのまま下に引用。

(deffacts trouble_shooting
  (car_problem (name ignition_key) (status on))
  (car_problem (name engine) (status wont_start))
  (car_problem (name headlights) (status work))
)
(defrule rule1
  (car_problem (name ignition_key) (status on))
  (car_problem (name engine) (status wont_start))
   =>
  (assert (car_problem (name starter) (status faulty))
)

これを超訳するとこうなります。

  • rule1の条件は?
    • 1:「車のキー」が「ON」になっている
    • 2:「車のエンジン」が「かからない」
  • 何をする? => 「車のスターター」が「壊れている」という「事実」が判る!

事実とは?

これまでに判明した事柄です。上の例なら『「車のエンジン」が「かからない」』という内容。一般的なプログラムでいう変数とその内容、ですね。そして、その事実が判ったことを、「assert」構文でCLIPS(推論エンジン)に伝えることができます。いわゆる変数への代入ですが、これを「発火」と表現します。

どんな風に動く?

上記のルールは、一般的なプログラムのようにIf文の羅列ではありません。ルール1、ルール2‥‥と、基本的には前後関係とかあまり考えずにずらずらと並べておきます。

ルールは薪です。ひたすらカマドにくべた後、おもむろに「事実」という種火を「発火(assert)」します。あとはカマドのなすがまま。

CLIPSは現在判明している事実に一致する条件のルールを1つ選択します(複数一致する場合でも設定した優先順位ルールにより1つに限定されます)。そしてルールを実行します。ルールの実行中に新たな「事実」が発火すれば、その事実を加えた条件に一致する別のルールを探します。

焼け跡に見つかるもの

最終的に一致する条件のルールが見つからなくなるまで処理が進めばカマドの火は消えます。火が消えるまでに燃え上がったルールが、プログラムの実行結果です。なお、CLIPSでは原則、1回の実行(推論)では、同一ルールは1回しか発火しません(処理の無限ループを避けるため)。

CLIPS本体は静的ライブラリ・DLL両方が提供されています。また処理言語としてLispに似たCOOLという言語が実装されています。入出力文字列はUTF-8、内部的にはUNICODE(相当)、変数名などに漢字も使えるようです(ただし残念ながら提供されるデバッグコンソールのUNICODE対応が甘い)。

歴史の割に日本語の資料をあまり見かけないのですが、英文マニュアルの記述は非常に丁寧なので、SHIORI作れるような人ならそんな困らずに導入できるでしょう。組み込みにはもってこいですねー。

ていうか、これ。相当本格的な言語仕様です。入出力だけ繋げば単体でSHIORI作れますね。‥‥えーと、何かフラグたちました?関数言語の次のトレンドはルールエンジンなのか!などと思ったかもしれない。