0

您如何取消引用规则 LHS 中匹配的事实中的插槽?如果变量与事实匹配,我找不到如何创建与该事实中的插槽匹配的进一步条件。

例如,在下面的代码中,如果存在“(do(action ?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")))))
4

1 回答 1

1

通过剪辑参考手册搜索,我终于找到了似乎可以做我想要的功能的“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")))))
于 2010-08-11T21:10:35.253 回答