在Drools中使用声明的类型进行规则验证时没有错误

时间:2015-11-28 09:35:03

标签: drools

我想使用声明的类型进行规则验证。我有两种声明的类型:

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 tutorialDrools Verifier page

中的代码做一个简单的例子

1 个答案:

答案 0 :(得分:1)

在第一种情况下,验证会提醒您情况,即没有规则涵盖Qos.time >= 2的情况,验证者可以从约束中看到常量(2)。

在第二种情况下,验证者不能发表这样的陈述,因为另一个值是可变的。 可能说可能(甚至是某些)某些值未被覆盖,但Ve​​rifier的设计者决定不这样做。

自动验证一组规则是一个非常不确定的问题 - 它可能会告诉您在简单情况下有用的东西。但请注意第二个例子中会发生什么。 (毫无疑问,Verifier按规则运行,您可能会很好地询问Verifier是否能够验证自己,以及它是什么来的。)