Используя Джесс в качестве механизма правил, мы можем утверждать факт, что какой-то свидетель видел человека в каком-то месте и в определенное время:
(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))
)
С приведенной выше инструкцией '(defacts)' и правилом, движок должен подтвердить факт
(place-seen Gotham)
потому что Бэтмена мы видели трижды в Готэме.
Я понятия не имею, как использовать часть условного элемента (CE) «накопить». Могу ли я использовать «тест», чтобы сохранить факты об одном и том же человеке и месте?
Есть идеи, как этого добиться?
Спасибо!
Примечание: синтаксис слова «накапливать»
(accumulate <initializer> <action> <result> <conditional element>)