0

ルールエンジンとしてジェスを使用すると、ある目撃者が、ある場所で、関連する時間とともに人を見たという事実を主張することができます。

(deffacts witnesses
    (witness Batman Gotham 18)
    (witness Hulk NYC 19)
    (witness Batman Gotham 2)
    (witness Superman Chicago 22)
    (witness Batman Gotham 10)
)

原則として、時間を考慮せずに、複数の目撃者が同じ場所で同じ人物を見たことがあるかどうかを知りたい。

Jessのドキュメントでは、10万以上の給与を稼ぐ従業員を数えるための次の例を取得しました。

(defrule count-highly-paid-employees
    ?c <- (accumulate (bind ?count 0)                        ;; initializer
    (bind ?count (+ ?count 1))                    ;; action
    ?count                                        ;; result
    (employee (salary ?s&:(> ?s 100000)))) ;; CE
    =>
    (printout t ?c " employees make more than $100000/year." crlf))

したがって、前の例に基づいてコードを作成しました。

(defrule count-witnesses
    (is-lost ?plost)
    (witness ?pseen ?place ?time)
    ?c <- (accumulate (bind ?count 0)
    (bind ?count (+ ?count 1))
    ?count
    (test ())  ; conditional element of accumulate
    (test (= ?plost ?pseen))
    (test (>= ?count 3))
    =>
    (assert (place-seen ?place))
)

上記の「(deffacts)」命令とルールを使用して、エンジンはファクトをアサートする必要があります

(place-seen Gotham)

バットマンがゴッサムで3回見たからです。

'accumulate'の条件要素(CE)部分の使用方法がわかりません。「テスト」を使用して、同じ人物と場所の事実を保持できますか?

これを達成する方法はありますか?

ありがとうございました!


注:「accumulate」のsynthaxは

(accumulate <initializer> <action> <result> <conditional element>)
4

1 に答える 1

1

?plostあなたがそれが何であるかを正確に説明していないので、私はについてのことを省くつもりです。必要に応じて、自分で追加し直すことができます。

(ほぼ)あなたが望むことをする基本的なルールは次のとおりです。あなたが得ていなかったCEの部分は、私たちが蓄積したいパターンにすぎません。ここでは、最初の人が照合した事実と同じ場所で目撃した同じ人物と事実を照合します。

(defrule count-witnesses
  ;; Given that some person ?person was seen in place ?place
  (witness ?person ?place ?)  
  ;; Count all the sightings of that person in that place  
  ?c <- (accumulate (bind ?count 0)
                    (bind ?count (+ ?count 1))
                    ?count
                    (witness ?person ?place ?))
  ;; Don't fire unless the count is at least 3
  (test (>= ?c 3))
  =>
  (assert (place-seen ?person ?place))
)

deffactsさて、このルールの唯一の問題は、バットマン/ゴッサムの事実のすべてに対して1回ずつ、あなたのために3回発砲することです。これを止めるには、最初のパターンを変更して、特定の場所での人の最も早い目撃にのみ一致させます。

(defrule count-witnesses
  ;; Given that some person ?person was seen in place ?place, and there is no other 
  ;; sighting of the same person at the same place at an earlier time
  (witness ?person ?place ?t1)    
  (not (witness ?person ?place ?t2&:(< ?t2 ?t1)))
  ;; Count all the sightings of that person in that place  
  ?c <- (accumulate (bind ?count 0)
                    (bind ?count (+ ?count 1))
                    ?count
                    (witness ?person ?place ?))
  ;; Don't fire unless the count is at least 3
  (test (>= ?c 3))
  =>
  (assert (place-seen ?person ?place))
)
于 2012-02-12T19:37:40.040 に答える