流口水规则的意外输出

Posted

技术标签:

【中文标题】流口水规则的意外输出【英文标题】:Unexpected output from drools rules 【发布时间】:2018-02-03 12:00:52 【问题描述】:

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

当我向这个对象触发所有规则时,输出是:

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

虽然,我用显着性关键字优先考虑每个规则,但“Can by Alcohol”规则仍然被触发。它不应该被触发,因为在第一条规则中 setValid(true) 被执行,而在第二条规则中 isValid() == false 控制应该返回 false 所以应该错过部分。

【问题讨论】:

我相信行为是正确的,显着性定义了优先级,因此高显着性规则首先执行,然后再执行另一个 由于申请人对象的年龄超过 18 岁,所以应该执行 setValid(true) 所以在“Can by Alcohol”规则中,isValid() == false 应该返回 false,并且规则的 then 部分不应该被执行. 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

声明

 $a.setValid(true);

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

 modify( $a ) setValid( true ) 

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

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

【讨论】:

以上是关于流口水规则的意外输出的主要内容,如果未能解决你的问题,请参考以下文章

当“缩进”规则设置为“制表符”时,ESLint“意外的制表符”

Sonarqube css:如何为前缀为“pr-”的选择器禁用“意外的未知类型”规则

Wordpress 239 字符意外输出错误

可枚举给出意外的输出

从文件读取的意外输出

继承的成员函数的意外输出