这篇文章建议添加一些事实类作为嵌套规则的一种方式。 http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681
我想知道的是 - 是否保证“年龄和性别女性”在“怀孕2”之前执行,“怀孕2”之前执行“怀孕”? 到目前为止,我已经注意到在我的应用程序中始终如此。但是,它是在drools文档中的某处记录还是只是等待崩溃的纸牌屋?
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
提前感谢您的帮助
修改 当我必须添加一条新规则时,我的问题出现了,比如说“不怀孕”,当人不是HasBeenPregnant(person == $ p)时,我必须做些什么。推理原理有时不起作用(如预期的那样)。因为,有时候,“非怀孕”规则首先被执行,后来证明该人怀孕了,即“怀孕”后来变得真实。但“未怀孕”的结果已经开始。
那么,有关如何克服这个问题的任何建议吗?
答案 0 :(得分:1)
无法保证在所有规则匹配时评估规则的顺序。但是,在上面的示例中,订单以最佳方式被强制执行。
当具有适当属性的工作记忆中存在Person事实时,将激活第一条规则。
第二条规则不会激活,直到工作记忆中的人和一个名为CouldHaveBeenPregnant的事实来引用该人。当规则1已激活并插入时,HasHaveBeenPregnant仅在工作记忆中。
同样,第三条规则仅在有匹配属性和的人参与该人的HasBeenPregnant事实时激活。 HasBeenPregnant事实仅由第二条规则插入。
即。规则3直到规则2之后才能激活,规则2直到规则1之后才能激活。
这就是所谓的“推理”,是良好规则设计的重要工具。 Mark Proctor(Drools领导)在这里写了一篇很好的博客文章:
http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html