2009-09-24 66 views
0

我正在设计一个规则评估系统,它需要处理事实数据库和数据库的某些规则。我们目前有一个modified version of RETE,它有一些缺点,可以正常工作。规则评估系统和“不准确”匹配(ej:x <3000)

问题是规则不限制到精确匹配,但他们也必须支持不等式(如小于)种和其他模糊计算。

例子,假设你有这样的事实

(工资约翰58000) (工资萨拉78000) (员工约翰) (老板萨拉) (已婚约翰·萨拉) (工程约翰#1)

你可能有一个规则说:(?工资W¯¯< 60000)

/\(?已婚W)/ \(?工件W#1)==>无论

显然,结果会触发与规则?W“约翰”的价值,但我们正在做的,现在的方式是通过循环低谷的事实基础,第一个表达式的beggining匹配的每个元素(工资XX)然后进行比较并将结果存储在事实基础中。例如,第一遍后都会有以下产品加入的事实基础:

(工资约翰58000 < 60000)

,一旦被让你执行联接平时的RETE方式。这样它就占据了事实库中的很多空间,特别是因为规则可以引用任何数字,所以只要规则处于活动状态,就可以获得那些“计算出来的”事实。

在另一方面,你可以申请几个规则,第一个表达式,你可以保持使用标准的匹配算法来触发规则。

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

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

+0

你有没有考虑使用类似F#呢? – 2009-09-24 14:04:51

+0

为什么F#会是更好的选择?只是因为功能? – 2009-09-24 14:30:20

+0

有你看了CLIPS源 - > http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/areas/expert/systems/clips/0.html? – DaveParillo 2009-09-29 19:53:29

回答

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

据我明白的问题,所有的模糊规则划分的整数或浮点值的范围成子范围的数量有限。例如,如果将薪水与58000,660000,7800的值进行比较,则有4个范围:< 58000,58000-60000,660000-78000,> 78000。

如果是这样的话,也许你可以重新定义你的变量是要么0,1,2,3整数,从而将您的不平等规则平等的规则。