Drools上规则左侧的函数



考虑"位置"r和s的以下规则:

∀r,s[(danger(r)∧adjacent(r,s))→danger(s)] 

我尝试实现如下:

function boolean adjacent(Location l1, Location l2) {
    if (l1.x == l2.x)
        return Math.abs(l1.y - l2.y) == 1;
    if (l1.y == l2.y)
        return Math.abs(l1.x - l2.x) == 1;
    return false;
}
rule danger
when
    $s : Location(danger == true)
    $r : Location()
    adjacent($s,$r)
then
    modify($r) { setDanger(true) }
end;

但它并没有编译说相邻的问题无法解决。我尝试过eval(相邻的($s,$r)),但它不起作用,因为rete永远访问相同的$s和$r组合。

我尝试在Location上实现adjacent()方法,但它也没有编译:

$r : Location(adjacent($s) == true)

我考虑了一些替代方案,比如:让每个位置都有一个相邻位置的列表;等等。但没有一个听起来适合我。

实现这一点的正确方式是什么?

rule danger
when
  $s : Location( danger )
  $r : Location(! danger, adjacent($s,$r) )
then
    modify($r) { setDanger(true) }
end

您可以将布尔表达式作为约束编写,也可以在eval CE中编写(但决不能像您尝试的那样,将其本身作为模式编写)。

若要避免循环,请添加修改后失败的约束。

相关内容

  • 没有找到相关文章

最新更新