我想使用声明的类型进行规则验证。我有两种声明的类型:
declare QoS
time : int
end
declare QoSThreshold
time : int
end
如果我写这条规则:
rule "Time"
when
$qosThreshold : QoSThreshold()
$qos : QoS(time < 2 )
then
update($qos);
end
我遇到了预期的问题:
Gap: (Field 'time' from object type 'QoS') Operator = '>=' 2 from rule: [Time]
但是,如果我将规则重写为:
rule "Time"
when
$qosThreshold : QoSThreshold()
$qos : QoS(time < $qosThreshold.time )
then
update($qos);
end
我没有收到任何错误。
你知道为什么吗?
PD:我只是根据我们可以in page 24 of this tutorial或Drools Verifier page
中的代码做一个简单的例子答案 0 :(得分:1)
在第一种情况下,验证会提醒您情况,即没有规则涵盖Qos.time >= 2
的情况,验证者可以从约束中看到常量(2
)。
在第二种情况下,验证者不能发表这样的陈述,因为另一个值是可变的。 可能说可能(甚至是某些)某些值未被覆盖,但Verifier的设计者决定不这样做。
自动验证一组规则是一个非常不确定的问题 - 它可能会告诉您在简单情况下有用的东西。但请注意第二个例子中会发生什么。 (毫无疑问,Verifier按规则运行,您可能会很好地询问Verifier是否能够验证自己,以及它是什么来的。)