0

私はかなり長い間、これについて壁に頭をぶつけてきましたが、これから説明しようとしていることを達成する方法についての参照は見つかりませんでした. 次のテンプレートに対応するセルのグリッドがあるとします。

(deftemplate cell 
    (slot x)
    (slot y)
    (slot type (allowed-values urban rural lake hill gate border))
)

これで、グリッド内のセルのタイプが(assert (cell (x <x_coord>) (y <y_coord>) (type <some_type>))ステートメントでランダムに生成され、中央のセルを中心に 3x3 の範囲内のすべてのセルを検査し、検査したセルのタイプに応じてアクションを実行する次のルールを定義したいと考えています。

(defrule inspect
    (cell (x ?xval) (y ?yval))
    ; ...
=>
    (loop-for-count (?i -1 1) do
        (loop-for-count (?j -1 1) do
            ; get "type" of cell @ coordinates (- ?x ?i ), (+ ?y ?j)
            ; do stuff according to type (i.e. assert other facts)
        )
    )
)

CLIPS ルールの RHS で特定の基準 (この場合はセルの座標) を指定して、ファクトを調べるにはどうすればよいでしょうか? LHS でパターン マッチングを実行する方法は知っていますが、RHS でも同様に実行できるかどうか知りたいと思っていました。前もって感謝します。

4

1 に答える 1

2

ファクト セット クエリ関数を使用します (基本プログラミング ガイドのセクション 12.9.12)。

CLIPS> 
(deftemplate cell 
   (slot x)
   (slot y)
   (slot type (allowed-values urban rural lake hill gate border)))
CLIPS> 
(deftemplate inspect
   (slot x)
   (slot y))
CLIPS> 
(deffacts example
   (inspect (x 3) (y 3))
   (cell (type urban) (x 1) (y 1))
   (cell (type rural) (x 2) (y 3))
   (cell (type lake) (x 4) (y 4))
   (cell (type border) (x 4) (y 4))
   (cell (type hill) (x 3) (y 5))
   (cell (type gate) (x 3) (y 3)))
CLIPS> 
(defrule inspect
   ; Changed to inspect so the example does
   ; not fire this rule for every cell
   (inspect (x ?xval) (y ?yval))  
   =>
   (do-for-all-facts ((?c cell))
                     (and (<= (- ?xval 1) ?c:x (+ ?xval 1))
                          (<= (- ?yval 1) ?c:y (+ ?yval 1)))
      (printout t ?c:type " " ?c:x " " ?c:y crlf)))
CLIPS> (reset)
CLIPS> (run)
rural 2 3
lake 4 4
border 4 4
gate 3 3
CLIPS>
于 2014-02-02T17:27:48.400 に答える