2016-04-01 39 views
0

在傑斯的方式返回一個值從規則中返回一個字符串就是這樣:從規則傑斯或滴料(專家系統)

(defrule welcome-toddlers 
"Give a special greeting to young children" 
(person {age < 3}) 
=> 
(printout t "Hello, little one!" crlf)) 

我的問題是如何實現的返回功能,這就是我想要:

(defrule welcome-toddlers 
"Give a special greeting to young children" 
(person {age < 3}) 
=> 
(return "Hello, little one!")) 

如果不可能如何做在drools?

回答

3

規則不像函數那樣調用 - 所以你的問題沒有意義。由於工作記憶中發生的事情,規則會以某種(顯然)隨機的順序發生 - 那麼這些規則中的某個字符串應該放在哪裏? (run)函數(fireAllRules方法)只返回被觸發的規則的數量,就是這樣。

你想從歡迎小孩那裏得到那個字符串?必須選擇將規則中創建的數據傳遞到應用程序中的那一點。這裏有一些流行的選項:

  1. 聲明並設置一個全局,它可以存儲來自規則的所有結果。可以是列表或地圖 - 請選擇。
  2. 在工作記憶中插入結果作爲事實。也許你需要定義一些簡單的模板來保存值和標識。您可以使用API​​從某些Java應用程序代碼中獲取這些事實。
  3. 將該值存儲到負責觸發規則的事實中,例如,將一個插槽greeting添加到人並將其存儲在那裏。 (注意不要造成無盡的循環。)
  4. 也可以在Java類中設計一些靜態方法來處理值並適當地存儲它。你可以從結果(「何時」部分)中調用它。

除了術語上的差異外,它在Drools中也是一樣的。

這兩個系統都有文檔,您可以在其中找到有關此問題和其他問題的所有詳細信息。

+0

感謝您的解釋。 –