我正在设计一个规则评估系统,需要处理事实数据库和数据库上的某些规则。我们目前有modified version of RETE部分正确,有一些缺点。
问题是规则不限制精确匹配,但它们还必须支持不等式(如少于)和其他类型的模糊计算。
例子,假设你有这个事实
(薪水约翰58000) (Salary Sara 78000) (员工约翰) (Boss Sara) (已婚约翰萨拉) (Works John Stackoverflow)
你可能有一条规则说:
(薪水?w< 60000)/ \(已婚?w)/ \(Works?w Stackoverflow)==>无论
显然结果将触发带有“John”值的规则但我们现在这样做的方式是通过循环事实基础中与第一个表达式的开始匹配的每个元素(工资XX)然后进行比较并将结果存储在事实基础中。例如,在第一遍之后,您将以下项目添加到事实库中:
(薪金约翰58000< 60000)
并且一旦完成,就以通常的RETE方式执行连接。这样,它占用了事实库中的大量空间,特别是因为规则可以引用任何数字,因此只要规则处于活动状态,您就拥有那些“计算”的事实。
另一方面,您可以使用第一个表达式应用多个规则,并且可以继续使用标准匹配算法来触发规则。
是否有人知道处理此类行为的任何模式,参考或方法?通常的LEAPS,TREATS,RETE算法只处理(据我所知)“精确”匹配。
顺便说一下,这是C#.NET。
答案 0 :(得分:1)
CLIPS就支持条件元素 - 至少15年。有关示例,请查看basic programming guide for CLIPS和此CLIPS tutorial。您可以免费查看(或修改)剪辑源。
CLIPS使用前缀表示法,因此您的示例条件可能如下所示:
(defrule fat-boy
(person-data (name ?name) (weight ?weight))
(test (> ?weight 100))
=>
(printout t ?name " weighs " ?weight " kg! " crlf)
)
答案 1 :(得分:-1)
据我所知,所有模糊规则将整数或浮点值范围划分为有限数量的子范围。例如,如果将薪水与58000,60000,78000值进行比较,则您有4个范围:< 58000,58000-60000,60000-78000,> 78000。
如果是这种情况,也许您可以将变量重新定义为0,1,2,3的整数,从而将不等式规则转换为相等规则。