2010-07-29 3 views
0

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

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

(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

Поиск в справочном руководстве по клипам, я наконец нашел функцию «значение-значение-значение», которое, похоже, делает то, что я хочу.

(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")))))