Drools 口水总是一样的规则

Drools 口水总是一样的规则,drools,Drools,出于某种原因,drools陷入了一个循环中,始终使用相同的规则和参数($c和$d) 规则删除\u无效的\u地下城 什么时候 $c:Cave() $d:地下城(有效,x$c.maxCoordinateHorizontal | | y$c.maxCoordinateVertical) 然后 Agent.logger.info(“规则触发[”+drools.getRule().getName()+“]-{}”,$d.toString()); 修改($d){setValid(false)}; 修改($c

出于某种原因,drools陷入了一个循环中,始终使用相同的规则和参数($c和$d)

规则删除\u无效的\u地下城
什么时候
$c:Cave()
$d:地下城(有效,x<$c.minCoordinateHorizontal | | x>$c.maxCoordinateHorizontal | | y$c.maxCoordinateVertical)
然后
Agent.logger.info(“规则触发[”+drools.getRule().getName()+“]-{}”,$d.toString());
修改($d){setValid(false)};
修改($c){removeDungeon($d)};
收回(d美元);
结束;
我放置了一个断点,我可以看到在它第一次触发后,即使使用valid==false,它也会继续触发!更糟糕的是,d美元已经被收回

如果我删除modify($c),它就会工作,只触发一次

rule removing_invalid_dungeons
when
    $c : Cave()
    $d : Dungeon(valid, x < $c.minCoordinateHorizontal || x > $c.maxCoordinateHorizontal || y<$c.minCoordinateVertical || y>$c.maxCoordinateVertical)
then
    Agent.logger.info("Rule fired ["+drools.getRule().getName()+"] - {}",$d.toString());
    modify($d) {setValid(false)};
    $c.removeDungeon($d);
    retract($d);    
end;    
规则删除\u无效的\u地下城
什么时候
$c:Cave()
$d:地下城(有效,x<$c.minCoordinateHorizontal | | x>$c.maxCoordinateHorizontal | | y$c.maxCoordinateVertical)
然后
Agent.logger.info(“规则触发[”+drools.getRule().getName()+“]-{}”,$d.toString());
修改($d){setValid(false)};
$c.removeDungeon($d);
收回(d美元);
结束;
我进行了调试,$c.removeDungeon($d)工作正常(它只是从列表中删除了$d)


为什么??有什么线索吗?

我不相信这是全部。如果你收回$d,那么规则就不可能再次开火,除非你周围还有其他地下城。然后它会一直开火直到所有地下城都消失。-提供再现问题的完整代码,即您构造和插入的事实,以及可能触发的其他规则。(是否有创建和插入地下城的规则?)。我不想将我的工作委托给您:-)如何转储工作内存中的所有事实以进行调试?所有规则都有一个logger.info,控制台显示没有其他规则被触发。你能发布一组洞穴和地下城事实的构造和插入来重新创建问题吗?我正在尝试使用较小的规则子集或以更易于共享的方式重现问题。我会追根究底的。如果我找到了我将在这里发布的解决方案,如果没有,我将尝试发布较小子集的完整代码。您还应该有一个约束
$d:Dungeon(…)Cave(Dungeon包含$d)
。也许比地牢在洞穴外的几何约束要好。我不相信这是全部。如果你收回$d,那么规则就不可能再次开火,除非你周围还有其他地下城。然后它会一直开火直到所有地下城都消失。-提供再现问题的完整代码,即您构造和插入的事实,以及可能触发的其他规则。(是否有创建和插入地下城的规则?)。我不想将我的工作委托给您:-)如何转储工作内存中的所有事实以进行调试?所有规则都有一个logger.info,控制台显示没有其他规则被触发。你能发布一组洞穴和地下城事实的构造和插入来重新创建问题吗?我正在尝试使用较小的规则子集或以更易于共享的方式重现问题。我会追根究底的。如果我找到了我将在这里发布的解决方案,如果没有,我将尝试发布较小子集的完整代码。您还应该有一个约束
$d:Dungeon(…)Cave(Dungeon包含$d)
。也许比地下城位于洞穴(边界矩形)外部的几何约束更好。
rule removing_invalid_dungeons
when
    $c : Cave()
    $d : Dungeon(valid, x < $c.minCoordinateHorizontal || x > $c.maxCoordinateHorizontal || y<$c.minCoordinateVertical || y>$c.maxCoordinateVertical)
then
    Agent.logger.info("Rule fired ["+drools.getRule().getName()+"] - {}",$d.toString());
    modify($d) {setValid(false)};
    $c.removeDungeon($d);
    retract($d);    
end;