2014-03-12 26 views
1

我在我的Jess代碼中有一些規則,我想修改工作內存中的兩個事實。如何修改工作內存中的Jess multislot事實

已宣稱的事實是:(assert (analysis (reasons $?c) (total ?t))))

原因$?c是一個多時隙,我想,如果需要規則添加到這個多時隙。

例如:如果一個用戶喝了太多的酒,我想要的文字是「您正在喝很多不安全的酒。」作爲字段添加到多時隙(reasons $?c)。 我將如何實現這一任務。我做了大量的研究並嘗試了幾種方法,但它們工作不正常。

回答

1

有點預防措施應作出:

(defrule match 
;; (declare (no-loop true)) 
    ?t <- (Thing (what ?x)) 
    ?b <- (Box (id ?id)(things $?things&:(not (member$ ?x $?things)))) 
=> 
    (printout t ?id " not contains " ?x crlf) 
    (modify ?b (things (list $?things ?x))) 
) 

無論您使用無環子句或者什麼通常被認爲是更精明的方法,則使用一個約束來確保規則可能添加的項目不在列表中;特別是當一個特定的「原因」可以由多個規則添加時。

+0

我成功使用每個規則中的成員$函數不會導致我以前遇到的循環。我的多插槽現在已經成功修改,但我正在開發打印多插槽內容的第二項任務?如何一次打印出多行「原因」的內容? – Zain

+0

我已經打印出我的多時隙的內容,現在可以,但內容全部在輸出線上連接在一起。有沒有一種方法可以在各條線上分別打印多插槽的值。 – Zain

+0

你必須寫一個小小的函數,執行'(foreach?el?list ...)'。詳情請參閱Jess手冊。 – laune

1

也許不是最好的方式,但其實很簡單:讓規則不循環

(defrule modify-something 
?f <- (analysis (reasons $?c) (total ?t)))) 
=> 
(modify ?f (reasons (create$ ?c "hey"))))