来自drools规则

时间:2017-08-25 12:22:42

标签: java drools

我一直在学习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

在主要内容中,我插入了一个simle申请对象:

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

当我向该对象发出所有规则时,输出为:

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

虽然,我给每个规则优先使用显着性关键字,“依据酒精”规则仍然被解雇。它不应该被触发,因为在第一个规则中执行setValid(true),而在第二个规则中,isValid()== false,控制应该返回false,因此部分应该被遗漏。

2 个答案:

答案 0 :(得分:1)

声明

 $a.setValid(true);

确实为申请人设置了有效,但是这不会传播到Drools规则引擎。你需要

 modify( $a ){ setValid( true ) }

其他较低的显着性规则,以查看正确的设置。

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

答案 1 :(得分:0)

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

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

相关问题