0

我正在设计一个规则评估系统,它需要处理事实数据库和数据库上的某些规则。我们目前有一个RETE 的修改版本,它部分正确,但有一些缺点。

问题是规则不限于精确匹配,但它们还必须支持不等式(如小于)和其他类型的模糊计算。

例子,假设你有这个事实

(Salary John 58000) (Salary Sara 78000) (Employee John) (Boss Sara) (Married John Sara) (Works John Stackoverflow)

你可能有一条规则说:

(薪水?w < 60000)/\(已婚?w)/\(工作?w Stackoverflow)==> 随便

显然,结果将触发 ?w 值为“John”的规则,但我们现在这样做的方式是循环遍历事实库中与第一个表达式 (Salary XX) 开头匹配的每个元素,然后进行比较并将结果存储在它自己的事实基础中。例如,在第一次通过后,您将在事实库中添加以下项目:

(工资约翰 58000 < 60000)

一旦完成,您就可以按照通常的 RETE 方式执行连接。这样它会在事实库中占用大量空间,特别是因为规则可以引用任何数字,因此只要规则处于活动状态,您就拥有那些“计算出的”事实。

另一方面,您可以使用第一个表达式应用多个规则,并且可以继续使用标准匹配算法来触发规则。

有谁知道处理这种行为的任何模式、引用或方法?通常的 LEAPS、TREATS、RETE 算法只处理(据我所知)“精确”匹配。

顺便说一下,这是 C# .NET。

4

2 回答 2

1

据我所知,CLIPS支持条件元素的时间至少有 15 年。查看CLIPS 的基本编程指南和此CLIPS 教程以获取示例。您可以免费查看(或修改)剪辑源。

CLIPS 使用前缀表示法,因此您的示例条件可能如下所示:

(defrule fat-boy
    (person-data (name ?name) (weight ?weight))
    (test (> ?weight 100))
=>
    (printout t ?name " weighs " ?weight " kg! " crlf)
)
于 2009-10-02T23:40:04.917 回答
-1

据我了解这个问题,所有模糊规则都将整数或浮点值范围划分为有限数量的子范围。例如,如果将薪水与 58000、60000、78000 值进行比较,则您有 4 个范围:<58000、58000-60000、60000-78000、>78000。

如果是这种情况,也许您可​​以将变量重新定义为 0、1、2、3 的整数,从而将您的不等式规则转换为等式规则。

于 2009-09-30T13:24:05.080 回答