我有以下代码
(deftemplate choice-evaluation
(slot x_front)
(slot y_left)
(deftemplate es_result
(slot classp)
(slot classr)
(slot nr) )
(defrule MAIN::one
(x_front ?val)
(bind ?temp 1)
(choice-evaluation(y_left -1) (test (<= ?val ?temp ))(class ?x))
?c<-(choice-evaluation(y_left -1) (test(<= ?val ?temp ))(class ?x))
=>
(assert (es_result (classp 0) (classr ?x) (nr 1)))
(retract ?c))
我得到的错误是: ERROR:(defrule MAIN::one (x_front ?val) (choice-evaluation (y_left -1) (test)
我尝试了很多东西,但我总是会得到上面的错误或defrules的语法错误。我不明白如何才能在defrules中与多槽对象进行比较。
我试着创建一个像这里的例子一样的规则。https:/www.csie.ntu.edu.tw~syleecoursesclipsadvpattern.htm。 它们确实有效,但它不适合我的特殊情况。
在你的代码中存在几个错误,如果你识别代码,就会更容易看到。
(defrule MAIN::one
(x_front ?val)
(bind ?temp 1)
(choice-evaluation (y_left -1)
(test (<= ?val ?temp))
(class ?x))
?c <- (choice-evaluation (y_left -1)
(test (<= ?val ?temp))
(class ?x))
=>
(assert (es_result (classp 0) (classr ?x) (nr 1)))
(retract ?c))
你把测试条件元素放在了选择-评价条件元素里面 所以解析器把测试符号当作槽名来处理 由于选择-评价deftemplate没有名为test的槽,所以你会得到一个错误。你使用class作为槽名也会得到一个错误,因为这个槽在choice-evaluation deftemplate中也没有定义。
另外,(bind ?temp 1)将被视为一个事实模式,而不是一个函数调用。如果你想在规则的条件中检索一个值,可以断言一个包含该值的事实,并使用类似规则中的x_front模式将其赋值给一个变量。重复选择-评价模式没有任何意义--只需保留第二种模式,因为它将事实-地址绑定到与该模式相匹配的模式上,而这个模式是规则的操作中的retract命令所需要的。
@Gary Riley 谢谢你的意见,帮了大忙!原来是这样的。
(choice-evaluation (x_front ?val) (y_left -1) (class ?x))
(test (<= ?val 1 ))
?c <- (choice-evaluation (x_front ?val) (y_left -1) (class ?x))
=>
(assert (es_result (classp 0) (classr ?x) (nr 1)))
(retract ?c))
原来这就是它应该被使用的方式。把它留在这里,以防将来有人遇到类似的问题credits 。I. Xatziligeroudis