Разыменование слота в сопоставленном факте в клипах - PullRequest
0 голосов
/ 29 июля 2010

Как вы разыменовываете слот в факте, соответствующем в LHS правила?Если переменная соответствует факту, я не могу найти, как создать дополнительные условия, которые соответствуют слотам в этом факте.

Например, в приведенном ниже коде я хочу напечатать некоторый текст, если есть факт вида "(do (action? Action))".Тем не менее, действие само по себе является фактом, и я хочу, чтобы правило срабатывало только в том случае, если в слоте «имя» этого факта есть «run».Как мне это сделать?

(deftemplate do 
        (slot action) 
) 
(deftemplate action 
        (slot name) 
) 
(defrule find-do "" 
        ?do <- (do (action ?action)) 
        (test (eq ?action.name "run")) ; This causes a syntax error. 
        => 
        (printout t "doing " ?action crlf) 
) 
(deffacts startup (do (action (action (name "running")))))

1 Ответ

1 голос
/ 12 августа 2010

Просматривая справочное руководство по клипам, я наконец-то нашел функцию "fact-slot-value", которая, кажется, выполняет то, что я хочу.

(deftemplate do 
        (slot action) 
) 
(deftemplate action 
        (slot name) 
) 
(defrule find-do "" 
        ?do <- (do (action ?action)) 
        (test (eq (fact-slot-value ?action name) "run"))
        => 
        (printout t "doing " ?action crlf) 
) 
(deffacts startup (do (action (action (name "running")))))
...