2016-09-15 70 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) 

顯然,在foreach不喜歡我的名單? 需要注意的是,如果我刪除它時,(的foreach XXX),這一切工作正常,並給:

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

(我敢嘗試組中的一個火災或積聚在列表中的元素計)

任何人都知道如何直接從Jess迭代Java ArrayList?

回答

0

你的迭代代碼很好。問題是你將它包含在只允許模式(條件元素)的地方,而不是函數調用。您需要將「foreach」移動到規則的右側。

+0

LHS中沒有函數可以調用嗎?我想在決定是否觸發之前使用該函數來處理一些信息。也就是說,regrouper les在「全部」二階邏輯中發射。 –

+0

你的函數將不得不作爲條件元素的一部分。例如,參見「測試」CE。 –