「場所」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)
次のようないくつかの代替案を考えました。各場所に隣接する場所のリストを作成します。などしかし、どれも私にはぴったりではありませんでした。
これを実装する正しい方法はどのようになりますか?