在规则的左侧(LHS)如何解引用一个匹配的事实中的槽?如果一个变量匹配了一个事实,我找不到如何创建进一步的条件来匹配该事实内的槽。
例如,在下面的代码中,如果存在形式为”(do (action ?action))”的事实,我希望打印一些文本。然而,?action本身是一个事实,我只希望当该事实的”name”槽为”run”时触发规则。我该如何实现这一点?
(deftemplate do (slot action) ) (deftemplate action (slot name) ) (defrule find-do "" ?do <- (do (action ?action)) (test (eq ?action.name "run")) ; 这会导致语法错误。 => (printout t "doing " ?action crlf) ) (deffacts startup (do (action (action (name "running")))))
回答:
在Clips参考手册中搜索后,我终于找到了一个名为”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")))))