2013-12-16 10 views
7

環境を監視するセンサーが10個あります。 OKの場合は1、そうでない場合は0になります。 少なくとも3つのセンサーが0にあり、メッセージの警告が1回だけ表示される場合、端末に警告メッセージを出力する機能を作成する必要があります。これはクリップで行う必要があります。クリップ - 小さなルーチンプログラム

ありがとうございます。

(deffacts listaSenzor 
    (sensor L1 0) 
    (sensor L2 0) 
    (sensor L3 1) 
    (sensor L4 1) 
    (sensor L5 1) 
    (sensor L6 1) 
    (sensor L7 0) 
    (sensor L8 1) 
    (sensor L9 0) 
    ) 
    (defrule rr 
     (sensor ?a 0) 
     (sensor ?b 0) 
     (sensor ?c 0) 
     => 
     printout t ?a ?b ?c "==>WARNING" crlf) 
     ) 
+0

の価値を持っている、あなたは正確に何をしようとしたのですか?いくつかのコードを共有する...あなたは質問する前に検索しましたか?私たちはあなたのためのプログラムを作ることを期待することはできません....あなたはあなたのプログラムをデバッグすることができます... –

+0

あなたはこれらの詳細を追加する質問を編集する必要があります:) –

+0

@AcelasiEuは私を助けることができますか? –

答えて

2

対処する必要がある問題が2つあります。 1つは、定義したパターンが同じ事実に複数回一致する可能性があるということです(センサーL1ab、およびcにバインドされます)。この問題を回避するには、a,b、およびcが一意であることを確認する必要があります。次のようにこれを行う1つの方法です(私も)あなたのprintout文の前に「(」不足している追加したことに注意してください:

(deffacts listaSenzor 
    (sensor L1 0) 
    (sensor L2 0) 
    (sensor L3 1) 
    (sensor L4 1) 
    (sensor L5 1) 
    (sensor L6 1) 
    (sensor L7 0) 
    (sensor L8 1) 
    (sensor L9 0)) 
(defrule rr 
    (sensor ?a 0) 
    (sensor ?b 0) 
    (sensor ?c 0) 
    (test (neq ?a ?b)) 
    (test (neq ?a ?c)) 
    (test (neq ?b ?c)) 
=> 
    (printout t ?a ?b ?c "==>WARNING" crlf)) 

はあなたの事実に対して、このルールを実行できます:

CLIPS> (reset) 
CLIPS> (run) 
L9L7L2==>WARNING 
L9L7L1==>WARNING 
L9L2L7==>WARNING 
... 
L1L2L7==>WARNING 
L2L1L7==>WARNING 

3つ以上のOKセンサが存在する場合にのみ警告が生成されますが、出力には2回目の問題が表示されます。警告は複数回生成されます。これを回避するには、ルールが複数回発生するのを防ぐためのコントロールファクトが必要です。これを達成するには、ルールを変更することができます以下でeは:

(defrule rr 
    (not (sensor-warning)) 
    (sensor ?a 0) 
    (sensor ?b 0) 
    (sensor ?c 0) 
    (test (neq ?a ?b)) 
    (test (neq ?a ?c)) 
    (test (neq ?b ?c)) 
=> 
    (assert (sensor-warning)) 
    (printout t ?a ?b ?c "==>WARNING" crlf)) 

これは(あなたがsensor-warning事実を撤回しない限り)ルールは一度だけ発動するようになります。更新されたルールで実行:

CLIPS> (reset) 
CLIPS> (run) 
L9L7L2==>WARNING 
CLIPS> 

これは簡単な問題解決方法です。ルールをトリガすべきnot-OKセンサの数を変更する可能性が高い場合は、「ハード配線」センサ名の比較をより一般的なロジックに置き換える必要があります(たとえば、not-OKセンサの総数を計算し、あなたの閾値と比較してください)。ここで

2

はそれを行うための別の方法です:

(deftemplate sensor 
    (slot id) 
    (slot value)) 

(deffacts listaSenzor 
    (sensor (id L1) (value 0)) 
    (sensor (id L2) (value 0)) 
    (sensor (id L3) (value 1)) 
    (sensor (id L4) (value 1)) 
    (sensor (id L5) (value 1)) 
    (sensor (id L6) (value 1)) 
    (sensor (id L7) (value 0)) 
    (sensor (id L8) (value 1)) 
    (sensor (id L9) (value 0))) 

(defrule rr 
    (exists 
     (sensor (id ?id1) (value 0)) 
     (sensor (id ?id2&~?id1) (value 0)) 
     (sensor (id ?id3&~?id2&~?id1) (value 0))) 
    => 
    (bind ?sensors (create$)) 
    (do-for-all-facts ((?f sensor)) (eq ?f:value 0) 
     (bind ?sensors (create$ ?sensors ?f:id))) 
    (printout t (str-implode ?sensors) " ==> WARNING" crlf)) 

以上の3がある場合、これは、センサのすべてを印刷します0

CLIPS> (reset) 
CLIPS> (run) 
L1 L2 L7 L9 ==> WARNING 
CLIPS>