我在我的Jess代碼中有一些規則,我想修改工作內存中的兩個事實。如何修改工作內存中的Jess multislot事實
已宣稱的事實是:(assert (analysis (reasons $?c) (total ?t))))
原因$?c
是一個多時隙,我想,如果需要規則添加到這個多時隙。
例如:如果一個用戶喝了太多的酒,我想要的文字是「您正在喝很多不安全的酒。」作爲字段添加到多時隙(reasons $?c)
。 我將如何實現這一任務。我做了大量的研究並嘗試了幾種方法,但它們工作不正常。
我在我的Jess代碼中有一些規則,我想修改工作內存中的兩個事實。如何修改工作內存中的Jess multislot事實
已宣稱的事實是:(assert (analysis (reasons $?c) (total ?t))))
原因$?c
是一個多時隙,我想,如果需要規則添加到這個多時隙。
例如:如果一個用戶喝了太多的酒,我想要的文字是「您正在喝很多不安全的酒。」作爲字段添加到多時隙(reasons $?c)
。 我將如何實現這一任務。我做了大量的研究並嘗試了幾種方法,但它們工作不正常。
有點預防措施應作出:
(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)))
)
無論您使用無環子句或者什麼通常被認爲是更精明的方法,則使用一個約束來確保規則可能添加的項目不在列表中;特別是當一個特定的「原因」可以由多個規則添加時。
也許不是最好的方式,但其實很簡單:讓規則不循環
(defrule modify-something
?f <- (analysis (reasons $?c) (total ?t))))
=>
(modify ?f (reasons (create$ ?c "hey"))))
我成功使用每個規則中的成員$函數不會導致我以前遇到的循環。我的多插槽現在已經成功修改,但我正在開發打印多插槽內容的第二項任務?如何一次打印出多行「原因」的內容? – Zain
我已經打印出我的多時隙的內容,現在可以,但內容全部在輸出線上連接在一起。有沒有一種方法可以在各條線上分別打印多插槽的值。 – Zain
你必須寫一個小小的函數,執行'(foreach?el?list ...)'。詳情請參閱Jess手冊。 – laune