2017-07-26 8 views
0

ファクトデータベースで定義されたより厳しい時間制限を持つルールに優先順位を付けるために、LHSでバインドされた変数を使用してルールの顕著性を宣言します。私は次のように動作するはず考え出し:ルール定義内の顕著性宣言の変数の使用

(set-salience-evaluation when-activated) 
(deffunction testsal (?a ?b) (integer (+ ?a ?b))) 
(defrule testr 
    (declare (salience (testsal ?a 4))) 
    (sal ?a) 
    ?tf <- (fire testr) 
    => 
    (printout t "Running testr") 
    (retract ?tf) 
) 
(assert (sal 3)) 
(assert (fire testr)) 

しかし、これはエラーで失敗します。

[EVALUATN1] Variable a is unbound 
[PRCCODE6] This error occurred while evaluating arguments for the deffunction testsal. 

[PRNTUTIL8] This error occurred while evaluating the salience for defrule testr. 

ERROR: 
(defrule MAIN::testr 
    (declare (salience (testsal ?a 4) 

ルールの顕著性宣言でLHSにバインドされている変数を使用する方法はありますか?

もしそうでなければ、ファクトベースのいくつかの事実に応じて優先順位をつける一般的な方法は何ですか?ルールの実行を拒否したくないので、他のルールの優先順位を付けたいので、LHSに制約を追加するだけではうまくいかない可能性があります。

答えて

0

グローバル変数ではなく、実際に使用してください:私は

CLIPS> (set-salience-evaluation when-activated) 
when-activated 
CLIPS> (defglobal ?*sal-a* = 0) 
CLIPS> 
(defrule testr 
    (declare (salience (+ ?*sal-a* 4))) 
    ?tf <- (fire testr) 
    => 
    (printout t "Running testr") 
    (retract ?tf)) 
CLIPS> (bind ?*sal-a* 3) 
3 
CLIPS> (assert (fire testr)) 
<Fact-1> 
CLIPS> (agenda) 
7  testr: f-1 
For a total of 1 activation. 
CLIPS> 
+0

をしかし、私は、顕著性がルールの接地に依存することはできません、できますか?私の目標は、2つの異なる根拠を持って活性化できるルールを持つことです。もう1つは優先順位をつけたいと思います。 – morxa

+0

グローバルの値をパターンでバインドすることができます(sal?a&:(bind?* sal-a *?a))。ただし、これが正しく動作するためには、各ルールに独自のグローバル変数が必要です。 –

関連する問題