Используя Джесса в качестве движка правил, мы можем утверждать, что какой-то свидетель видел человека в каком-то месте и со временем:
(deffacts witnesses
(witness Batman Gotham 18)
(witness Hulk NYC 19)
(witness Batman Gotham 2)
(witness Superman Chicago 22)
(witness Batman Gotham 10)
)
С правилом я хочу знать, видели ли несколько свидетелей одного и того же человека в одном и том же месте, не считая времени.
В документации Jess мы получили этот пример для подсчета сотрудников, создающих библиотеки по 100 КБ и более:
(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)
потому что мы видели Бэтмена три раза в Готэме.
Я понятия не имею, как использовать условную часть (CE) в части «накопить». Могу ли я использовать «тест», чтобы сохранить факты с одним и тем же человеком и местом?
Есть идеи, как этого добиться?
Спасибо!
Примечание: синтакс "накапливать" равен
(accumulate <initializer> <action> <result> <conditional element>)