这篇文章建议添加一些事实类作为嵌套规则的一种方式。http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681
我想知道的是-是否可以保证“年龄和性别的女性”在“孕妇”之前执行,“孕妇”在“孕妇2”之前执行?到目前为止,我注意到我的应用程序总是如此。但是,它是在流口水文档中的某个地方记录的,还是只是等待崩溃的纸牌屋?
rule "Age and gender women"
when
$p : Person(p1 >= 12 && p2 = 1)
then
insertLogical( new CouldHaveBeenPregnant($p) );
end
rule "Pregnant"
when
$p : Person(p3 > 1)
CouldHaveBeenPregnant( person == $p )
then
insertLogical( new HasBeenPregnant($p) );
end
rule "Pregnant2"
no-loop
when
$p : Person(p4 <= P3)
HasBeenPregnant( person == $p )
then
$p.setStatus("OK");
update($p);
end
预先感谢您的帮助
编辑:我的问题出现在我必须添加一条新规则,比如说“不怀孕”时,当person不是HasBeenPregnant(person == $ p)时,我必须做些事情。推断原理有时不起作用(正如预期的那样)。因为有时“不怀孕”规则首先被执行,后来又证明该人怀孕了,即“怀孕”后来才成立。但是“未怀孕”的结果已经开始。
那么,关于如何克服这一点的任何建议?
当规则全部匹配时,不能保证评估规则的顺序。但是,在上面的示例中,订单以最佳方式被强制执行。
当工作记忆中存在具有适当属性的“人”事实时,将激活第一条规则。
第二条规则只有在工作记忆中存在一个Person并引用该人的事实CouldHaveBeenPregnant时才会激活。仅在激活并插入规则1后,CouldHaveBeenPregnant才会在工作内存中。
同样,只有在具有匹配属性的Person和引用该Person的HasBeenPregnant事实时,第三条规则才会激活。HasBeenPregnant事实仅由第二条规则插入。
即,规则3直到规则2之后才能激活,规则3直到规则1之后才能激活。
这就是所谓的“推理”,是进行良好规则设计的重要工具。Mark Proctor(Drools的负责人)在这里写了一篇不错的博客文章:
http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句