流口水规则的意外输出
Unexpected output from drools rules
我一直在学习 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
在 main 中我插入了一个简单的申请人对象:
Applicant applicant1 = new Applicant("Berat", 20, 2010);
kieSession.insert(applicant1);
kieSession.fireAllRules();
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid());
当我对这个对象触发所有规则时,输出是:
Berat is eligible for driving license!
Berat cannot buy alcohol!
Berat is of valid age: true
尽管我为每个带有 salience 关键字的规则赋予了优先级,"Can by alcohol" 规则仍然被触发。它不应该被触发,因为在第一条规则中执行了 setValid(true) 并且在第二条规则中 isValid() == false control should return false 因此应该遗漏部分。
我认为显着性只定义了执行顺序。
您可以在 then
子句的有效年龄规则中尝试 retract($a)
。
声明
$a.setValid(true);
确实将申请人的有效设置为真,但这不会传播到 Drools 规则引擎。你需要
modify( $a ){ setValid( true ) }
其他较低显着性规则以查看正确设置。
收回事实只会掩盖问题。
我一直在学习 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
在 main 中我插入了一个简单的申请人对象:
Applicant applicant1 = new Applicant("Berat", 20, 2010);
kieSession.insert(applicant1);
kieSession.fireAllRules();
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid());
当我对这个对象触发所有规则时,输出是:
Berat is eligible for driving license!
Berat cannot buy alcohol!
Berat is of valid age: true
尽管我为每个带有 salience 关键字的规则赋予了优先级,"Can by alcohol" 规则仍然被触发。它不应该被触发,因为在第一条规则中执行了 setValid(true) 并且在第二条规则中 isValid() == false control should return false 因此应该遗漏部分。
我认为显着性只定义了执行顺序。
您可以在 then
子句的有效年龄规则中尝试 retract($a)
。
声明
$a.setValid(true);
确实将申请人的有效设置为真,但这不会传播到 Drools 规则引擎。你需要
modify( $a ){ setValid( true ) }
其他较低显着性规则以查看正确设置。
收回事实只会掩盖问题。