Drools 规则左侧的函数
Function on left hand side of rule on Drools
考虑以下 "locations" 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 上实现 adjacent() 方法,但它也无法编译:
$r : Location(adjacent($s) == true)
我考虑了一些替代方案,例如:让每个位置都有一个相邻位置的列表;等。但是 none 听起来很适合我。
怎样才是正确的实施方式?
rule danger
when
$s : Location( danger )
$r : Location(! danger, adjacent($s,$r) )
then
modify($r) { setDanger(true) }
end
您可以将布尔表达式编写为约束,或在 eval CE 中编写(但绝不能像您尝试的那样单独作为模式)。
为避免循环,请添加一个在修改后失败的约束。
考虑以下 "locations" 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 上实现 adjacent() 方法,但它也无法编译:
$r : Location(adjacent($s) == true)
我考虑了一些替代方案,例如:让每个位置都有一个相邻位置的列表;等。但是 none 听起来很适合我。
怎样才是正确的实施方式?
rule danger
when
$s : Location( danger )
$r : Location(! danger, adjacent($s,$r) )
then
modify($r) { setDanger(true) }
end
您可以将布尔表达式编写为约束,或在 eval CE 中编写(但绝不能像您尝试的那样单独作为模式)。
为避免循环,请添加一个在修改后失败的约束。