2016-09-15 2 views
0

есть мой dilemna:JessRules - Итерации над ArrayList

(defrule A15_test 
    ?list <- (accumulate (bind ?ll (new java.util.ArrayList)) ;; initializer 
       (?ll add ?id)        ;; action 
       ?ll          ;; result 
       (P (ID_Jess ?id) (m ?ref&:(neq ?ref nil))) 
       ) ;; CE 
    (foreach ?l ?list 
     (printout t "l:" ?l " " crlf) 
    ) 

=> 
    (printout t "FIRE ! c:" (?list toString) " end. " crlf) 

Что дает следующее сообщение об ошибке:

Jess reported an error in routine Jesp.parsePattern. 
    Message: Bad slot value at token '('. 
    Program text: (defrule A15_test ?list <- (accumulate (bind ?ll (new java.util.ArrayList)) (?ll add ?id) ?ll (P (ID_Jess ?id) (m ?ref & : (neq ?ref nil)))) (foreach ?l ?list ( at line 80 in file <eval pipe>. 
    at jess.Jesp.error(Unknown Source) 
    at jess.Jesp.a(Unknown Source) 
    at jess.Jesp.a(Unknown Source) 
    at jess.Jesp.a(Unknown Source) 
    at jess.Jesp.a(Unknown Source) 
    at jess.Jesp.if(Unknown Source) 
    at jess.Jesp.parseDefrule(Unknown Source) 
    at jess.Jesp.parseExpression(Unknown Source) 
    at jess.Jesp.promptAndParseOneExpression(Unknown Source) 
    at jess.Jesp.parse(Unknown Source) 
    at jess.Rete.eval(Unknown Source) 
    at jess.Rete.eval(Unknown Source) 
    at jesslanguage.JessExecutor.executeJess(JessExecutor.java:30) 
    at Main.testJessRules(Main.java:293) 
    at Main.main(Main.java:62) 

Очевидно, что Еогеасп не нравится мой список?. Обратите внимание, что если я удалю его, (Еогеасп XXX), все работает отлично и дать:

FIRE ! c:[p1, p3, p4] 
FIRE ! c:[p1, p3, p4] 

(который я пытаюсь группы в одном пожарном накопления или подсчета на элементах списка)

Кто-нибудь знает, как перебирать Java ArrayList прямо из Jess?

ответ

0

Ваш код итерации в порядке. Проблема заключается в том, что вы включаете его в место, где разрешены только шаблоны (условные элементы), а не вызовы функций. Вам нужно переместить «foreach» в правую часть правила.

+0

В LHS нельзя назвать никакие функции? Я хотел бы использовать функцию, чтобы манипулировать некоторой информацией, прежде чем принимать решение об увольнении или нет. I.e., regrouper les fires в «forall» логике второго порядка. –

+0

Ваши функции должны были бы быть частью условного элемента. См., Например, «тест» CE. –

Смежные вопросы