0

考虑“位置” 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(adjacent($s,$r)) 但它不起作用,因为 rete 一直在访问 $s 和 $r 的相同组合。

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

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

我想到了一些替代方案,例如:使每个位置都有一个相邻位置的列表;等等。但它们都不适合我。

如何实现这一点的正确方法?

4

1 回答 1

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

您可以将布尔表达式编写为约束,也可以在 eval CE 中编写(但永远不要像您尝试的那样单独作为模式)。

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

于 2016-04-20T10:23:27.993 回答