Drools 流涎尺左侧的功能

Drools 流涎尺左侧的功能,drools,first-order-logic,Drools,First Order Logic,考虑“位置”r和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

考虑“位置”r和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组合

我尝试在位置上实现Nexture()方法,但它也无法编译:

$r : Location(adjacent($s) == true)
我考虑了一些替代方案,比如:让每个位置都有一个相邻位置的列表;但是没有一个听起来适合我

如何正确地实施这一点

rule danger
when
  $s : Location( danger )
  $r : Location(! danger, adjacent($s,$r) )
then
    modify($r) { setDanger(true) }
end
您可以将布尔表达式作为约束编写,也可以在求值中编写(但决不能像您尝试的那样单独编写为模式)

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

您可以将布尔表达式作为约束编写,也可以在求值中编写(但决不能像您尝试的那样单独编写为模式)


为了避免循环,添加一个在修改后失败的约束。

我得到了它。成功了。Tks。不确定我是否理解“添加修改后失败的约束”。添加的约束是“!danger”,它将在danger设置为true后失败。因此,该规则不再被激活。(你写道,“雷特一直访问相同的组合”。)我明白了。成功了。Tks。不确定我是否理解“添加修改后失败的约束”。添加的约束是“!danger”,它将在danger设置为true后失败。因此,该规则不再被激活。(你写道,“rete一直访问相同的组合”。)
rule danger
when
  $s : Location( danger )
  $r : Location(! danger, adjacent($s,$r) )
then
    modify($r) { setDanger(true) }
end