从规则 jess 或 drools 返回一个值(专家系统)

Lah*_*Cen 1 java rule-engine drools expert-system jess

在 jess 中,从规则返回字符串的方法如下:

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

我的问题是如何实现返回功能,这就是我想要的:

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

如果不可能怎么办?

lau*_*une 6

规则不像函数那样被调用 - 所以你的问题没有意义。由于工作记忆中发生的事情,规则会以某种(显然)随机的顺序触发 - 那么来自这些规则之一的字符串应该去哪里呢?函数(run)fireAllRules方法)仅返回已触发的规则数量,仅此而已。

您希望将欢迎幼儿的字符串放在哪里?必须选择一种将规则中创建的数据传递到应用程序中的该点的方法。以下是一些流行的选项:

  1. 声明并设置一个能够存储规则中所有结果的全局变量。可以是列表或地图 - 您可以选择。
  2. 将结果作为事实插入工作记忆中。也许您需要定义一些简单的模板来保存值和标识。您可以使用 API 从某些 Java 应用程序代码中获取这些事实。
  3. 将值存储到负责触发规则的事实中,例如,greeting向 person 添加一个槽并将其存储在那里。(注意不要造成无限循环。)
  4. 还可以在 Java 类中设计一些静态方法来处理该值并适当地存储它。您可以从结果(“何时”部分)中调用它。

除了术语上的一些差异之外,Drools 中的内容是相同的。

这两个系统都有文档,您可以在其中找到此问题和其他问题的所有详细信息。