対処する必要がある問題が2つあります。 1つは、定義したパターンが同じ事実に複数回一致する可能性があるということです(センサーL1
はa
、b
、および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センサの総数を計算し、あなたの閾値と比較してください)。ここで
の価値を持っている、あなたは正確に何をしようとしたのですか?いくつかのコードを共有する...あなたは質問する前に検索しましたか?私たちはあなたのためのプログラムを作ることを期待することはできません....あなたはあなたのプログラムをデバッグすることができます... –
あなたはこれらの詳細を追加する質問を編集する必要があります:) –
@AcelasiEuは私を助けることができますか? –