2017-08-25 68 views
0

我一直在学习Drools,并且实现了一个简单的程序。但是,输出结果并不符合我的预期。流口水规则的意外输出

规则.drl文件:

rule "Is of valid age" salience 10 
    when 
     $a: Applicant (getAge() > 18) 
    then 
     $a.setValid(true); 
     System.out.println($a.getName() + " is eligible for driving license!"); 
end 

rule "Can by alcohol" salience 1 
    when 
     $a: Applicant(isValid() == false); 
    then 
     System.out.println($a.getName() + " cannot buy alcohol!"); 
end 

在主我插入笑着申请对象:

Applicant applicant1 = new Applicant("Berat", 20, 2010); 
kieSession.insert(applicant1); 
kieSession.fireAllRules(); 
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid()); 

当我火了所有规则,对这个对象的输出是:

培拉特有资格驾驶执照!
培拉特不能买酒!
培拉特有效年龄:真正

虽然,我给的规则优先级和显着性的关键字,“可以通过醇”规则仍然被解雇。它不应该被解雇,因为在第一个规则中,isValid(true)被执行,并且在第二个规则中isValid()== false检查应该返回false,所以应该错过部分。

+0

我认为行为是正确的突显定义了优先级,所以高显着性规则先执行,然后再执行另一个 – mhasan

+0

由于申请者对象的年龄超过18岁,因此应该执行setValid(true)以便在“Can by by alcohol”规则中, isValid()== false应该返回false,并且规则的部分不应该被执行。 – InstantCrush

回答

1

声明

$a.setValid(true); 

不设置有效期为true申请人,但这不会传播到Drools的规则引擎。你需要

modify($a){ setValid(true) } 

对于其他较低显着性规则来看正确的设置。

收回事实只是隐藏了问题。

0

我认为显着性只定义执行顺序。

您可以在then条款的有效年龄规则中尝试retract($a)

+0

这解决了我的问题,谢谢你的建议。 – InstantCrush