gpt4 book ai didi

drools - '&&' 或 ',' "short-circuit"会在流口水 LHS 中吗?

转载 作者:行者123 更新时间:2023-12-01 19:28:58 31 4
gpt4 key购买 nike

我想是的,但我不太确定。例如:

class Person {
int age;
int salary;
int bonus;
//getter and setter

public int calcIncome () {
return salary + bonus;
}
}

drl:

when 
$p:Person(age > 30, calcIncome() > 1000)
then
...

它是否等于:

    if (person.getAge() > 30 && person.calcIncome() > 1000) {
...
}

那么当人的年龄不大于30岁时,calcIncome方法将不会被评估?

谢谢!

最佳答案

我自己做了一些测试,这就是我发现的(至少在 6.3 版本中)。

Drools 中特定规则的 RETE 算法的 alpha 子网络始终按顺序进行评估。节点的顺序似乎是约束在它们所属的模式中的顺序。因此,我们可以说存在隐含的短路机制。

顺便说一句,我没有发现逗号“,”或与号“&&”的使用有任何区别。在这两种情况下,Drools 将表达式视为 2 个独立的 alpha 节点。

这就是我所做的:

<小时/>

型号

public class Person {
private int age;
private int salary;
private int bonus;

public Person(int age, int salary, int bonus) {
//set values
}

public int calcIncome() {
throw new IllegalStateException("Expected error here!");
}

//getters
}

请注意我是如何故意在 calcIncome() 中抛出异常的。

<小时/>

规则A

此规则使用“&&”来指示 Person 模式上的 2 个约束之间的 AND 运算。同样,我通过使用逗号而不是 & 符号得到了相同的结果。

DRL

rule "Rule A"
when
$p:Person(age > 30 && calcIncome() > 1000)
then
System.out.println("Rule A");
end

RETE网络

先例规则的 Rete 网络如下所示:

enter image description here

在上图中,我们可以看到 2 个不同的 alpha 节点(黄色)。由于 alpha 节点是按顺序评估的,因此仅评估第二个节点,在本例中,如果我们评估的 Person 年龄超过 30 年。

使用超过 30 年和少于 30 年的 Person 实例进行的测试证实了这一点:超过 30 年的实例从 calcIncome() 抛出异常。

<小时/>

规则B

然后,我很好奇当我们使用 and 或 (||) 运算符而不是 and 时会发生什么。

DRL

rule "Rule B"
when
$p:Person(age > 30 || calcIncome() > 1000)
then
System.out.println("Rule B");
end

RETE网络

有趣的是,此示例的 RETE 网络解析单个 alpha 节点内的 OR 运算符。

enter image description here

无论 Drools 内部使用什么机制(我猜是 MVEL)来解决这个节点,似乎都实现了逻辑短路。我所做的测试表明,仅当使用小于 30 年的 Person 实例时才会引发预期的异常。

<小时/>

最后说明

即使 Drools 在处理单个模式内的约束时似乎会短路,但当规则包含多个模式时,情况就会有所不同。

根据我的测试,单个模式的所有约束都将使用启用短路的算法来解决。这主要依赖于Rete网络中的alpha节点是按顺序评估的。

现在,当处理规则中的多个模式时,无法在编译时预测评估顺序。规则中的每个模式都可以根据特定 Rete 网络如何查找特定情况进行独立评估。

希望对你有帮助

关于drools - '&&' 或 ',' "short-circuit"会在流口水 LHS 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953447/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com