Drools规则左侧的功能

时间:2016-04-20 09:50:37

标签: drools first-order-logic

考虑“location”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)

我想到了一些替代方案:让每个位置都有一个相邻位置列表;但是这些都不适合我。

如何以正确的方式实现这一目标?

1 个答案:

答案 0 :(得分:2)

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

你可以把一个布尔表达式写成一个约束,或者在一个eval CE里面(但是从来没有像你所尝试的那样单独作为一个模式)。

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