0

我意识到标题很疯狂,但它确实是我能想到的最好的。如果有人有更好的建议,请在评论中留下,我会编辑。

这个问题是对这里提出的问题的跟进:Drools Constraint object other than P is found in collection

对于那些不想点击的人,该帖子描述了您想知道是否存在CustomType事实的情况的解决方案,该事实具有包含P以外的值的成员字段。该问题的解决方案结束了如下:

$c: CustomType()
exists Object(this != objectP) from $c.collection

上面的代码效果很好。我的问题是我想知道何时不存在具有此属性的 CustomType 类型的对象。现在,由于第 2 行依赖于第 1 行中给出的绑定变量,我们不能简单地用 not 运算符否定第 1 行。这样做会引发运行时异常。以下是我直观地想要编写代码的方式,但请记住它不起作用:

not $c: CustomType()
exists Object(this != objectP) from $c.collection

我不能简单地否定第 2 行,因为这样规则将要求存在至少一个 CustomType 对象。我想知道第一个代码示例何时不是这种情况。

我内心的流口水告诉我原来的解决方案可能有缺陷。理想情况下,我们希望在 CustomType 的括号()中表示第 2 行。这将更多地表达“有一个带有属性的自定义类型”而不是“有一个自定义类型,并且有一个带有属性的对象”。前者我们可以用 not 运算符否定,但我不确定如何处理后者。

4

1 回答 1

2

当您需要处理诸如这些需要以多行表示的约束以及它们的否定时,我认为您正在进入推理和真相维护的世界:

http://blog.athico.com/2010/01/drools-inference-and-truth-maintenance.html

即你的规则可能是这样的:

rule "Determine presence of non-P objects" when
    $c: CustomType()
    exists Object(this != objectP) from $c.collection
then
    insertLogical( new ContainsNonP($c) );
end

rule "There are some non-P objects" when
    $c: CustomType()
    exists ContainsNonP(customType == $c)
then
    ...
end

rule "There are no non-P objects" when
    $c: CustomType()
    not exists ContainsNonP(customType == $c)
then
    ...
end

请注意,如果第一条规则尚未激活,则上述最终规则可能会激活。如果激活顺序对您的规则很重要,您可能希望定义一些显着性。

于 2013-11-25T12:10:07.610 回答