2017-09-05 4 views
1

私は別のプログラムにCLIPSを埋め込み、推論エンジンとして主に使用しています。私のルール条件はlogicalキーワードを使用して、ルールがサポートされなくなったときに、assertがルールのアクションとして実際に取り消されるようにします(BPGセクション5.4.8)。私は一般的に、タイプfoofooがファクトの最初のフィールドである、例えば(foo bar baz))のすべてのアサートされたファクトをチェックする必要があります。これを行うために、私はファクトリスト全体を解析してきましたが、これを行うことは減速の重要な原因になっています。事実がサポートを失ったときのCLIPSコールバック

私が気にする事実はすべて自分自身のルールで宣言されているので、興味のある事実が主張されていることを私のプログラムに通知するために各ルール内のコールバックを使用することを考えました。事実がアサートされたときに、それが収縮されたときではない。私は事実がサポートされなくなったときに発動する逆のルールを書く方法を思いつきましたが、うまくいくものを考え出すことができませんでした。私は、ルール条件全体をnotでラップする明白なアプローチを試みましたが、これはnot節の外で変数を使用することはできません。これはコールバックが正しく機能するために必要なものです。

事実のリストを反復処理以外のタイプfooのすべての事実を照会する明白な方法はありますか?または、ルール/ファクトがサポートを失ったときにコールバックを取得する方法はありますか?これはかなり簡単にできるはずですが、私がここで欠けているものがありますか?

答えて

1

あなたは事実のグループにアクションを取得し、実行するために、実際のクエリ機能を使用することができます。

CLIPS> 
(assert (foo bar baz) 
     (foo yak) 
     (foo woz bin bly)) 
<Fact-3> 
CLIPS> (find-all-facts ((?f foo)) TRUE) 
(<Fact-1> <Fact-2> <Fact-3>) 
CLIPS> 
(do-for-all-facts ((?f foo)) TRUE 
    (printout t ?f:implied crlf)) 
(bar baz) 
(yak) 
(woz bin bly) 
CLIPS> (deftemplate point (slot x) (slot y)) 
CLIPS> 
(assert (point (x 1) (y 2)) 
     (point (x 3) (y 4))) 
<Fact-5> 
CLIPS> 
(do-for-all-facts ((?f point)) TRUE 
    (printout t ?f:x " " ?f:y crlf)) 
1 2 
3 4 
CLIPS> 

埋め込まれたときに、検索-すべての事実は、コマンドを実行するEnvEval機能を使用して、その後の繰り返し処理ファクトリスト全体ではなく戻り値に格納されたファクト。

これらは文書化されたAPIはありませんが、あなたはEnvAddAssertFunctionとEnvAddRetractFunctionを使用してアサーションと撤回のためのコールバックを追加することができます。

関連する問題